Browse Source

更新

rate_recharge_consume_refund_donghaolin
donghaolin 5 months ago
parent
commit
26df1c8ffc
  1. 2
      vue/gold-system/demo/.gitattributes
  2. 33
      vue/gold-system/demo/.gitignore
  3. 19
      vue/gold-system/demo/.mvn/wrapper/maven-wrapper.properties
  4. 2
      vue/gold-system/demo/commons/.gitattributes
  5. 33
      vue/gold-system/demo/commons/.gitignore
  6. 19
      vue/gold-system/demo/commons/.mvn/wrapper/maven-wrapper.properties
  7. 259
      vue/gold-system/demo/commons/mvnw
  8. 149
      vue/gold-system/demo/commons/mvnw.cmd
  9. 75
      vue/gold-system/demo/commons/pom.xml
  10. 13
      vue/gold-system/demo/commons/src/test/java/com/example/commons/CommonsApplicationTests.java
  11. 259
      vue/gold-system/demo/mvnw
  12. 149
      vue/gold-system/demo/mvnw.cmd
  13. 98
      vue/gold-system/demo/pom.xml
  14. 2
      vue/gold-system/demo/recharge/.gitattributes
  15. 33
      vue/gold-system/demo/recharge/.gitignore
  16. 19
      vue/gold-system/demo/recharge/.mvn/wrapper/maven-wrapper.properties
  17. 259
      vue/gold-system/demo/recharge/mvnw
  18. 149
      vue/gold-system/demo/recharge/mvnw.cmd
  19. 80
      vue/gold-system/demo/recharge/pom.xml
  20. 13
      vue/gold-system/demo/recharge/src/main/java/com/example/recharge/RechargeApplication.java
  21. 15
      vue/gold-system/demo/recharge/src/main/resources/application.yml
  22. 13
      vue/gold-system/demo/recharge/src/test/java/com/example/recharge/RechargeApplicationTests.java
  23. 26
      vue/gold-system/src/assets/css/common.css
  24. 543
      vue/gold-system/src/views/audit/rechargeAudit.vue
  25. 537
      vue/gold-system/src/views/audit/refundAudit.vue
  26. 371
      vue/gold-system/src/views/consume/addConsume.vue
  27. 424
      vue/gold-system/src/views/managerecharge/activity.vue
  28. 399
      vue/gold-system/src/views/recharge/allRecharge.vue
  29. 324
      vue/gold-system/src/views/refund/addRefund.vue
  30. 207
      vue/gold-system/src/views/usergold/index.vue
  31. 338
      vue/gold-system/src/views/workspace/index.vue
  32. 0
      vue/gold-system/vue/gold-system/.gitignore
  33. 0
      vue/gold-system/vue/gold-system/.vscode/extensions.json
  34. 0
      vue/gold-system/vue/gold-system/README.md
  35. 0
      vue/gold-system/vue/gold-system/index.html
  36. 0
      vue/gold-system/vue/gold-system/package-lock.json
  37. 5
      vue/gold-system/vue/gold-system/package.json
  38. 0
      vue/gold-system/vue/gold-system/public/vite.svg
  39. 0
      vue/gold-system/vue/gold-system/src/App.vue
  40. 9
      vue/gold-system/vue/gold-system/src/api/index.js
  41. BIN
      vue/gold-system/vue/gold-system/src/assets/background.jpg
  42. 72
      vue/gold-system/vue/gold-system/src/assets/css/common.css
  43. 0
      vue/gold-system/vue/gold-system/src/assets/vue.svg
  44. BIN
      vue/gold-system/vue/gold-system/src/assets/动漫美女.png
  45. 0
      vue/gold-system/vue/gold-system/src/assets/金币管理系统logo.png
  46. BIN
      vue/gold-system/vue/gold-system/src/assets/韩信.png
  47. 0
      vue/gold-system/vue/gold-system/src/main.ts
  48. 14
      vue/gold-system/vue/gold-system/src/router/index.js
  49. 0
      vue/gold-system/vue/gold-system/src/style.css
  50. 42
      vue/gold-system/vue/gold-system/src/util/http.js
  51. 719
      vue/gold-system/vue/gold-system/src/views/audit/rechargeAudit.vue
  52. 692
      vue/gold-system/vue/gold-system/src/views/audit/refundAudit.vue
  53. 430
      vue/gold-system/vue/gold-system/src/views/consume/addConsume.vue
  54. 48
      vue/gold-system/vue/gold-system/src/views/consume/allConsume.vue
  55. 88
      vue/gold-system/vue/gold-system/src/views/index.vue
  56. 126
      vue/gold-system/vue/gold-system/src/views/login.vue
  57. 523
      vue/gold-system/vue/gold-system/src/views/managerecharge/activity.vue
  58. 117
      vue/gold-system/vue/gold-system/src/views/managerecharge/rate.vue
  59. 213
      vue/gold-system/vue/gold-system/src/views/recharge/addRecharge.vue
  60. 41
      vue/gold-system/vue/gold-system/src/views/recharge/adminRecharge.vue
  61. 452
      vue/gold-system/vue/gold-system/src/views/recharge/allRecharge.vue
  62. 463
      vue/gold-system/vue/gold-system/src/views/refund/addRefund.vue
  63. 117
      vue/gold-system/vue/gold-system/src/views/refund/allRefund.vue
  64. 359
      vue/gold-system/vue/gold-system/src/views/usergold/index.vue
  65. 1131
      vue/gold-system/vue/gold-system/src/views/workspace/index.vue
  66. 107
      vue/gold-system/vue/gold-system/src/views/z.vue
  67. 0
      vue/gold-system/vue/gold-system/src/vite-env.d.ts
  68. 0
      vue/gold-system/vue/gold-system/tsconfig.app.json
  69. 0
      vue/gold-system/vue/gold-system/tsconfig.json
  70. 0
      vue/gold-system/vue/gold-system/tsconfig.node.json
  71. 1
      vue/gold-system/vue/gold-system/vite.config.ts

2
vue/gold-system/demo/.gitattributes

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
vue/gold-system/demo/.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/

19
vue/gold-system/demo/.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

2
vue/gold-system/demo/commons/.gitattributes

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
vue/gold-system/demo/commons/.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/

19
vue/gold-system/demo/commons/.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

259
vue/gold-system/demo/commons/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-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -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 "$@"

149
vue/gold-system/demo/commons/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-<version>,maven-mvnd-<version>-<platform>}/<hash>
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"

75
vue/gold-system/demo/commons/pom.xml

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>commons</artifactId>
<version>0.0.1</version>
<name>commons</name>
<description>commons</description>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

13
vue/gold-system/demo/commons/src/test/java/com/example/commons/CommonsApplicationTests.java

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

259
vue/gold-system/demo/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-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -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 "$@"

149
vue/gold-system/demo/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-<version>,maven-mvnd-<version>-<platform>}/<hash>
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"

98
vue/gold-system/demo/pom.xml

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1</version>
<name>demo</name>
<description>demo</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.6</version>
</parent>
<packaging>pom</packaging>
<modules>
<module>recharge</module>
<module>commons</module>
</modules>
<properties>
<java.version>21</java.version>
<spring-boot.version>3.3.6</spring-boot.version>
<dubbo.version>3.3.0-beta.2</dubbo.version>
<seata.version>2.0.0</seata.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.6</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

2
vue/gold-system/demo/recharge/.gitattributes

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
vue/gold-system/demo/recharge/.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/

19
vue/gold-system/demo/recharge/.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

259
vue/gold-system/demo/recharge/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-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -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 "$@"

149
vue/gold-system/demo/recharge/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-<version>,maven-mvnd-<version>-<platform>}/<hash>
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"

80
vue/gold-system/demo/recharge/pom.xml

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>recharge</artifactId>
<version>0.0.1</version>
<name>recharge</name>
<description>recharge</description>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1</version>
</parent>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>commons</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

13
vue/gold-system/demo/recharge/src/main/java/com/example/recharge/RechargeApplication.java

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

15
vue/gold-system/demo/recharge/src/main/resources/application.yml

@ -0,0 +1,15 @@
server:
port: 10010
spring:
datasource:
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: recharge
mybatis:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

13
vue/gold-system/demo/recharge/src/test/java/com/example/recharge/RechargeApplicationTests.java

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

26
vue/gold-system/src/assets/css/common.css

@ -1,26 +0,0 @@
.green-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
background-color: green;
}
.red-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
background-color: red;
}
.grey-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
background-color: grey;
}

543
vue/gold-system/src/views/audit/rechargeAudit.vue

@ -1,543 +0,0 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from 'element-plus'
import { AiFillRead } from "vue-icons-plus/ai";
import axios from 'axios';
import moment from 'moment';
//
//
const tableData = ref([]);
// ======================================
// rechargeVo
const rechargeVo = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
// ======================================
//
const rejectVisible = ref(false);
//
const rejectObj = ref({});
//
const passObj = ref({});
//
const activeName = ref('all')
//
const payWay = [
{
value: '微信',
label: '微信',
},
{
value: '支付宝',
label: '支付宝',
},
{
value: '银联',
label: '银联',
},
{
value: '信用卡',
label: '信用卡',
},
{
value: '借记卡',
label: '借记卡',
},
]
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 2) * 60 + 'px';
});
// ref
const Ref = ref(null);
//
// ==============================================================
//
const get = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
}
console.log('搜索参数', getObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
//
console.log('请求成功', result);
//
tableData.value = result.data.data.list;
console.log('tableData', tableData.value);
//
total.value = result.data.data.total;
console.log('total', total.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const reset = function () {
rechargeVo.value.activityId = '';
rechargeVo.value.payWay = '';
rechargeVo.value.area = '';
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
get();
}
//
const getToday = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
const endDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6);
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const adminAll = function () {
console.log('adminAll');
rechargeVo.value.status = '';
get();
}
//
const adminWait = function () {
rechargeVo.value.status = 0;
get();
console.log('adminWait');
}
//
const adminPass = function () {
rechargeVo.value.status = 1;
get();
console.log('adminPass');
}
//
const handleClick = function (tab, event) {
if (tab.props.name === 'all') {
adminAll();
} else if (tab.props.name === 'wait') {
adminWait();
} else if (tab.props.name === 'pass') {
adminPass();
}
}
//
const getActivity = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', {});
//
console.log('请求成功', result);
//
activity.value = result.data.data;
console.log('activity', activity.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const getArea = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {});
//
console.log('请求成功', result);
//
allData.value = result.data.data;
console.log('allData', allData.value);
//
area.value = [...new Set(allData.value.map(item => item.area))]
console.log('地区', area.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize));
if ((getObj.value.pageNum > 0) && (getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize))) {
console.log('输入的数字合法');
get();
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
}
// ====================================
//
const pass = function (row) {
//
passObj.value.auditId = row.rechargeId;
passObj.value.status = 1;
console.log('通过对象', passObj.value);
}
//
const passConfirm = async function () {
try {
console.log('通过对象', passObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10030/audit/audit/edit', passObj.value);
//
console.log('请求成功', result);
//
get();
//
ElMessage({
type: 'success',
message: '通过成功!',
})
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const openRejectVisible = function () {
rejectVisible.value = true;
}
//
const closeRejectVisible = function () {
rejectVisible.value = false;
}
//
const reject = function (row) {
//
rejectObj.value.auditId = row.rechargeId;
rejectObj.value.status = 2;
rejectObj.value.reson = '';
console.log('驳回对象', rejectObj.value);
openRejectVisible();
}
//
const rejectConfirm = async function () {
Ref.value.validate(async (valid) => {
if (valid) {
try {
console.log('驳回对象', rejectObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10030/audit/audit/edit', rejectObj.value);
//
console.log('请求成功', result);
//
get();
//
closeRejectVisible();
//
ElMessage({
type: 'success',
message: '驳回成功!',
})
} catch (error) {
console.log('请求失败', error);
//
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
})
}
//
const rules = reactive({
reson: [{ required: true, message: '请输入驳回理由', trigger: 'blur' },],
})
//
onMounted(async function () {
await get();
getActivity();
await getArea();
})
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px;">
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large"
style="width: 240px">
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large"
style="width: 240px">
<el-option v-for="item in payWay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large"
style="width: 240px">
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" />
<el-button style="margin-left: 10px;" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
</el-tabs>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="username" label="姓名" width="100px" />
<el-table-column prop="homilyId" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="activityName" label="活动名称" width="150px" />
<el-table-column prop="rechargeGold" label="充值金额" width="100px" />
<el-table-column prop="rechargeWay" label="充值方式" width="100px" />
<el-table-column prop="paidGold" label="充值金币" width="100px" />
<el-table-column prop="freeGold" label="免费金币" width="100px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column prop="rechargeVoucher" label="支付凭证" width="150px">
<template #default="scope">
<el-image :src="scope.row.rechargeVoucher" alt="凭证" style="width: 50px; height: 50px" />
</template>
</el-table-column>
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="状态" width="100px">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column prop="reson" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" label="交款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="提交时间" width="200px" />
<el-table-column fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="passConfirm">
<template #reference>
<el-button :disabled='((scope.row.status === 1 )||(scope.row.status === 2)) ? true : false'
type="primary" text @click="pass(scope.row)">
通过
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
</el-button>
</template>
</el-popconfirm>
<el-button :disabled='((scope.row.status === 1 )||(scope.row.status === 2)) ? true : false' type="primary" text
@click="reject(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
<div>{{ total }},每页 </div>
<el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
<el-option v-for="item in [5, 6, 7, 8, 9, 10]" :key="item" :label="item"
:value="item"></el-option>
</el-select>
<div> </div>
</el-pagination>
<el-pagination background layout="prev, pager, next,slot" :page-size="getObj.pageSize"
:total="total" :current-page="getObj.pageNum" @current-change="get">
<div>跳至</div>
<el-input v-model="getObj.pageNum" style="width: 40px;" @change="checkNumber" />
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<!-- 驳回弹出框 -->
<el-dialog v-model="rejectVisible" title="驳回理由" width="500" :before-close="closeRejectVisible">
<template #footer>
<el-form :model="rejectObj" ref="Ref" :rules="rules" label-width="auto" style="max-width: 600px">
<el-form-item prop="reson" label="驳回理由:">
<el-input v-model="rejectObj.reson" maxlength="150" show-word-limit style="width: 350px"
type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeRejectVisible()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()">
确定
</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.operation {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

537
vue/gold-system/src/views/audit/refundAudit.vue

@ -1,537 +0,0 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from 'element-plus'
import { AiFillRead } from "vue-icons-plus/ai";
import axios from 'axios';
import moment from 'moment';
//
//
const tableData = ref([]);
// ======================================
// rechargeVo
const rechargeVo = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
// ======================================
//
const rejectVisible = ref(false);
//
const rejectObj = ref({});
//
const passObj = ref({});
//
const activeName = ref('all')
//
const payWay = [
{
value: '微信',
label: '微信',
},
{
value: '支付宝',
label: '支付宝',
},
{
value: '银联',
label: '银联',
},
{
value: '信用卡',
label: '信用卡',
},
{
value: '借记卡',
label: '借记卡',
},
]
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 2) * 60 + 'px';
});
// ref
const Ref = ref(null);
//
// ==============================================================
//
const get = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
}
console.log('搜索参数', getObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10030/audit/audit/refund', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
//
console.log('请求成功', result);
//
tableData.value = result.data.data.list;
console.log('tableData', tableData.value);
//
total.value = result.data.data.total;
console.log('total', total.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const reset = function () {
rechargeVo.value.activityId = '';
rechargeVo.value.payWay = '';
rechargeVo.value.area = '';
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
get();
}
//
const getToday = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
const endDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6);
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const adminAll = function () {
console.log('adminAll');
rechargeVo.value.status = '';
get();
}
//
const adminWait = function () {
rechargeVo.value.status = 0;
get();
console.log('adminWait');
}
//
const adminPass = function () {
rechargeVo.value.status = 1;
get();
console.log('adminPass');
}
//
const handleClick = function (tab, event) {
if (tab.props.name === 'all') {
adminAll();
} else if (tab.props.name === 'wait') {
adminWait();
} else if (tab.props.name === 'pass') {
adminPass();
}
}
//
const getActivity = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', {});
//
console.log('请求成功', result);
//
activity.value = result.data.data;
console.log('activity', activity.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const getArea = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {});
//
console.log('请求成功', result);
//
allData.value = result.data.data;
console.log('allData', allData.value);
//
area.value = [...new Set(allData.value.map(item => item.area))]
console.log('地区', area.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize));
if ((getObj.value.pageNum > 0) && (getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize))) {
console.log('输入的数字合法');
get();
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
}
// ====================================
//
const pass = function (row) {
//
passObj.value.auditId = row.rechargeId;
passObj.value.status = 1;
console.log('通过对象', passObj.value);
}
//
const passConfirm = async function () {
try {
console.log('通过对象', passObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10030/audit/audit/edit', passObj.value);
//
console.log('请求成功', result);
//
get();
//
ElMessage({
type: 'success',
message: '通过成功!',
})
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const openRejectVisible = function () {
rejectVisible.value = true;
}
//
const closeRejectVisible = function () {
rejectVisible.value = false;
}
//
const reject = function (row) {
//
rejectObj.value.auditId = row.rechargeId;
rejectObj.value.status = 2;
rejectObj.value.reson = '';
console.log('驳回对象', rejectObj.value);
openRejectVisible();
}
//
const rejectConfirm = async function () {
Ref.value.validate(async (valid) => {
if (valid) {
try {
console.log('驳回对象', rejectObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10030/audit/audit/edit', rejectObj.value);
//
console.log('请求成功', result);
//
get();
//
closeRejectVisible();
//
ElMessage({
type: 'success',
message: '驳回成功!',
})
} catch (error) {
console.log('请求失败', error);
//
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
})
}
//
const rules = reactive({
reson: [{ required: true, message: '请输入驳回理由', trigger: 'blur' },],
})
//
onMounted(async function () {
await get();
getActivity();
await getArea();
})
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px;">
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large"
style="width: 240px">
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large"
style="width: 240px">
<el-option v-for="item in payWay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large"
style="width: 240px">
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" />
<el-button style="margin-left: 10px;" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
</el-tabs>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="name" label="姓名" width="100px" />
<el-table-column prop="homilyId" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="refundType" label="退款类型" width="150px" />
<el-table-column prop="goods" label="退款商品" width="100px" />
<el-table-column prop="refundCoin" label="退款金币数" width="100px" >
<template #default="scope">
<span>{{ scope.row.rechargeCoin+scope.row.freeCoin+scope.row.taskCoin }}</span>
</template>
</el-table-column>
<el-table-column prop="rechargeCoin" label="充值金币" width="100px" />
<el-table-column prop="freeCoin" label="免费金币" width="100px" />
<el-table-column prop="taskCoin" label="任务金币" width="100px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="status" label="审核状态" width="100px">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column prop="reson" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="createTime" label="提交时间" width="200px" />
<el-table-column fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="passConfirm">
<template #reference>
<el-button :disabled='((scope.row.status === 1 )||(scope.row.status === 2)) ? true : false'
type="primary" text @click="pass(scope.row)">
通过
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
</el-button>
</template>
</el-popconfirm>
<el-button :disabled='((scope.row.status === 1 )||(scope.row.status === 2)) ? true : false' type="primary" text
@click="reject(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
<div>{{ total }},每页 </div>
<el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
<el-option v-for="item in [5, 6, 7, 8, 9, 10]" :key="item" :label="item"
:value="item"></el-option>
</el-select>
<div> </div>
</el-pagination>
<el-pagination background layout="prev, pager, next,slot" :page-size="getObj.pageSize"
:total="total" :current-page="getObj.pageNum" @current-change="get">
<div>跳至</div>
<el-input v-model="getObj.pageNum" style="width: 40px;" @change="checkNumber" />
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<!-- 驳回弹出框 -->
<el-dialog v-model="rejectVisible" title="驳回理由" width="500" :before-close="closeRejectVisible">
<template #footer>
<el-form :model="rejectObj" ref="Ref" :rules="rules" label-width="auto" style="max-width: 600px">
<el-form-item prop="reson" label="驳回理由:">
<el-input v-model="rejectObj.reson" maxlength="150" show-word-limit style="width: 350px"
type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeRejectVisible()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()">
确定
</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.operation {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

371
vue/gold-system/src/views/consume/addConsume.vue

@ -1,371 +0,0 @@
<script setup>
import { reactive } from "vue";
import { ref, computed, watch } from "vue";
import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import axios from "axios";
import { ElMessageBox } from "element-plus";
//
const addConsume = ref({});
//
const add = async function () {
try {
// POST
const result = await axios.post(
"http://192.168.8.93:10010/recharge/recharge/add",
addConsume.value
);
//
console.log("请求成功", result);
//
console.log("用户信息", user.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
const addBefore = () => {
Ref.value.validate(async (valid) => {
if (valid) {
ElMessageBox.confirm("确认添加?")
.then(() => {
add();
console.log("添加成功");
imageUrl.value = "";
addConsume.value = {};
})
.catch(() => {
console.log("取消添加");
});
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
//
//
const Ref = ref(null);
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("付款时间不能小于当前时间"));
}
};
const rules = reactive({
jwcode: [{ required: true, message: "请输入精网号", trigger: "blur" }],
refundGoods: [{ required: true, message: "请选择退款商品", trigger: "blur" }],
taskCoin: [{ required: true, message: "请输入任务金币", trigger: "blur" }],
freeCoin: [{ required: true, message: "请输入免费金币", trigger: "blur" }],
rechargeCoin: [
{ required: true, message: "请输入免费金币", trigger: "blur" },
],
allGold: [{ required: true, message: "请输入消费金币总数", trigger: "blur" }],
});
//
const user = ref({});
const getUser = async function (jwcode) {
try {
// POST
const result = await axios.post("http://192.168.8.93:10020/recharge/user", {
jwcode: jwcode,
});
//
console.log("请求成功", result);
//
user.value = result.data.data[0];
console.log("用户信息", user.value);
if (result.data.code === 0) {
ElMessage.error(result.data.msg);
} else {
ElMessage.success(result.data.msg);
}
} catch (error) {
console.log("请求失败", error);
ElMessage.error("查询失败,请检查精网号是否正确");
//
}
};
//
const activity = ref([]);
const getActivity = async function () {
try {
// POST
const result = await axios.post(
"http://192.168.8.93:10010/recharge/activity/select",
{}
);
//
console.log("请求成功", result);
//
activity.value = result.data.data;
console.log("活动信息", activity.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
getActivity();
//
const currency = ref([]);
const getCurrency = async function () {
try {
// POST
const result = await axios.post(
"http://192.168.8.174:10010/rates/search",
{}
);
//
console.log("货币请求成功", result);
//
currency.value = result.data.data;
console.log("tableData", currency.value);
// UI
} catch (error) {
console.log("请求失败", error);
//
}
};
getCurrency();
//
const imageUrl = ref("");
//
const handleAvatarSuccess = (response, uploadFile) => {
imageUrl.value = URL.createObjectURL(uploadFile.raw);
console.log("图片上传成功", response, uploadFile);
addConsume.value.rechargeVoucher =
"http://192.168.8.93:10010/upload/" + response.data;
console.log("图片名称", addConsume.value.rechargeVoucher);
};
//
const beforeAvatarUpload = (rawFile) => {
if (rawFile.type !== "image/jpeg") {
ElMessage.error("Avatar picture must be JPG format!");
return false;
} else if (rawFile.size / 1024 / 1024 > 2) {
ElMessage.error("Avatar picture size can not exceed 2MB!");
return false;
}
return true;
};
//
const options = [
{
value: "现金充值",
label: "现金充值",
},
{
value: "龙鳞卡",
label: "龙鳞卡",
},
{
value: "弘粉卡",
label: "弘粉卡",
},
];
const calculatedFreeGold = computed(() => {
return addConsume.value.paidGold * addConsume.value.activityId;
});
watch(calculatedFreeGold, (newVal) => {
addConsume.value.freeGold = newVal;
});
</script>
<template>
<div style="margin-bottom: 20px">新增消费</div>
<el-form
:model="addConsume"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
>
<el-form-item prop="jwcode" label="精网号">
<el-input v-model="addConsume.jwcode" style="width: 220px" />
<el-button
type="primary"
@click="getUser(addConsume.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
<el-form-item prop="goods" label="商品名称">
<el-select
v-model="addConsume.goods"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in activity"
:key="item.value"
:label="item.activityName"
:value="item.rechargeRatio"
/>
</el-select>
</el-form-item>
<el-form-item prop="allGold" label="消费金币总数">
<el-input v-model="addConsume.paidGold" style="width: 100px" />
</el-form-item>
<el-form-item prop="taskCoin" label="任务金币" style="float: left">
<el-input
disabled
v-model="addConsume.taskCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</el-form-item>
<el-form-item
prop="freeCoin"
label="免费金币"
style="float: left; margin-left: -10px; margin-right: -10px"
>
<el-input
disabled
v-model="addConsume.freeCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</el-form-item>
<el-form-item
prop="rechargeCoin"
label="充值金币"
style="margin-left: -20px"
>
<el-input
disabled
v-model="addConsume.rechargeCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 20px"></p>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addConsume.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-form-item prop="commitName" label="提交人">
<el-input
style="width: 300px"
value="张三"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
</el-form>
<el-button @click="closeAddActivityVisible" style="margin-left: 280px"
>取消</el-button
>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
<!-- 客户信息栏 -->
<el-card
style="width: 700px; float: right; margin-top: -330px; margin-right: 100px"
>
<el-form
:model="user"
label-width="auto"
style="max-width: 600px"
label-position="left"
>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<el-row style="margin-top: 20px">
<el-col :span="12">
<el-form-item label="姓名:">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="历史金币总数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前金币总数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="首次充值日期"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="充值次数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责客服"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消费次数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属门店"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="待审核"> </el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</template>
<style scoped>
p {
margin: 0px;
}
.el-form-item {
margin-left: 50px;
}
/* 上传图片的格式 */
.avatar-uploader .avatar {
width: 50px;
height: 50px;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 50px;
height: 50px;
text-align: center;
}
</style>

424
vue/gold-system/src/views/managerecharge/activity.vue

@ -1,424 +0,0 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios';
import moment from 'moment';
//
//
const admin = ref({
adminId: 1,
name: '客服A',
area: '新加坡'
})
//
const tableData = ref([]);
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
})
//
const addObj = ref({
add: '',
})
//
//
const delObj = ref({});
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 1) * 50 + 'px';
});
// ref
const Ref = ref(null);
//
//
const get = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
activity.value.startDate = getTime.value[0];
activity.value.endDate = getTime.value[1];
}
} else {
activity.value.startDate = '';
activity.value.endDate = '';
}
console.log('搜索参数', getObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', { ...getObj.value, activity: { ...activity.value } });
//
console.log('请求成功', result);
//
tableData.value = result.data.data.list;
console.log('tableData', tableData.value);
//
total.value = result.data.data.total;
console.log('total', total.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const reset = function () {
getObj.value = {};
getObj.value.pageNum = 1;
getObj.value.pageSize = 5;
getTime.value = {};
activity.value = {};
get();
}
//
const addActivityVisible = ref(false)
//
const openAddActivityVisible = function () {
addActivityVisible.value = true
}
//
const closeAddActivityVisible = function () {
addActivityVisible.value = false
}
//
const addActicity = function () {
//
addObj.value = {};
addObj.value.adminId = admin.value.adminId;
addObj.value.adminName = admin.value.name;
addObj.value.dept = admin.value.area;
addObj.value.freeGold = '0';
addObj.value.rechargeRatio = 0;
addObj.value.startTime = null;
addObj.value.endTime = null;
openAddActivityVisible();
}
//
const add = async function () {
Ref.value.validate(async (valid) => {
if (valid) {
try {
console.log('添加对象', addObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/add', addObj.value);
//
console.log('请求成功', result);
//
get();
//
closeAddActivityVisible();
//
ElMessage({
type: 'success',
message: '活动添加成功!',
})
} catch (error) {
console.log('请求失败', error);
//
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
})
}
// =========================================================
//
const del = function (row) {
delObj.value.activityId = row.activityId;
console.log('delObj', delObj.value);
}
//
const delConfirm = async function () {
try {
console.log('delObj', delObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/edit', delObj.value);
//
console.log('请求成功', result);
//
get();
} catch (error) {
console.log('请求失败', error);
//
}
}
//
//
const handleStartTimeChange = () => {
Ref.value.validateField('endTime');
};
const checkFreeGoldRadio = function (rule, value, callback) {
if (addObj.value.freeGold == 1) {
if (value == '0' || value == null || value == '') {
callback(new Error('请输入免费金币兑换比'))
}else if(value<0||typeof value!='number') {
callback(new Error('请输入正确的格式'));
}
} else {
callback()
}
}
const checkStartTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error('开始时间不能小于当前时间'))
} else {
callback()
}
}
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error('结束时间不能小于当前时间'))
} else if (value <= addObj.value.startTime) {
callback(new Error('结束时间不能小于开始时间'))
} else {
callback()
}
}
const rules = reactive({
activityName: [{ required: true, message: '请输入活动名称', trigger: 'blur' },],
freeGold: [{ required: true, message: '请选择是否赠送免费金币', trigger: 'blur' },],
rechargeRatio: [{ validator: checkFreeGoldRadio, trigger: 'blur' },],
startTime: [
{ required: true, message: '请选择开始时间', trigger: 'blur' },
{ validator: checkStartTime, trigger: 'blur' },
],
endTime: [
{ required: true, message: '请选择结束时间', trigger: 'blur' },
{ validator: checkEndTime, trigger: 'blur' },
],
})
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize));
if ((getObj.value.pageNum > 0) && (getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize))) {
console.log('输入的数字合法');
get();
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
}
//
onMounted(async function () {
get();
})
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-input v-model="activity.activityName" style="width: 240px" placeholder="请输入活动名称"
clearable />
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">添加时间</el-text>
<el-date-picker v-model="getTime" type="daterange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" />
</div>
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
<el-button plain @click="addActicity()"
style="color: #048EFB; border:1px solid #048EFB">新增活动</el-button>
</div>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="activityName" label="活动名称" />
<el-table-column prop="startTime" label="开始时间" />
<el-table-column prop="endTime" label="结束时间" />
<el-table-column prop="rechargeRatio" label="免费兑换比">
<template #default="scope">
<span>{{ scope.row.rechargeRatio }}:1</span>
</template>
</el-table-column>
<el-table-column prop="status" label="状态">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>进行中</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="red-dot"></span>
<span>未开始</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="grey-dot"></span>
<span>已结束</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column prop="name" label="添加人" />
<el-table-column prop="createTime" label="添加时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="operation" label="操作">
<template #default="scope">
<el-popconfirm title="确定将此条活动删除吗?" @confirm="delConfirm">
<template #reference>
<el-button type="primary" text @click="del(scope.row)">
删除
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
<div>{{ total }},每页 </div>
<el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
<el-option v-for="item in [5, 6, 7, 8, 9, 10]" :key="item" :label="item"
:value="item"></el-option>
</el-select>
<div> </div>
</el-pagination>
<el-pagination background layout="prev, pager, next, slot" :page-size="getObj.pageSize"
:total="total" :current-page="getObj.pageNum" @current-change="get">
<div>跳至</div>
<el-input v-model="getObj.pageNum" style="width: 40px;" @change="checkNumber" />
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog v-model="addActivityVisible" title="新增活动" width="500" :before-close="closeAddActivityVisible">
<template #footer>
<el-form :model="addObj" ref="Ref" :rules="rules" label-width="auto" style="max-width: 600px">
<el-form-item prop="activityName" label="活动名称:">
<el-input v-model="addObj.activityName" placeholder="请输入活动名称" style="width: 220px;" />
</el-form-item>
<el-form-item prop="freeGold" label="免费金币:">
<el-radio-group v-model="addObj.freeGold">
<el-radio value="0" @change="addObj.rechargeRatio = '0'">无赠送</el-radio>
<el-radio value="1">有赠送</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="rechargeRatio" label="免费金币兑换比:">
<el-input v-model="addObj.rechargeRatio" :disabled="addObj.freeGold === '0' ? true : false"
placeholder="请输入" style="width: 80px;" />1
<div style="color: grey;">(提示当前规则每10新币可兑换1免费金币)</div>
</el-form-item>
<el-form-item prop="startTime" label="开始时间:">
<el-date-picker v-model="addObj.startTime" type="date" placeholder="请选择开始时间"
@change="handleStartTimeChange" />
</el-form-item>
<el-form-item prop="endTime" label="结束时间:">
<el-date-picker v-model="addObj.endTime" type="date" placeholder="请选择结束时间" />
</el-form-item>
<el-form-item prop="adminName" label="添加人:">
<el-input v-model="addObj.adminName" disabled style="width: 220px;" />
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeAddActivityVisible">取消</el-button>
<el-button type="primary" @click="add()">
提交
</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

399
vue/gold-system/src/views/recharge/allRecharge.vue

@ -1,399 +0,0 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from 'element-plus'
import { AiFillRead } from "vue-icons-plus/ai";
import axios from 'axios';
import moment from 'moment';
//
//
const tableData = ref([]);
// ======================================
// rechargeVo
const rechargeVo = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
//
const activeName = ref('all')
//
const payWay = [
{
value: '微信',
label: '微信',
},
{
value: '支付宝',
label: '支付宝',
},
{
value: '银联',
label: '银联',
},
{
value: '信用卡',
label: '信用卡',
},
{
value: '借记卡',
label: '借记卡',
},
]
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 2) * 60 + 'px';
});
//
// ==============================================================
//
const get = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
}
console.log('搜索参数', getObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
//
console.log('请求成功', result);
//
tableData.value = result.data.data.list;
console.log('tableData', tableData.value);
//
total.value = result.data.data.total;
console.log('total', total.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const reset = function () {
rechargeVo.value.activityId = '';
rechargeVo.value.payWay = '';
rechargeVo.value.area = '';
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
get();
}
//
const getToday = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
const endDate = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6);
const endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
getTime.value = [startDate, endDate];
console.log('getTime', getTime.value);
get();
}
//
const adminAll = function () {
console.log('adminAll');
rechargeVo.value.status = '';
get();
}
//
const adminWait = function () {
rechargeVo.value.status = 0;
get();
console.log('adminWait');
}
//
const adminPass = function () {
rechargeVo.value.status = 1;
get();
console.log('adminPass');
}
//
const adminReject = function () {
rechargeVo.value.status = 2;
get();
console.log('adminReject');
}
//
const handleClick = function (tab, event) {
if (tab.props.name === 'all') {
adminAll();
} else if (tab.props.name === 'wait') {
adminWait();
} else if (tab.props.name === 'pass') {
adminPass();
} else if (tab.props.name === 'reject') {
adminReject();
}
}
//
const getActivity = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', {});
//
console.log('请求成功', result);
//
activity.value = result.data.data;
console.log('activity', activity.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const getArea = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {});
//
console.log('请求成功', result);
//
allData.value = result.data.data;
console.log('allData', allData.value);
//
area.value = [...new Set(allData.value.map(item => item.area))]
console.log('地区', area.value);
} catch (error) {
console.log('请求失败', error);
//
}
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize));
if ((getObj.value.pageNum > 0) && (getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize))) {
console.log('输入的数字合法');
get();
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容',
})
}
}
//
onMounted(async function () {
await get();
getActivity();
await getArea();
})
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px;">
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large"
style="width: 240px">
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large"
style="width: 240px">
<el-option v-for="item in payWay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large"
style="width: 240px">
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" />
<el-button style="margin-left: 10px;" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
</el-tabs>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="username" label="姓名" width="100px" />
<el-table-column prop="homilyId" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="activityName" label="活动名称" width="150px" />
<el-table-column prop="rechargeGold" label="充值金额" width="100px" />
<el-table-column prop="rechargeWay" label="充值方式" width="100px" />
<el-table-column prop="paidGold" label="充值金币" width="100px" />
<el-table-column prop="freeGold" label="免费金币" width="100px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column prop="rechargeVoucher" label="支付凭证" width="150px">
<template #default="scope">
<el-image :src="scope.row.rechargeVoucher" alt="凭证" style="width: 50px; height: 50px" />
</template>
</el-table-column>
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="状态" width="100px">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column prop="reson" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" label="交款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="提交时间" width="200px" />
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
<div>{{ total }},每页 </div>
<el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
<el-option v-for="item in [5, 6, 7, 8, 9, 10]" :key="item" :label="item"
:value="item"></el-option>
</el-select>
<div> </div>
</el-pagination>
<el-pagination background layout="prev, pager, next,slot" :page-size="getObj.pageSize"
:total="total" :current-page="getObj.pageNum" @current-change="get">
<div>跳至</div>
<el-input v-model="getObj.pageNum" style="width: 40px;" @change="checkNumber" />
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

324
vue/gold-system/src/views/refund/addRefund.vue

@ -1,324 +0,0 @@
<script setup>
import { reactive } from "vue";
import { ref, computed, watch } from "vue";
import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import axios from "axios";
import { ElMessageBox } from "element-plus";
//
const addRefund = ref({
adminId: "1",
});
//
const add = async function () {
try {
// POST
const result = await axios.post(
"http://192.168.8.174:10040/refund/add",
addRefund.value
);
//
console.log("请求成功", result);
//
console.log("用户信息", user.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
const addBefore = () => {
Ref.value.validate(async (valid) => {
if (valid) {
ElMessageBox.confirm("确认添加?")
.then(() => {
add();
console.log("添加成功");
addRefund.value = {};
})
.catch(() => {
console.log("取消添加");
});
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
//
//
const Ref = ref(null);
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("付款时间不能小于当前时间"));
}
};
const rules = reactive({
jwcode: [{ required: true, message: "请输入精网号", trigger: "blur" }],
refundType: [{ required: true, message: "请选择退款类型", trigger: "blur" }],
refundGoods: [{ required: true, message: "请选择退款商品", trigger: "blur" }],
taskCoin: [{ required: true, message: "请输入任务金币", trigger: "blur" }],
freeCoin: [{ required: true, message: "请输入免费金币", trigger: "blur" }],
rechargeCoin: [
{ required: true, message: "请输入充值金币", trigger: "blur" },
],
allCoin: [{ required: true, message: "请选择付款方式", trigger: "blur" }],
});
//
const user = ref({});
const getUser = async function (jwcode) {
try {
// POST
const result = await axios.post("http://192.168.8.93:10020/recharge/user", {
jwcode: jwcode,
});
//
console.log("请求成功", result);
//
user.value = result.data.data[0];
console.log("用户信息", user.value);
if (result.data.code === 0) {
ElMessage.error(result.data.msg);
} else {
ElMessage.success(result.data.msg);
}
} catch (error) {
console.log("请求失败", error);
ElMessage.error("查询失败,请检查精网号是否正确");
//
}
};
const calculatedAllGold = computed(() => {
return (
addRefund.value.freeCoin +
addRefund.value.rechargeCoin +
addRefund.value.taskCoin
);
});
watch(calculatedAllGold, (newVal) => {
addRefund.value.allCoin = newVal;
});
const AAA = computed(() => {
return addRefund.value.jwcode;
});
watch(AAA, (newVal) => {});
// 退
const refundType = [
{
value: "退款商品",
label: "退款商品",
},
{
value: "退款金币",
label: "退款金币",
},
];
</script>
<template>
<div>新增退款</div>
<el-form
:model="addRefund"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
>
<el-form-item prop="jwcode" label="精网号">
<el-input v-model="addRefund.jwcode" style="width: 220px" />
<el-button
type="primary"
@click="getUser(addRefund.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
<el-form-item prop="refundType" label="退款类型">
<el-select
v-model="addRefund.refundType"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item prop="refundGoods" label="退款商品">
<el-select
v-model="addRefund.refundGoods"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in activity"
:key="item.value"
:label="item.activityName"
:value="item.rechargeRatio"
/>
</el-select>
</el-form-item>
<el-form-item prop="taskCoin" label="任务金币" style="float: left">
<el-input
v-model="addRefund.taskCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</el-form-item>
<el-form-item
prop="freeCoin"
label="免费金币"
style="float: left; margin-left: -10px; margin-right: -10px"
>
<el-input
v-model="addRefund.freeCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</el-form-item>
<el-form-item
prop="rechargeCoin"
label="充值金币"
style="margin-left: -20px"
>
<el-input
v-model="addRefund.rechargeCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 20px"></p>
</el-form-item>
<el-form-item prop="allCoin" label="退款金币总数">
<el-input disabled v-model="addRefund.allCoin" style="width: 100px">
<template #default="scope">
<template #s> {{ taskCoin + freeCoin + rechargeCoin }} </template>
</el-input>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addRefund.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-form-item prop="commitName" label="提交人">
<el-input
style="width: 300px"
value="张三"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
</el-form>
<el-button @click="closeAddActivityVisible" style="margin-left: 280px"
>取消</el-button
>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
<!-- 客户信息栏 -->
<el-card
style="width: 700px; float: right; margin-top: -370px; margin-right: 100px"
>
<el-form
:model="user"
label-width="auto"
style="max-width: 600px"
label-position="left"
>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<el-row style="margin-top: 20px">
<el-col :span="12">
<el-form-item label="姓名:">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="历史金币总数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前金币总数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="首次充值日期"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="充值次数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责客服"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消费次数"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属门店"> </el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="待审核"> </el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</template>
<style scoped>
p {
margin: 0px;
}
.el-form-item {
margin-left: 50px;
}
/* 上传图片的格式 */
.avatar-uploader .avatar {
width: 50px;
height: 50px;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 50px;
height: 50px;
text-align: center;
}
</style>

207
vue/gold-system/src/views/usergold/index.vue

@ -1,207 +0,0 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
const tableData = [
{
activityName: '这是活动名称',
startTime: '2023-12-22 00:00:00',
endTime: '2024-12-22 23:59:59',
rechargeRatio: '10:1',
status: '进行中',
adminName: '张三',
createTime: '2023-01-01 00:00:00',
},
{
activityName: '这是活动名称2',
startTime: '2023-12-22 00:00:00',
endTime: '2024-12-22 23:59:59',
rechargeRatio: '5:1',
status: '进行中',
adminName: '张三',
createTime: '2023-01-01 00:00:00',
},
{
activityName: '这是活动名称3',
startTime: '2024-12-22 00:00:00',
endTime: '2025-12-22 23:59:59',
rechargeRatio: '10:1',
status: '未开始',
adminName: '张三',
createTime: '2023-01-01 00:00:00',
},
{
activityName: '这是活动名称4',
startTime: '2024-12-22 00:00:00',
endTime: '2025-12-22 23:59:59',
rechargeRatio: '5:1',
status: '未开始',
adminName: '张三',
createTime: '2023-01-01 00:00:00',
},
{
activityName: '这是活动名称5',
startTime: '2023-01-01 00:00:00',
endTime: '2023-12-22 23:59:59',
rechargeRatio: '10:1',
status: '已结束',
adminName: '张三',
createTime: '2023-01-01 00:00:00',
},
{
activityName: '这是活动名称6',
startTime: '2023-01-01 00:00:00',
endTime: '2023-12-22 23:59:59',
rechargeRatio: '5:1',
status: '已结束',
adminName: '张三',
createTime: '2023-01-01 00:00:00',
},
]
//
const value = ref('')
const options = [
{
value: 'Option1',
label: 'Option1',
},
{
value: 'Option2',
label: 'Option2',
},
{
value: 'Option3',
label: 'Option3',
},
{
value: 'Option4',
label: 'Option4',
},
{
value: 'Option5',
label: 'Option5',
},
]
//
const getObj = ref({
page: 1,
size: 10,
})
//
const total = ref(100)
//
const addActivityVisible = ref(false)
//
const openAddActivityVisible = function () {
addActivityVisible.value = true
}
//
const closeAddActivityVisible = function () {
addActivityVisible.value = false
}
//
const addActicity = function () {
openAddActivityVisible();
}
//
const addObj = reactive({
activityName: '',
freeGold: '',
rechargeRatio: '',
startTime: '',
endTime: '',
adminName: '',
})
const Delete = function (index, row) {
console.log(index, row)
}
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input v-model="input" style="width: 240px" placeholder="请输入活动名称" clearable />
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">更新类型</el-text>
<el-select v-model="value" placeholder="请选择活动名称" size="large" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">更新时间</el-text>
<el-time-picker v-model="value1" is-range range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" />
</div>
<div class="head-card-btn">
<el-button>重置</el-button>
<el-button type="primary">查询</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
现有金币免费金币充值金币任务金币
</div>
<div>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="name" label="姓名" />
<el-table-column prop="homilyId" label="精网号" />
<el-table-column prop="area" label="所属地区" />
<el-table-column prop="gold" label="更新数量" />
<el-table-column prop="updateType" label="更新类型" />
<el-table-column prop="freeCoin" label="免费金币" />
<el-table-column prop="rechargeCoin" label="充值金币" />
<el-table-column prop="taskCoin" label="任务金币" />
<el-table-column prop="commitName" label="提交人" />
<el-table-column prop="createTime" label="更新时间" />
</el-table>
</div>
<!-- 分页 -->
<el-pagination background
layout="prev, pager, next" :total="total" />
</el-card>
</el-col>
</el-row>
</template>
<style scoped>
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

338
vue/gold-system/src/views/workspace/index.vue

@ -1,338 +0,0 @@
<script setup>
import { all } from 'axios';
import * as echarts from 'echarts';
import { ref, onMounted, reactive, computed } from "vue";
import { VscInfo } from 'vue-icons-plus/vsc'
//
const activeName = ref('recharge')
//
const platform = ref('all')
onMounted(function () {
// domecharts
var rechargeBar = echarts.init(document.getElementById('recharge'));
//
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
// 使
rechargeBar.setOption(option);
// domecharts
var consumeBar = echarts.init(document.getElementById('consume'));
//
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
// 使
consumeBar.setOption(option);
// domecharts
var yearRechargePie = echarts.init(document.getElementById('yearRecharge'));
var option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' }
]
}
]
};
// 使
yearRechargePie.setOption(option);
// domecharts
var yearConsumePie = echarts.init(document.getElementById('yearConsume'));
var option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' }
]
}
]
};
// 使
yearConsumePie.setOption(option);
// domecharts
var nowGoldPie = echarts.init(document.getElementById('nowGold'));
var option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' }
]
}
]
};
// 使
nowGoldPie.setOption(option);
// domecharts
var goldCategoryPie = echarts.init(document.getElementById('goldCategory'));
var option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 484, name: 'Union Ads' },
{ value: 300, name: 'Video Ads' }
]
}
]
};
// 使
goldCategoryPie.setOption(option);
})
</script>
<template>
<el-row :gutter="20">
<el-col :span="6">
<el-card>
<p>当前金币余量
</p>
<p>数据待填充</p>
<p>较前一天数据待填充</p>
<template #footer>充值 免费 任务</template>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<p>全年累计金币数</p>
<p>数据待填充</p>
<p>折合新币累计金额数据待填充</p>
<template #footer>昨日新增其中充值</template>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<p>全年累计消费金币数</p>
<p>数据待填充</p>
<p>消费退款</p>
<template #footer>昨日新增消耗消费退款</template>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<p>全年累计充值人数</p>
<p>数据待填充</p>
<p>周同比 % 日环比%</p>
<template #footer>昨日充值人数其中首充</template>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col>
<el-card>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="金币充值" name="recharge">
<div id="recharge" style="width: 600px;height:400px;"></div>
</el-tab-pane>
<el-tab-pane label="金币消费" name="consume">
<div id="consume" style="width: 600px;height:400px;"></div>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="16">
<el-card>
<template #header>
<div class="card-header">
<span>金币概览</span>
</div>
</template>
<div class="pie">
<div id="yearRecharge" style="width: 600px;height:400px;"></div>
<div id="yearConsume" style="width: 600px;height:400px;"></div>
<div id="nowGold" style="width: 600px;height:400px;"></div>
</div>
</el-card>
</el-col>
<el-col :span="8">
<el-card>
<template #header>
<div class="card-header" style="display: flex;">
<span>金币消耗类别占比</span>
<el-radio-group v-model="platform" fill="#ffffff" text-color="#409eff" size="small"
style="margin-left: auto;">
<el-radio-button label="全部平台" value="all" />
<el-radio-button label="HC" value="hc" />
<el-radio-button label="Link" value="link" />
</el-radio-group>
</div>
</template>
<div id="goldCategory" style="width: 600px;height:400px;"></div>
</el-card>
</el-col>
</el-row>
</template>
<style scoped>
.pie{
display: flex;
}
.el-row {
margin-bottom: 20px;
}
.el-radio-button {
border: 1px solid grey;
}
</style>

0
vue/gold-system/.gitignore → vue/gold-system/vue/gold-system/.gitignore

0
vue/gold-system/.vscode/extensions.json → vue/gold-system/vue/gold-system/.vscode/extensions.json

0
vue/gold-system/README.md → vue/gold-system/vue/gold-system/README.md

0
vue/gold-system/index.html → vue/gold-system/vue/gold-system/index.html

0
vue/gold-system/package-lock.json → vue/gold-system/vue/gold-system/package-lock.json

5
vue/gold-system/package.json → vue/gold-system/vue/gold-system/package.json

@ -4,9 +4,10 @@
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"dev": "vite --host 0.0.0.0",
"build": "vue-tsc -b && vite build",
"preview": "vite preview"
"preview": "vite preview",
"serve": "vite - service serve --host 0.0.0.0 --port 8080"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",

0
vue/gold-system/public/vite.svg → vue/gold-system/vue/gold-system/public/vite.svg

0
vue/gold-system/src/App.vue → vue/gold-system/vue/gold-system/src/App.vue

9
vue/gold-system/vue/gold-system/src/api/index.js

@ -0,0 +1,9 @@
import http from '../util/http.js';
const API={
post: function(url,data){
return http({url:url,method:'post',data:data})
},
};
export default API;

BIN
vue/gold-system/vue/gold-system/src/assets/background.jpg

After

Width: 928  |  Height: 1133  |  Size: 567 KiB

72
vue/gold-system/vue/gold-system/src/assets/css/common.css

@ -0,0 +1,72 @@
.green-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
background-color: green;
}
.red-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
background-color: red;
}
.grey-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
background-color: grey;
}
.yellow-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
display: block;
background-color: #ffe733;
}
.light-green-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
display: block;
background-color: #35e383;
}
.blue-dot {
margin: 7px 5px 0px 0px;
width: 10px;
height: 10px;
display: block;
background-color: #5f8ff5;
}
.red-triangle {
width: 0;
height: 0;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 10px solid red;
}
.green-triangle {
width: 0;
height: 0;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-top: 10px solid green;
}
.grey-triangle {
width: 10px;
height: 5px;
background-color: grey;
}

0
vue/gold-system/src/assets/vue.svg → vue/gold-system/vue/gold-system/src/assets/vue.svg

BIN
vue/gold-system/vue/gold-system/src/assets/动漫美女.png

After

Width: 263  |  Height: 181  |  Size: 95 KiB

0
vue/gold-system/src/assets/金币管理系统logo.png → vue/gold-system/vue/gold-system/src/assets/金币管理系统logo.png

Before

Width: 47  |  Height: 47  |  Size: 2.0 KiB

After

Width: 47  |  Height: 47  |  Size: 2.0 KiB

BIN
vue/gold-system/vue/gold-system/src/assets/韩信.png

After

Width: 256  |  Height: 180  |  Size: 96 KiB

0
vue/gold-system/src/main.ts → vue/gold-system/vue/gold-system/src/main.ts

14
vue/gold-system/src/router/index.js → vue/gold-system/vue/gold-system/src/router/index.js

@ -3,8 +3,11 @@ import { createRouter,createWebHashHistory } from 'vue-router';
const router=createRouter({
history:createWebHashHistory(),
routes:[
{path:'/',redirect:"/index"},
{path:'/login', name:"login", component:()=>import("../views/login.vue")},
{path:'/',redirect:"/workspace"},
{path:'/test',component:()=>import("../views/z.vue")},
{
meta:{requireAuth:true},
path:'/index',component:()=>import("../views/index.vue"),
children:[
// 工作台
@ -39,4 +42,13 @@ const router=createRouter({
]
});
router.beforeEach((to,from,next)=>{
const token=localStorage.getItem("token");
if(to.name!="login"&&!token){
next({name:"login"});
}else{
next();
}
})
export default router;

0
vue/gold-system/src/style.css → vue/gold-system/vue/gold-system/src/style.css

42
vue/gold-system/vue/gold-system/src/util/http.js

@ -0,0 +1,42 @@
import axios from 'axios';
export default function (options) {
//配置每次发送请求都从localStorage中获取名字叫token的数据,
//添加到请求头部的Authorization属性中
const token = localStorage.getItem('token');
//Object.assign用于合并对象的数据
options.headers = Object.assign(
{ token: token },
options.headers || {}
);
//axios() 返回一个promise对象,用于异步请求
//options是一个对象,其中包含了许多用于配置请求的参数,
//例如请求的url、请求方法(GET、POST等)、请求头等
return axios(options)
.then(({ status, data, statusText }) => {
//该函数在请求成功并返回数据时被调用
//status:HTTP状态码,例如200表示请求成功。
//data:服务器返回的数据。
// statusText:HTTP状态文本,例如"OK"表示请求成功。
console.log(data);
if (status == 200) {
return data;
} else {
throw new e(statusText);
}
})
.catch(e=>{
// 检查是否是因为token过期导致的401错误
if (e.response && e.response.status === 401) {
// 清除localStorage中的token
localStorage.removeItem('token');
// 执行重新登录的逻辑,例如跳转到登录页面
window.location.href = '/login';
// 可以在这里返回一个特定的值或者对象,以便调用者知道需要重新登录
return { needsLogin: true };
} else {
// 其他类型的错误,直接抛出
return Promise.reject(e);
}
});
}

719
vue/gold-system/vue/gold-system/src/views/audit/rechargeAudit.vue

@ -0,0 +1,719 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from "element-plus";
import { AiFillRead } from "vue-icons-plus/ai";
import axios from "axios";
import moment from "moment";
import API from "../../api/index.js";
//
//
const admin = ref({
adminId: 1,
name: "赵刚",
area: "中国",
});
//
const tableData = ref([]);
// ======================================
// rechargeVo
const rechargeVo = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
// ======================================
//
const rejectVisible = ref(false);
//
const rejectObj = ref({});
//
const passObj = ref({});
//
const activeName = ref("all");
//
const payWay = [
{
value: "微信",
label: "微信",
},
{
value: "支付宝",
label: "支付宝",
},
{
value: "银联",
label: "银联",
},
{
value: "信用卡",
label: "信用卡",
},
{
value: "借记卡",
label: "借记卡",
},
];
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 2) * 60 + "px";
});
// ref
const Ref = ref(null);
//
// ==============================================================
//
const get = async function (val) {
try {
//
if (typeof val === "number") {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != "" && getTime.value.endDate != "") {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = "";
rechargeVo.value.endDate = "";
}
console.log("搜索参数", getObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge",
{ ...getObj.value, rechargeVo: { ...rechargeVo.value } }
);
//
console.log("请求成功", result);
//
tableData.value = result.data.list;
console.log("tableData", tableData.value);
//
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const reset = function () {
rechargeVo.value.activityId = "";
rechargeVo.value.payWay = "";
rechargeVo.value.area = "";
rechargeVo.value.startDate = "";
rechargeVo.value.endDate = "";
getTime.value = {};
};
//
const getToday = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
);
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const adminAll = function () {
console.log("adminAll");
rechargeVo.value.status = "";
get();
};
//
const adminWait = function () {
rechargeVo.value.status = 0;
get();
console.log("adminWait");
};
//
const adminPass = function () {
rechargeVo.value.status = 1;
get();
console.log("adminPass");
};
//
const handleClick = function (tab, event) {
if (tab.props.name === "all") {
adminAll();
} else if (tab.props.name === "wait") {
adminWait();
} else if (tab.props.name === "pass") {
adminPass();
}
};
//
const getActivity = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/select",
{}
);
//
console.log("请求成功", result);
//
activity.value = result.data;
console.log("activity", activity.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const getArea = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge",
{}
);
//
console.log("请求成功", result);
//
allData.value = result.data;
console.log("allData", allData.value);
//
area.value = [...new Set(allData.value.map((item) => item.area))];
console.log("地区", area.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === "number") {
console.log(
"总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
);
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
console.log("输入的数字合法");
get();
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
};
// ====================================
//
const pass = function (row) {
//
passObj.value.adminId = admin.value.adminId;
passObj.value.auditId = row.auditId;
passObj.value.status = 1;
console.log("通过对象", passObj.value);
};
//
const passConfirm = async function () {
try {
console.log("通过对象", passObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/audit/audit/edit",
passObj.value
);
//
console.log("请求成功", result);
//
get();
//
ElMessage({
type: "success",
message: "通过成功!",
});
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const openRejectVisible = function () {
rejectVisible.value = true;
};
//
const closeRejectVisible = function () {
rejectVisible.value = false;
};
//
const reject = function (row) {
//
rejectObj.value.adminId = admin.value.adminId;
rejectObj.value.auditId = row.auditId;
rejectObj.value.status = 2;
rejectObj.value.reson = "";
console.log("驳回对象", rejectObj.value);
openRejectVisible();
};
//
const rejectConfirm = async function () {
Ref.value.validate(async (valid) => {
if (valid) {
try {
console.log("驳回对象", rejectObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/audit/audit/edit",
rejectObj.value
);
//
console.log("请求成功", result);
//
get();
//
closeRejectVisible();
//
ElMessage({
type: "success",
message: "驳回成功!",
});
} catch (error) {
console.log("请求失败", error);
//
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
//
const rules = reactive({
reson: [{ required: true, message: "请输入驳回理由", trigger: "blur" }],
});
//
onMounted(async function () {
await get();
getActivity();
await getArea();
});
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px">
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select
v-model="rechargeVo.activityId"
placeholder="请选择活动名称"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in activity"
:key="item.activityId"
:label="item.activityName"
:value="item.activityId"
/>
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select
v-model="rechargeVo.payWay"
placeholder="请选择支付方式"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in payWay"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select
v-model="rechargeVo.area"
placeholder="请选择所属地区"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in area"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
/>
<el-button style="margin-left: 10px" @click="getToday()"
></el-button
>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs
v-model="activeName"
type="card"
class="demo-tabs"
@tab-click="handleClick"
>
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
</el-tabs>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="username" label="姓名" width="100px" />
<el-table-column prop="jwcode" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column
prop="activityName"
label="活动名称"
width="150px"
/>
<el-table-column
prop="rechargeGold"
label="充值金额"
width="100px"
/>
<el-table-column
prop="rechargeWay"
label="充值方式"
width="100px"
/>
<el-table-column prop="paidGold" label="充值金币" width="100px" />
<el-table-column prop="freeGold" label="免费金币" width="100px" />
<el-table-column
prop="remark"
label="备注"
width="200px"
show-overflow-tooltip
/>
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column
prop="rechargeVoucher"
label="支付凭证"
width="150px"
>
<template #default="scope">
<el-image
:src="scope.row.rechargeVoucher"
alt="凭证"
style="width: 50px; height: 50px"
/>
</template>
</el-table-column>
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="状态" width="100px">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column
prop="reson"
label="驳回理由"
width="200px"
show-overflow-tooltip
/>
<el-table-column prop="rechargeTime" label="交款时间" width="200px">
<template #default="scope">
{{
moment(scope.row.rechargeTime).format("YYYY-MM-DD HH:mm:ss")
}}
</template>
</el-table-column>
<el-table-column prop="createTime" label="提交时间" width="200px" />
<el-table-column
fixed="right"
prop="operation"
label="操作"
width="150px"
>
<template #default="scope">
<div class="operation">
<el-popconfirm
title="确定要通过此条记录吗?"
@confirm="passConfirm"
>
<template #reference>
<el-button
:disabled="
scope.row.status === 1 || scope.row.status === 2
? true
: false
"
type="primary"
text
@click="pass(scope.row)"
>
通过
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
</el-button>
</template>
</el-popconfirm>
<el-button
:disabled="
scope.row.status === 1 || scope.row.status === 2
? true
: false
"
type="primary"
text
@click="reject(scope.row)"
>
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
:page-size="getObj.pageSize"
layout="slot"
:total="total"
>
<div>{{ total }},每页</div>
<el-select
v-model="getObj.pageSize"
class="page-size"
@change="get()"
style="width: 80px"
>
<el-option
v-for="item in [5, 6, 7, 8, 9, 10]"
:key="item"
:label="item"
:value="item"
></el-option>
</el-select>
<div></div>
</el-pagination>
<el-pagination
background
layout="prev, pager, next,slot"
:page-size="getObj.pageSize"
:total="total"
:current-page="getObj.pageNum"
@current-change="get"
>
<div>跳至</div>
<el-input
v-model="getObj.pageNum"
style="width: 40px"
@change="checkNumber"
/>
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<!-- 驳回弹出框 -->
<el-dialog
v-model="rejectVisible"
title="驳回理由"
width="500"
:before-close="closeRejectVisible"
>
<template #footer>
<el-form
:model="rejectObj"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 600px"
>
<el-form-item prop="reson" label="驳回理由:">
<el-input
v-model="rejectObj.reson"
maxlength="150"
show-word-limit
style="width: 350px"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeRejectVisible()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.operation {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

692
vue/gold-system/vue/gold-system/src/views/audit/refundAudit.vue

@ -0,0 +1,692 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from "element-plus";
import { AiFillRead } from "vue-icons-plus/ai";
import axios from "axios";
import moment from "moment";
import API from "../../api/index.js";
//
//
const admin = ref({
adminId: 1,
name: "赵刚",
area: "中国",
});
//
const tableData = ref([]);
// ======================================
// consumeDetail
const consumeDetail = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const total = ref(100);
//
const getTime = ref([]);
//
const product = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
// ======================================
//
const rejectVisible = ref(false);
//
const rejectObj = ref({});
//
const passObj = ref({});
//
const activeName = ref("all");
// 退
const refundType = [
{
value: "退金币",
label: "退金币",
},
{
value: "退商品",
label: "退商品",
},
];
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 1) * 50 + "px";
});
// ref
const Ref = ref(null);
//
// ==============================================================
//
const get = async function (val) {
try {
//
if (typeof val === "number") {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != "" && getTime.value.endDate != "") {
consumeDetail.value.startDate = getTime.value[0];
consumeDetail.value.endDate = getTime.value[1];
}
} else {
consumeDetail.value.startDate = "";
consumeDetail.value.endDate = "";
}
console.log("搜索参数", getObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/audit/audit/refund",
{ ...getObj.value, consumeDetail: { ...consumeDetail.value } }
);
//
console.log("请求成功", result);
//
tableData.value = result.data.list;
console.log("tableData", tableData.value);
//
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const reset = function () {
consumeDetail.value.area = "";
consumeDetail.value.refundType = "";
consumeDetail.value.refundGoods = "";
consumeDetail.value.startDate = "";
consumeDetail.value.endDate = "";
getTime.value = {};
};
//
const getToday = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
);
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const adminAll = function () {
console.log("adminAll");
consumeDetail.value.status = "";
get();
};
//
const adminWait = function () {
consumeDetail.value.status = 0;
get();
console.log("adminWait");
};
//
const adminPass = function () {
consumeDetail.value.status = 1;
get();
console.log("adminPass");
};
//
const handleClick = function (tab, event) {
if (tab.props.name === "all") {
adminAll();
} else if (tab.props.name === "wait") {
adminWait();
} else if (tab.props.name === "pass") {
adminPass();
}
};
//
const getProduct = async function () {
try {
// POST
const result = await API.post("http://192.168.8.93:10010/product", {});
//
console.log("请求成功", result);
//
product.value = result.data;
console.log("产品", product.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const getArea = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge",
{}
);
//
console.log("请求成功", result);
//
allData.value = result.data;
console.log("allData", allData.value);
//
area.value = [...new Set(allData.value.map((item) => item.area))];
console.log("地区", area.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === "number") {
console.log(
"总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
);
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
console.log("输入的数字合法");
get();
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
};
// ====================================
//
const pass = function (row) {
//
passObj.value.adminId = admin.value.adminId;
passObj.value.auditId = row.auditId;
passObj.value.status = 1;
console.log("通过对象", passObj.value);
};
//
const passConfirm = async function () {
try {
console.log("通过对象", passObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/audit/audit/edit",
passObj.value
);
//
console.log("请求成功", result);
//
get();
//
ElMessage({
type: "success",
message: "通过成功!",
});
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const openRejectVisible = function () {
rejectVisible.value = true;
};
//
const closeRejectVisible = function () {
rejectVisible.value = false;
};
//
const reject = function (row) {
//
rejectObj.value.adminId = admin.value.adminId;
rejectObj.value.auditId = row.auditId;
rejectObj.value.status = 2;
rejectObj.value.reson = "";
console.log("驳回对象", rejectObj.value);
openRejectVisible();
};
//
const rejectConfirm = async function () {
Ref.value.validate(async (valid) => {
if (valid) {
try {
console.log("驳回对象", rejectObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/audit/audit/edit",
rejectObj.value
);
//
console.log("请求成功", result);
//
get();
//
closeRejectVisible();
//
ElMessage({
type: "success",
message: "驳回成功!",
});
} catch (error) {
console.log("请求失败", error);
//
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
//
const rules = reactive({
reson: [{ required: true, message: "请输入驳回理由", trigger: "blur" }],
});
//
onMounted(async function () {
await get();
getProduct();
await getArea();
});
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px">
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">退款类型</el-text>
<el-select
v-model="consumeDetail.refundType"
placeholder="请选择退款类型"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">退款商品</el-text>
<el-select
v-model="consumeDetail.refundGoods"
placeholder="请选择退款商品"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in product"
:key="item.name"
:label="item.name"
:value="item.name"
/>
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select
v-model="consumeDetail.area"
placeholder="请选择所属地区"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in area"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
/>
<el-button style="margin-left: 10px" @click="getToday()"
></el-button
>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs
v-model="activeName"
type="card"
class="demo-tabs"
@tab-click="handleClick"
>
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
</el-tabs>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="user" label="姓名" width="100px" />
<el-table-column prop="jwcode" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="refundType" label="退款类型" width="100px" />
<el-table-column
prop="refundGoods"
label="退款商品"
width="200px"
/>
<el-table-column prop="refundCoin" label="退款金币数" width="100px">
<template #default="scope">
<span>{{
scope.row.rechargeCoin +
scope.row.freeCoin +
scope.row.taskCoin
}}</span>
</template>
</el-table-column>
<el-table-column
prop="rechargeCoin"
label="充值金币"
width="100px"
/>
<el-table-column prop="freeCoin" label="免费金币" width="100px" />
<el-table-column prop="taskCoin" label="任务金币" width="100px" />
<el-table-column
prop="remark"
label="备注"
width="200px"
show-overflow-tooltip
/>
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="审核状态" width="100px">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column
prop="reson"
label="驳回理由"
width="200px"
show-overflow-tooltip
/>
<el-table-column prop="createTime" label="提交时间" width="200px">
<template #default="scope">
{{ moment(scope.row.createTime).format("YYYY-MM-DD HH:mm:ss") }}
</template>
</el-table-column>
<el-table-column
fixed="right"
prop="operation"
label="操作"
width="150px"
>
<template #default="scope">
<div class="operation">
<el-popconfirm
title="确定要通过此条记录吗?"
@confirm="passConfirm"
>
<template #reference>
<el-button
:disabled="
scope.row.status === 1 || scope.row.status === 2
? true
: false
"
type="primary"
text
@click="pass(scope.row)"
>
通过
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
</el-button>
</template>
</el-popconfirm>
<el-button
:disabled="
scope.row.status === 1 || scope.row.status === 2
? true
: false
"
type="primary"
text
@click="reject(scope.row)"
>
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
:page-size="getObj.pageSize"
layout="slot"
:total="total"
>
<div>{{ total }},每页</div>
<el-select
v-model="getObj.pageSize"
class="page-size"
@change="get()"
style="width: 80px"
>
<el-option
v-for="item in [5, 6, 7, 8, 9, 10]"
:key="item"
:label="item"
:value="item"
></el-option>
</el-select>
<div></div>
</el-pagination>
<el-pagination
background
layout="prev, pager, next,slot"
:page-size="getObj.pageSize"
:total="total"
:current-page="getObj.pageNum"
@current-change="get"
>
<div>跳至</div>
<el-input
v-model="getObj.pageNum"
style="width: 40px"
@change="checkNumber"
/>
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<!-- 驳回弹出框 -->
<el-dialog
v-model="rejectVisible"
title="驳回理由"
width="500"
:before-close="closeRejectVisible"
>
<template #footer>
<el-form
:model="rejectObj"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 600px"
>
<el-form-item prop="reson" label="驳回理由:">
<el-input
v-model="rejectObj.reson"
maxlength="150"
show-word-limit
style="width: 350px"
type="textarea"
placeholder="请输入内容"
/>
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeRejectVisible()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.operation {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

430
vue/gold-system/vue/gold-system/src/views/consume/addConsume.vue

@ -0,0 +1,430 @@
<script setup>
import { reactive } from "vue";
import { ref, computed, watch } from "vue";
import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import axios from "axios";
import { ElMessageBox } from "element-plus";
import API from "../../api/index.js";
import moment from "moment";
//
const adminData = ref({});
const getAdminData = async function () {
try {
const result = await API.post(
"http://192.168.8.93:10010/admin/userinfo",
{}
);
adminData.value = result;
addConsume.value.adminId = adminData.value.adminId;
console.log("请求成功", result);
console.log("用户信息", adminData.value);
} catch (error) {
console.log("请求失败", error);
}
};
getAdminData();
//
const addConsume = ref({
freeCoin: 0,
rechargeCoin: 0,
taskCoin: 0,
updateType: "消费",
});
//
const add = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/consume/add",
addConsume.value
);
//
addConsume.value = {};
addConsume.value.adminId = adminData.value.adminId;
addConsume.value.adminName = adminData.value.adminName;
addConsume.value.updateType = "消费";
addConsume.value.freeCoin = 0;
addConsume.value.rechargeCoin = 0;
addConsume.value.taskCoin = 0;
console.log("请求成功", result);
user.value = {};
} catch (error) {
console.log("请求失败", error);
//
}
};
const addBefore = () => {
Ref.value.validate(async (valid) => {
if (valid) {
ElMessageBox.confirm("确认添加?")
.then(() => {
add();
console.log("添加成功");
imageUrl.value = "";
addConsume.value = {};
})
.catch(() => {
console.log("取消添加");
});
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
//
//
const Ref = ref(null);
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("付款时间不能小于当前时间"));
}
};
const checkFreeGoldRadio = function (rule, value, callback) {
if (value == "0" || value == null || value == "") {
callback(new Error("请输入消费金币总数"));
} else if (value < 0 || isNaN(value)) {
callback(new Error("请输入正确的格式"));
} else {
callback();
}
};
const rules = reactive({
jwcode: [{ required: true, message: "请输入精网号", trigger: "blur" }],
productId: [{ required: true, message: "请选择消费商品", trigger: "blur" }],
taskCoin: [{ required: true, message: "请输入任务金币", trigger: "blur" }],
freeCoin: [{ required: true, message: "请输入免费金币", trigger: "blur" }],
rechargeCoin: [
{ required: true, message: "请输入免费金币", trigger: "blur" },
],
allGold: [{ validator: checkFreeGoldRadio, trigger: "blur" }],
});
//
const delteConsume = function () {
addConsume.value = {};
addConsume.value.adminId = adminData.value.adminId;
addConsume.value.adminName = adminData.value.adminName;
addConsume.value.updateType = "消费";
addConsume.value.freeCoin = 0;
addConsume.value.rechargeCoin = 0;
addConsume.value.taskCoin = 0;
};
//
const user = ref({});
const getUser = async function (jwcode) {
try {
// POST
const result = await API.post("http://192.168.8.93:10010/recharge/user", {
jwcode: jwcode,
});
//
console.log("请求成功", result);
//
user.value = result.data[0];
user.value.A =
Number(user.value.pendingRechargeTimes) +
Number(user.value.pendingSpendTimes);
console.log("用户信息", user.value);
if (result.data.code === 0) {
ElMessage.error("查询失败,请检查精网号是否正确");
} else {
ElMessage.success("查询成功");
}
} catch (error) {
console.log("请求失败", error);
ElMessage.error("查询失败,请检查精网号是否正确");
//
}
};
//
const goods = ref([]);
const getGoods = async function () {
try {
// POST
const result = await API.post("http://192.168.8.93:10010/product", {});
//
console.log("请求成功", result);
//
goods.value = result.data;
console.log("allData", allData.value);
console.log("地区", area.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
getGoods();
//
const userGold = ref({});
const getUserGold = async function (jwcode) {
try {
const result = await API.post(
"http://192.168.8.93:10010/statistics/getMess/" + jwcode
);
console.log("请求成功", result);
//
userGold.value = result.data;
console.log("userGold", userGold.value);
} catch (error) {
console.log("请求失败", error);
}
};
function calculateCoins() {
// allGold
const originalAllGold = addConsume.value.allGold;
// todayTasktodayFree
const todayTask =
typeof userGold.value.todayTask === "number" ? userGold.value.todayTask : 0;
const todayFree =
typeof userGold.value.todayFree === "number" ? userGold.value.todayFree : 0;
//
addConsume.value.taskCoin = Math.min(originalAllGold, todayTask);
let remainingGold = originalAllGold - addConsume.value.taskCoin;
addConsume.value.freeCoin = Math.min(remainingGold, todayFree);
remainingGold -= addConsume.value.freeCoin;
addConsume.value.rechargeCoin = remainingGold; //
// allGold
addConsume.value.allGold = originalAllGold;
// taskCoin, freeCoin, rechargeCoinNaN0
if (isNaN(addConsume.value.taskCoin)) addConsume.value.taskCoin = 0;
if (isNaN(addConsume.value.freeCoin)) addConsume.value.freeCoin = 0;
if (isNaN(addConsume.value.rechargeCoin)) addConsume.value.rechargeCoin = 0;
console.log("计算结果", addConsume.value);
}
</script>
<template>
<div style="margin-bottom: 20px">新增消费</div>
<el-form
:model="addConsume"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
class="form-style"
>
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addConsume.jwcode"
style="width: 220px"
@change="getUserGold(addConsume.jwcode)"
/>
<el-button
type="primary"
@click="getUser(addConsume.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
<el-form-item prop="productId" label="商品名称">
<el-select
v-model="addConsume.productId"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in goods"
:key="item.value"
:label="item.name"
:value="item.productId"
/>
</el-select>
</el-form-item>
<el-form-item prop="allGold" label="消费金币总数">
<el-input
v-model="addConsume.allGold"
style="width: 100px"
@change="calculateCoins()"
/>
</el-form-item>
<div style="display: flex; align-items: center">
<el-form-item prop="taskCoin" label="任务金币" style="float: left">
<el-input
disabled
v-model="addConsume.taskCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</el-form-item>
<el-form-item
prop="freeCoin"
label="免费金币"
style="float: left; margin-left: -20px"
>
<el-input
disabled
v-model="addConsume.freeCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</el-form-item>
<el-form-item
prop="rechargeCoin"
label="充值金币"
style="margin-left: -20px"
>
<el-input
disabled
v-model="addConsume.rechargeCoin"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 20px"></p>
</el-form-item>
</div>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addConsume.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-form-item prop="commitName" label="提交人">
<el-input
style="width: 300px"
:value="adminData.name"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
<el-button @click="delteConsume" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card style="width: 700px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 600px"
label-position="left"
>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<el-row style="margin-top: 20px">
<el-col :span="12">
<el-form-item label="姓名:">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="历史金币总数">
<p>{{ user.totalRechargeGold }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前金币总数">
<p>{{ user.sumgold }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="首次充值日期">
<p v-if="user.firstRechargeDate">
{{ moment(user.firstRechargeDate).format("YYYY-MM-DD HH:mm:ss") }}
</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="充值次数">
<p>{{ user.rechargeTimes }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责客服">
<p>{{ adminData.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消费次数">
<p>{{ user.spendTimes }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属门店">
<p>{{ adminData.area }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="待审核">
<p>
{{ user.A }}
</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</template>
<style scoped>
p {
margin: 0px;
}
.el-form-item {
margin-left: 50px;
}
/* 上传图片的格式 */
.avatar-uploader .avatar {
width: 50px;
height: 50px;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 50px;
height: 50px;
text-align: center;
}
.form-style {
margin-top: 50px;
max-width: 50%;
float: left;
}
.form-style2 {
max-width: 50%;
}
</style>

48
vue/gold-system/src/views/consume/allConsume.vue → vue/gold-system/vue/gold-system/src/views/consume/allConsume.vue

@ -3,6 +3,7 @@ import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { AiFillRead } from "vue-icons-plus/ai";
import axios from "axios";
import API from "../../api/index.js";
//
//
const tableData = ref([]);
@ -79,18 +80,18 @@ const get = async function (val) {
}
console.log("搜索参数", getObj.value);
// POST
const result = await axios.post(
"http://192.168.8.147:10030/consume/select",
{ ...getObj.value, detailVo: { ...detailVo.value } }
);
const result = await API.post("http://192.168.8.93:10010/consume/select", {
...getObj.value,
detailVo: { ...detailVo.value },
});
//
console.log("请求成功", result);
//
tableData.value = result.data.data.list;
tableData.value = result.data.list;
console.log("tableData", tableData.value);
//
total.value = result.data.data.total;
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
@ -99,7 +100,7 @@ const get = async function (val) {
};
//
const reset = function () {
detailVo.value.goods = "";
detailVo.value.productName = "";
detailVo.value.consumePlatform = "";
detailVo.value.consumeType = "";
detailVo.value.startDate = "";
@ -173,8 +174,8 @@ const handleClick = function (tab, event) {
//
onMounted(async function () {
await get();
getActivity();
await getArea();
// getActivity();
// await getArea();
});
//
@ -204,6 +205,24 @@ const checkNumber = function () {
});
}
};
//
const goods = ref([]);
const getGoods = async function () {
try {
// POST
const result = await API.post("http://192.168.8.93:10010/product", {});
//
console.log("请求成功", result);
//
goods.value = result.data;
console.log("allData", allData.value);
console.log("地区", area.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
getGoods();
</script>
<template>
@ -215,16 +234,17 @@ const checkNumber = function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">商品名称</el-text>
<el-select
v-model="detailVo.goods"
v-model="detailVo.productName"
placeholder="请选择活动名称"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in activity"
v-for="item in goods"
:key="item.activityId"
:label="item.activityName"
:value="item.activityId"
:label="item.name"
:value="item.name"
/>
</el-select>
</div>
@ -237,6 +257,7 @@ const checkNumber = function () {
placeholder="请选择支付方式"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in consumePlatform"
@ -255,6 +276,7 @@ const checkNumber = function () {
placeholder="请选择消费类型"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in consumeType"

88
vue/gold-system/src/views/index.vue → vue/gold-system/vue/gold-system/src/views/index.vue

@ -2,29 +2,79 @@
import { ref, onMounted, reactive, computed } from "vue";
import { useRouter } from "vue-router";
import ElementPlus from "element-plus";
import { VscGlobe } from 'vue-icons-plus/vsc'
import { VscGlobe } from "vue-icons-plus/vsc";
import { ElMessage } from "element-plus";
import axios from "axios";
import { ElMessageBox } from "element-plus";
import API from "../api/index.js";
//
const adminData = ref({
name: "",
});
const getAdminData = async function () {
try {
const result = await API.post(
"http://192.168.8.93:10010/admin/userinfo",
{}
);
adminData.value = result;
console.log("请求成功", result);
console.log("用户信息", adminData.value);
} catch (error) {
console.log("请求失败", error);
}
};
getAdminData();
const router = useRouter();
//
const admin = ref({
adminId: 1,
name:'客服A',
area:'新加坡'
})
adminId: 1,
name: "客服A",
area: "新加坡",
});
function logout() {
localStorage.removeItem("token");
router.push("/login");
ElMessage.success("退出成功");
}
const imgrule1 = '../src/assets/动漫美女.png';
const list=[
'../src/assets/韩信.png'
];
//
onMounted(async function () {
//
getAdminData();
});
</script>
<template>
<div class="common-layout">
<el-container>
<el-aside style="width: 250px;">
<el-aside style="width: 250px">
<div class="logo">
<img src="../assets/金币管理系统logo.png" alt="logo" style="width: 30px;height: 30px;" />
<div style="font-size: 16px; font-weight: bold;">海外金币管理系统</div>
<img
src="../assets/金币管理系统logo.png"
alt="logo"
style="width: 30px; height: 30px"
/>
<div style="font-size: 16px; font-weight: bold">海外金币管理系统</div>
</div>
<el-menu router="true" background-color="#08193d" active-text-color="#ffd04b" text-color="white"
class="el-menu-vertical-demo" default-active="2" @open="handleOpen" @close="handleClose">
<el-menu
router="true"
background-color="#08193d"
active-text-color="#ffd04b"
text-color="white"
class="el-menu-vertical-demo"
default-active="2"
@open="handleOpen"
@close="handleClose"
>
<el-menu-item index="/workspace">
<el-icon>
<Folder />
@ -94,20 +144,24 @@ const admin = ref({
</el-icon>
客户金币明细
</el-menu-item>
</el-menu>
</el-aside>
<el-container>
<el-header>
<el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" :ellipsis="false"
@select="handleSelect">
<el-menu
:default-active="activeIndex"
class="el-menu-demo"
mode="horizontal"
:ellipsis="false"
@select="handleSelect"
>
<el-sub-menu index="1" class="admin">
<template #title>
<img style="width: 30px;height: 30px; border-radius: 50%;" src="../assets/金币管理系统logo.png" alt="出错了" />
<span style="margin-left: 10px;">{{ admin.name }}</span>
<el-image :preview-src-list="list" preview-teleported="true" :src="imgrule1" alt="错误" style="width: 50px; height: 50px" />
<span style="margin-left: 10px">{{ adminData.name }}</span>
</template>
<el-menu-item index="1-1">查看个人信息</el-menu-item>
<el-menu-item index="1-2">退出登录</el-menu-item>
<el-menu-item index="1-2" @click="logout">退出登录</el-menu-item>
</el-sub-menu>
<el-menu-item index="2">
<VscGlobe />
@ -138,4 +192,4 @@ const admin = ref({
margin: 20px 0px 20px 20px;
display: flex;
}
</style>
</style>

126
vue/gold-system/vue/gold-system/src/views/login.vue

@ -0,0 +1,126 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import { ElMessage } from "element-plus";
import axios from "axios";
import { useRouter } from "vue-router";
import { VscGlobe } from "vue-icons-plus/vsc";
const router = useRouter(); //
const form = ref({ name: "", password: "" });
//
const login = async function () {
try {
const result = await axios.post(
"http://192.168.8.93:10010/admin/login",
form.value
);
if (result.data.code == 200) {
localStorage.setItem("token", result.data.msg);
router.push("/");
ElMessage.success("登录成功");
console.log("请求成功", result);
} else {
form.value.password = "";
form.value.username = "";
ElMessage.error(result.data.msg);
}
} catch (error) {
console.log("请求失败", error);
ElMessage.error(result.data.msg);
//
}
};
</script>
<template>
<el-row class="login-page">
<img
:span="12"
src="../assets/background.jpg"
alt="logo"
class="bg"
fit="fit"
/>
<el-col :span="6" :offset="3" class="form">
<!-- 登录表单 -->
<el-form
:model="form"
size="large"
autocomplete="off"
@keyup.enter.native="login()"
>
<el-form-item>
<h1 style="color: #409eff">金币系统登录</h1>
</el-form-item>
<el-form-item prop="username">
<el-input
v-model="form.username"
placeholder="请输入用户名"
></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="form.password"
type="password"
placeholder="请输入密码"
/>
</el-form-item>
<el-form-item class="flex"> </el-form-item>
<!-- 登录按钮 -->
<el-form-item>
<el-button
class="button"
type="primary"
auto-insert-space
@click="login()"
>登录</el-button
>
</el-form-item>
</el-form>
</el-col>
</el-row>
</template>
<style scoped>
.bg {
border-radius: 0 20px 20px 0;
height: 100vh;
width: 50%;
object-fit: cover;
}
.background {
color: #fffdfd;
text-align: center;
font-size: 24px;
background-color: #08193d;
}
.form {
display: flex;
flex-direction: column;
justify-content: center;
user-select: none;
.title {
margin: 0 auto;
}
.button {
width: 100%;
}
.flex {
width: 100%;
display: flex;
justify-content: space-between;
}
}
/* .box {
padding: 20px;
border-radius: 10px;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
} */
</style>

523
vue/gold-system/vue/gold-system/src/views/managerecharge/activity.vue

@ -0,0 +1,523 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from "element-plus";
import axios from "axios";
import moment from "moment";
import API from "../../api/index.js";
//
const adminData = ref({});
const getAdminData = async function () {
try {
const result = await API.post(
"http://192.168.8.93:10010/admin/userinfo",
{}
);
adminData.value = result;
addActicity.value.adminId = adminData.value.adminId;
console.log("请求成功", result);
console.log("用户信息", user.value);
} catch (error) {
console.log("请求失败", error);
}
};
getAdminData();
//
//
const admin = ref({
adminId: 1,
name: "赵刚",
area: "中国",
});
//
const tableData = ref([]);
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const addObj = ref({
add: "",
});
//
//
const delObj = ref({});
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 1) * 50 + "px";
});
// ref
const Ref = ref(null);
//
//
const get = async function (val) {
try {
//
if (typeof val === "number") {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != "" && getTime.value.endDate != "") {
activity.value.startDate = getTime.value[0];
activity.value.endDate = getTime.value[1];
}
} else {
activity.value.startDate = "";
activity.value.endDate = "";
}
console.log("搜索参数", getObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/select",
{ ...getObj.value, activity: { ...activity.value } }
);
//
console.log("请求成功", result);
//
tableData.value = result.data.list;
console.log("tableData", tableData.value);
//
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const reset = function () {
getObj.value = {};
getObj.value.pageNum = 1;
getObj.value.pageSize = 5;
getTime.value = {};
activity.value = {};
};
//
const addActivityVisible = ref(false);
//
const openAddActivityVisible = function () {
addActivityVisible.value = true;
};
//
const closeAddActivityVisible = function () {
addActivityVisible.value = false;
};
//
const addActicity = function () {
//
addObj.value = {};
addObj.value.adminId = admin.value.adminId;
addObj.value.adminName = admin.value.name;
addObj.value.freeGold = "0";
addObj.value.rechargeRatio = 0;
addObj.value.startTime = null;
addObj.value.endTime = null;
openAddActivityVisible();
};
//
const add = async function () {
Ref.value.validate(async (valid) => {
console.log("valid", valid);
if (valid) {
try {
console.log("添加对象", addObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/add",
addObj.value
);
//
console.log("请求成功", result);
//
get();
//
closeAddActivityVisible();
//
ElMessage({
type: "success",
message: "活动添加成功!",
});
} catch (error) {
console.log("请求失败", error);
//
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
// =========================================================
//
const del = function (row) {
delObj.value.activityId = row.activityId;
console.log("delObj", delObj.value);
};
//
const delConfirm = async function () {
try {
console.log("delObj", delObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/edit",
delObj.value
);
//
console.log("请求成功", result);
//
get();
} catch (error) {
console.log("请求失败", error);
//
}
};
//
//
const handleStartTimeChange = () => {
Ref.value.validateField("endTime");
};
const checkFreeGoldRadio = function (rule, value, callback) {
if (addObj.value.freeGold == 1) {
if (value == "0" || value == null || value == "") {
callback(new Error("请输入免费金币兑换比"));
} else if (value < 0 || isNaN(value)) {
callback(new Error("请输入正确的格式"));
} else {
callback();
}
} else {
callback();
}
};
const checkStartTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("开始时间不能小于当前时间"));
} else {
callback();
}
};
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("结束时间不能小于当前时间"));
} else if (value <= addObj.value.startTime) {
callback(new Error("结束时间不能小于开始时间"));
} else {
callback();
}
};
const rules = reactive({
activityName: [
{ required: true, message: "请输入活动名称", trigger: "blur" },
],
freeGold: [
{ required: true, message: "请选择是否赠送免费金币", trigger: "blur" },
],
rechargeRatio: [{ validator: checkFreeGoldRadio, trigger: "blur" }],
startTime: [
{ required: true, message: "请选择开始时间", trigger: "blur" },
{ validator: checkStartTime, trigger: "blur" },
],
endTime: [
{ required: true, message: "请选择结束时间", trigger: "blur" },
{ validator: checkEndTime, trigger: "blur" },
],
});
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === "number") {
console.log(
"总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
);
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
console.log("输入的数字合法");
get();
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
};
//
onMounted(async function () {
get();
});
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-input
v-model="activity.activityName"
style="width: 240px"
placeholder="请输入活动名称"
clearable
/>
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">添加时间</el-text>
<el-date-picker
v-model="getTime"
type="daterange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
/>
</div>
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
<el-button
plain
@click="addActicity()"
style="color: #048efb; border: 1px solid #048efb"
>新增活动</el-button
>
</div>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="activityName" label="活动名称" />
<el-table-column prop="startTime" label="开始时间" />
<el-table-column prop="endTime" label="结束时间" />
<el-table-column prop="rechargeRatio" label="免费兑换比">
<template #default="scope">
<span>{{ scope.row.rechargeRatio }}:1</span>
</template>
</el-table-column>
<el-table-column prop="status" label="状态">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>进行中</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="red-dot"></span>
<span>未开始</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="grey-dot"></span>
<span>已结束</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column prop="name" label="添加人" />
<el-table-column prop="createTime" label="添加时间">
<template #default="scope">
{{ moment(scope.row.createTime).format("YYYY-MM-DD HH:mm:ss") }}
</template>
</el-table-column>
<el-table-column prop="operation" label="操作">
<template #default="scope">
<el-popconfirm
title="确定将此条活动删除吗?"
@confirm="delConfirm"
>
<template #reference>
<el-button type="primary" text @click="del(scope.row)">
删除
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">
确定
</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
:page-size="getObj.pageSize"
layout="slot"
:total="total"
>
<div>{{ total }},每页</div>
<el-select
v-model="getObj.pageSize"
class="page-size"
@change="get()"
style="width: 80px"
>
<el-option
v-for="item in [5, 6, 7, 8, 9, 10]"
:key="item"
:label="item"
:value="item"
></el-option>
</el-select>
<div></div>
</el-pagination>
<el-pagination
background
layout="prev, pager, next, slot"
:page-size="getObj.pageSize"
:total="total"
:current-page="getObj.pageNum"
@current-change="get"
>
<div>跳至</div>
<el-input
v-model="getObj.pageNum"
style="width: 40px"
@change="checkNumber"
/>
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog
v-model="addActivityVisible"
title="新增活动"
width="500"
:before-close="closeAddActivityVisible"
>
<template #footer>
<el-form
ref="Ref"
:model="addObj"
:rules="rules"
label-width="auto"
style="max-width: 600px"
>
<el-form-item prop="activityName" label="活动名称:">
<el-input
v-model="addObj.activityName"
placeholder="请输入活动名称"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="freeGold" label="免费金币:">
<el-radio-group v-model="addObj.freeGold">
<el-radio value="0" @change="addObj.rechargeRatio = '0'"
>无赠送</el-radio
>
<el-radio value="1">有赠送</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="rechargeRatio" label="免费金币兑换比:">
<el-input
v-model="addObj.rechargeRatio"
:disabled="addObj.freeGold === '0' ? true : false"
placeholder="请输入"
style="width: 80px"
/>1
<div style="color: grey">(提示当前规则每10新币可兑换1免费金币)</div>
</el-form-item>
<el-form-item prop="startTime" label="开始时间:">
<el-date-picker
v-model="addObj.startTime"
type="date"
placeholder="请选择开始时间"
@change="handleStartTimeChange"
/>
</el-form-item>
<el-form-item prop="endTime" label="结束时间:">
<el-date-picker
v-model="addObj.endTime"
type="date"
placeholder="请选择结束时间"
/>
</el-form-item>
<el-form-item label="添加人:">
<el-input v-model="adminData.name" disabled style="width: 220px" />
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeAddActivityVisible">取消</el-button>
<el-button type="primary" @click="add()"> 提交 </el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

117
vue/gold-system/src/views/managerecharge/rate.vue → vue/gold-system/vue/gold-system/src/views/managerecharge/rate.vue

@ -4,6 +4,28 @@ import { ElMessageBox } from "element-plus";
import axios from "axios";
import { createApp } from "vue";
import moment from "moment";
import API from "../../api/index.js";
//
const adminData = ref({
name: "",
});
const getAdminData = async function () {
try {
const result = await API.post(
"http://192.168.8.93:10010/admin/userinfo",
{}
);
adminData.value = result;
rateAdd.value.adminId = adminData.value.adminId;
rateEdit.value.adminId = adminData.value.adminId;
console.log("请求成功", result);
console.log("用户信息", user.value);
} catch (error) {
console.log("请求失败", error);
}
};
getAdminData();
const regeAdd = ref(false);
const regeEdit = ref(false);
@ -26,7 +48,7 @@ const get = async function (val) {
console.log("搜索参数", getObj.value);
// POST
const result = await axios.post("http://192.168.8.174:10010/rates/search", {
const result = await API.post("http://192.168.8.93:10010/rates/search", {
...getObj.value,
rate: { ...value1.value },
});
@ -34,11 +56,11 @@ const get = async function (val) {
//
console.log("请求成功", result);
//
tableData.value = result.data.data.list;
tableData.value = result.data.list;
console.log("tableData", tableData.value);
// UI
//
total.value = result.data.data.total;
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
@ -54,8 +76,8 @@ const addRate = async function () {
try {
console.log("搜索参数", getObj.value);
// POST
const result = await axios.post(
"http://192.168.8.174:10010/rates/add",
const result = await API.post(
"http://192.168.8.93:10010/rates/add",
rateAdd.value
);
@ -101,14 +123,14 @@ const getEditData = async function (row) {
try {
console.log("搜索参数", getObj.value);
// POST
const result = await axios.post("http://192.168.8.174:10010/rates/search", {
const result = await API.post("http://192.168.8.93:10010/rates/search", {
rate: { rateId: row.rateId },
});
//
console.log("请求成功", result);
//
rateEdit.value = result.data.data[0];
rateEdit.value = result.data[0];
} catch (error) {
console.log("请求失败", error);
//
@ -118,8 +140,8 @@ const editRate = async function () {
try {
console.log("搜索参数", rateEdit.value);
// POST
const result = await axios.post(
"http://192.168.8.174:10010/rates/update",
const result = await API.post(
"http://192.168.8.93:10010/rates/update",
rateEdit.value
);
//
@ -145,8 +167,8 @@ const edit = () => {
const deleteRate = async function (row) {
try {
// POST
const result = await axios.post(
"http://192.168.8.174:10010/rates/delete/ " + row.rateId
const result = await API.post(
"http://192.168.8.93:10010/rates/delete/ " + row.rateId
);
//
console.log("请求成功", result);
@ -235,16 +257,24 @@ const checkStartTime = function (rule, value, callback) {
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("结束时间不能小于当前时间"));
} else if (value <= addObj.value.startTime) {
} else if (value <= rateAdd.value.startTime) {
callback(new Error("结束时间不能小于开始时间"));
} else {
callback();
}
};
const checkFreeGoldRadio = function (rule, value, callback) {
if (value == "0" || value == null || value == "") {
callback(new Error("请输入汇率比"));
} else if (value < 0 || isNaN(value)) {
callback(new Error("请输入正确的格式"));
} else {
callback();
}
};
const rules = reactive({
currency: [{ required: true, message: "请选择货币名称", trigger: "blur" }],
exchangeRate: [{ required: true, message: "请输入汇率", trigger: "blur" }],
updateName: [{ required: true, message: "请输入添加人", trigger: "blur" }],
exchangeRate: [{ validator: checkFreeGoldRadio, trigger: "blur" }],
startTime: [
{ required: true, message: "请选择开始时间", trigger: "blur" },
{ validator: checkStartTime, trigger: "blur" },
@ -255,6 +285,12 @@ const rules = reactive({
],
});
//
const handledelete = function () {
value1.value = {};
startTime.value = "";
endTime.value = "";
};
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === "number") {
@ -357,7 +393,7 @@ const checkNumber = function () {
<span>{{ formatDate(scope.row.updateTime) }}</span>
</template>
</el-table-column>
<el-table-column prop="updateName" label="更新人" :span="4" />
<el-table-column prop="adminName" label="更新人" :span="4" />
<el-table-column label="操作" :span="4">
<template #default="scope">
<el-button
@ -452,8 +488,8 @@ const checkNumber = function () {
<p class="unit">:1</p>
<p>(提示当前规则每 5 元人民币可兑换 1 新币)</p>
</el-form-item>
<el-form-item prop="updateName" label="提交人:">
<el-input v-model="rateAdd.updateName" style="width: 240px" />
<el-form-item prop="adminId" label="提交人:">
<el-input :value="adminData.name" disabled style="width: 240px" />
</el-form-item>
<el-form-item prop="startTime" label="开始时间:">
<el-date-picker
@ -517,52 +553,7 @@ const checkNumber = function () {
<p>(提示当前规则每 5 元人民币可兑换 1 新币)</p>
</el-form-item>
<el-form-item label="提交人:">
<el-input v-model="rateEdit.updateName" style="width: 240px" />
</el-form-item>
<el-form-item>
<div class="dialog-footer">
<el-button type="primary" @click="edit">修改</el-button>
<el-button @click="regeEdit = false">取消</el-button>
</div>
</el-form-item>
</el-form>
</template>
</el-dialog>
<!-- 这是编辑弹窗 -->
<el-dialog v-model="regeEdit" title="修改汇率" width="500">
<template #footer>
<el-form
ref="ruleFormRef"
style="max-width: 600px"
:model="rateEdit"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item label="货币名称:">
<el-select
v-model="rateEdit.currency"
placeholder="请选择"
style="width: 240px"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="汇率:">
<el-input v-model="rateEdit.exchangeRate" style="width: 120px" />
<p class="unit">:1</p>
<p>(提示当前规则每 5 元人民币可兑换 1 新币)</p>
</el-form-item>
<el-form-item label="提交人:">
<el-input v-model="rateEdit.adminName" style="width: 240px" />
<el-input disabled :value="adminData.name" style="width: 240px" />
</el-form-item>
<el-form-item>
<div class="dialog-footer">

213
vue/gold-system/src/views/recharge/addRecharge.vue → vue/gold-system/vue/gold-system/src/views/recharge/addRecharge.vue

@ -5,26 +5,70 @@ import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import axios from "axios";
import { ElMessageBox } from "element-plus";
import API from "../../api/index.js";
import moment from "moment";
const adminData = ref({});
const getAdminData = async function () {
try {
const result = await API.post(
"http://192.168.8.93:10010/admin/userinfo",
{}
);
adminData.value = result;
addRecharge.value.adminId = adminData.value.adminId;
addRecharge.value.area = adminData.value.area;
console.log("请求成功", result);
console.log("用户信息", user.value);
} catch (error) {
console.log("请求失败", error);
}
};
getAdminData();
//
const addRecharge = ref({
rechargeVoucher: "",
rechargeWay: "客服充值",
adminId: "1",
freeGold: 0,
rechargeGold: 0,
paidGold: "",
});
//
const add = async function () {
try {
console.log("开始添加充值信息", addRecharge.value);
// POST
const result = await axios.post(
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge/add",
addRecharge.value
);
if (result.code === 0) {
ElMessage.error("添加失败");
return;
}
//
console.log("请求成功", result);
//
console.log("用户信息", user.value);
//
ElMessage.success("添加成功");
//
addRecharge.value = {
adminId: adminData.value.adminId,
area: adminData.value.area,
rechargeVoucher: "",
rechargeWay: "客服充值",
freeGold: Number(0),
rechargeGold: 1,
paidGold: "",
};
user.value = {};
// addRecharge.value.adminId = adminData.value.adminId;
// addRecharge.value.area = adminData.value.area;
// addRecharge.value.rechargeVoucher = "";
// addRecharge.value.rechargeWay = "";
// addRecharge.value.freeGold = 0;
// addRecharge.value.rechargeGold = 0;
// addRecharge.value.paidGold = "";
} catch (error) {
console.log("请求失败", error);
//
@ -37,8 +81,6 @@ const addBefore = () => {
.then(() => {
add();
console.log("添加成功");
imageUrl.value = "";
addRecharge.value = {};
})
.catch(() => {
console.log("取消添加");
@ -56,39 +98,48 @@ const addBefore = () => {
//
//
const Ref = ref(null);
const checkEndTime = function (rule, value, callback) {
if (value <= new Date()) {
callback(new Error("付款时间不能小于当前时间"));
const checkFreeGoldRadio = function (rule, value, callback) {
if (value == "0" || value == null || value == "") {
callback(new Error("请输入充值金币"));
} else if (value < 0 || isNaN(value)) {
callback(new Error("请输入正确的格式"));
} else {
callback();
}
};
const rules = reactive({
jwcode: [{ required: true, message: "请输入精网号", trigger: "blur" }],
activityId: [{ required: true, message: "请选择活动名称", trigger: "blur" }],
paidGold: [{ required: true, message: "请输入充值金币", trigger: "blur" }],
paidGold: [{ validator: checkFreeGoldRadio, trigger: "blur" }],
rechargeGold: [
{ required: true, message: "请输入充值金额", trigger: "blur" },
],
payWay: [{ required: true, message: "请选择付款方式", trigger: "blur" }],
rechargeTime: [
{ required: true, message: "请选择交款时间", trigger: "blur" },
{ validator: checkEndTime, trigger: "blur" },
],
});
//
const user = ref({});
const user = ref({
firstRechargeTime: "",
});
const getUser = async function (jwcode) {
try {
// POST
const result = await axios.post("http://192.168.8.93:10020/recharge/user", {
const result = await API.post("http://192.168.8.93:10010/recharge/user", {
jwcode: jwcode,
});
//
console.log("请求成功", result);
//
user.value = result.data.data[0];
user.value = result.data[0];
user.value.A =
Number(user.value.pendingRechargeTimes) +
Number(user.value.pendingSpendTimes);
console.log("用户信息", user.value);
console.log("用户信息", user.value.firstRechargeDate);
if (result.data.code === 0) {
ElMessage.error(result.data.msg);
} else {
@ -106,7 +157,7 @@ const activity = ref([]);
const getActivity = async function () {
try {
// POST
const result = await axios.post(
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/select",
{}
);
@ -114,7 +165,7 @@ const getActivity = async function () {
//
console.log("请求成功", result);
//
activity.value = result.data.data;
activity.value = result.data;
console.log("活动信息", activity.value);
} catch (error) {
console.log("请求失败", error);
@ -128,15 +179,12 @@ const currency = ref([]);
const getCurrency = async function () {
try {
// POST
const result = await axios.post(
"http://192.168.8.174:10010/rates/search",
{}
);
const result = await API.post("http://192.168.8.93:10010/rates/search", {});
//
console.log("货币请求成功", result);
//
currency.value = result.data.data;
currency.value = result.data;
console.log("tableData", currency.value);
// UI
} catch (error) {
@ -153,14 +201,13 @@ const imageUrl = ref("");
const handleAvatarSuccess = (response, uploadFile) => {
imageUrl.value = URL.createObjectURL(uploadFile.raw);
console.log("图片上传成功", response, uploadFile);
addRecharge.value.rechargeVoucher =
"http://192.168.8.93:10010/upload/" + response.data;
addRecharge.value.rechargeVoucher = `http://192.168.8.93:10010/upload/${response.data}`;
console.log("图片名称", addRecharge.value.rechargeVoucher);
};
//
const beforeAvatarUpload = (rawFile) => {
if (rawFile.type !== "image/jpeg") {
ElMessage.error("Avatar picture must be JPG format!");
if (rawFile.type !== "image/jpeg" && rawFile.type !== "image/png") {
ElMessage.error("图片格式必须为jpg或png!");
return false;
} else if (rawFile.size / 1024 / 1024 > 2) {
ElMessage.error("Avatar picture size can not exceed 2MB!");
@ -186,15 +233,42 @@ const options = [
];
const calculatedFreeGold = computed(() => {
return addRecharge.value.paidGold * addRecharge.value.activityId;
if (!addRecharge.value.activityId == 0) {
const paidGold = Number(addRecharge.value.paidGold) || 0;
const activityId = Number(addRecharge.value.activityId) || 1; // 0
return Math.ceil(paidGold / activityId);
}
});
const calculatedRechargeGold = computed(() => {
addRecharge.value.paidGold * addRecharge.value.reteId;
if (!addRecharge.value.rateId == 0) {
const paidGold = Number(addRecharge.value.paidGold) || 0;
const rateId = Number(addRecharge.value.rateId) || 1; // 0
return Math.ceil(paidGold * rateId);
}
});
watch(calculatedFreeGold, (newVal) => {
addRecharge.value.freeGold = Number(newVal);
});
watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
addRecharge.value.freeGold = newVal;
addRecharge.value.rechargeGold = newVal;
watch(calculatedRechargeGold, (newVal) => {
addRecharge.value.rechargeGold = Number(newVal);
});
//
const deleteRecharge = function () {
addRecharge.value = {
adminId: adminData.value.adminId,
area: adminData.value.area,
rechargeVoucher: "",
rechargeWay: "客服充值",
freeGold: Number(0),
rechargeGold: 0,
paidGold: "",
};
imageUrl.value = "";
};
</script>
<template>
@ -206,6 +280,7 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
:rules="rules"
label-width="auto"
style="max-width: 600px"
class="add-form"
>
<el-form-item prop="jwcode" label="精网号">
<el-input v-model="addRecharge.jwcode" style="width: 220px" />
@ -226,7 +301,7 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
v-for="item in activity"
:key="item.value"
:label="item.activityName"
:value="item.rechargeRatio"
:value="item.activityId"
/>
</el-select>
</el-form-item>
@ -234,15 +309,10 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
<el-input v-model="addRecharge.paidGold" style="width: 100px" />
<p style="margin-right: 20px"></p>
<p>免费金币</p>
<el-input
v-model="addRecharge.freeGold"
disabled
:value="addRecharge.paidGold * addRecharge.activityId"
style="width: 100px"
/>
<el-input v-model="addRecharge.freeGold" disabled style="width: 100px" />
<p></p>
</el-form-item>
<el-form-item label="充值金额">
<el-form-item prop="rechargeGold" label="充值金额">
<el-select
prop="rechargeGold"
v-model="addRecharge.rateId"
@ -258,7 +328,7 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
</el-select>
<el-input
disabled
:value="addRecharge.paidGold * addRecharge.rateId"
v-model="addRecharge.rechargeGold"
style="width: 200px"
/>
</el-form-item>
@ -315,22 +385,19 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
<el-form-item prop="submitter" label="提交人">
<el-input
style="width: 300px"
value="张三"
:value="adminData.name"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
<el-button @click="deleteRecharge" style="margin-left: 280px"
>重置</el-button
>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form>
<el-button @click="closeAddActivityVisible" style="margin-left: 280px"
>取消</el-button
>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
<!-- 客户信息栏 -->
<el-card
style="width: 700px; float: right; margin-top: -470px; margin-right: 100px"
>
<el-card style="width: 700px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
@ -345,7 +412,9 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="历史金币总数"> </el-form-item>
<el-form-item label="历史金币总数">
<p>{{ user.totalRechargeGold }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="精网号">
@ -353,25 +422,43 @@ watch(calculatedFreeGold, calculatedRechargeGold, (newVal) => {
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前金币总数"> </el-form-item>
<el-form-item label="当前金币总数">
<p>{{ user.sumgold }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="首次充值日期"> </el-form-item>
<el-form-item label="首次充值日期">
<p v-if="user.firstRechargeDate">
{{ moment(user.firstRechargeDate).format("YYYY-MM-DD HH:mm:ss") }}
</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="充值次数"> </el-form-item>
<el-form-item label="充值次数">
<p>{{ user.rechargeTimes }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责客服"> </el-form-item>
<el-form-item label="负责客服">
<p>{{ adminData.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消费次数"> </el-form-item>
<el-form-item label="消费次数">
<p>{{ user.spendTimes }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属门店"> </el-form-item>
<el-form-item label="所属门店">
<p>{{ adminData.area }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="待审核"> </el-form-item>
<el-form-item label="待审核">
<p>
{{ user.A }}
</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
@ -415,4 +502,12 @@ p {
height: 50px;
text-align: center;
}
.add-form {
margin-top: 50px;
max-width: 50%;
float: left;
}
.customer-info {
max-width: 50%;
}
</style>

41
vue/gold-system/src/views/recharge/adminRecharge.vue → vue/gold-system/vue/gold-system/src/views/recharge/adminRecharge.vue

@ -5,12 +5,13 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { AiFillRead } from "vue-icons-plus/ai";
import axios from 'axios';
import moment from 'moment';
import API from "../../api/index.js";
//
//
const admin = ref({
adminId: 1,
name: '客服A',
area: '新加坡'
name: '赵刚',
area: '中国'
})
//
@ -59,6 +60,10 @@ const payWay = [
value: '借记卡',
label: '借记卡',
},
{
value: '现金充值',
label: '现金充值',
},
]
// ==========================================================
//
@ -90,15 +95,15 @@ const get = async function (val) {
}
console.log('搜索参数', getObj.value);
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
const result = await API.post('http://192.168.8.93:10010/recharge/recharge', { ...getObj.value, rechargeVo: { ...rechargeVo.value } });
//
console.log('请求成功', result);
//
tableData.value = result.data.data.list;
tableData.value = result.data.list;
console.log('tableData', tableData.value);
//
total.value = result.data.data.total;
total.value = result.data.total;
console.log('total', total.value);
} catch (error) {
console.log('请求失败', error);
@ -113,7 +118,7 @@ const reset = function () {
rechargeVo.value.area = '';
rechargeVo.value.startDate = '';
rechargeVo.value.endDate = '';
get();
getTime.value = {};
}
//
const getToday = function () {
@ -183,12 +188,12 @@ const handleClick = function (tab, event) {
const getActivity = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/activity/select', {});
const result = await API.post('http://192.168.8.93:10010/recharge/activity/select', {});
//
console.log('请求成功', result);
//
activity.value = result.data.data;
activity.value = result.data;
console.log('activity', activity.value);
} catch (error) {
console.log('请求失败', error);
@ -199,11 +204,11 @@ const getActivity = async function () {
const getArea = async function () {
try {
// POST
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge', {});
const result = await API.post('http://192.168.8.93:10010/recharge/recharge', {});
//
console.log('请求成功', result);
//
allData.value = result.data.data;
allData.value = result.data;
console.log('allData', allData.value);
//
area.value = [...new Set(allData.value.map(item => item.area))]
@ -224,7 +229,7 @@ const del = function (row) {
const delConfirm = async function () {
try {
console.log('delObj2', delObj.value);
const result = await axios.post('http://192.168.8.93:10010/recharge/recharge/edit', delObj.value);
const result = await API.post('http://192.168.8.93:10010/recharge/recharge/edit', delObj.value);
console.log('删除成功', result);
//
get();
@ -277,7 +282,7 @@ onMounted(async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large"
style="width: 240px">
style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select>
@ -287,7 +292,7 @@ onMounted(async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large"
style="width: 240px">
style="width: 240px" clearable>
<el-option v-for="item in payWay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
@ -298,7 +303,7 @@ onMounted(async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large"
style="width: 240px">
style="width: 240px" clearable>
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select>
</div>
@ -337,7 +342,7 @@ onMounted(async function () {
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="username" label="姓名" width="100px" />
<el-table-column prop="homilyId" label="精网号" width="150px" />
<el-table-column prop="jwcode" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="activityName" label="活动名称" width="150px" />
<el-table-column prop="rechargeGold" label="充值金额" width="100px" />
@ -347,7 +352,7 @@ onMounted(async function () {
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column prop="rechargeVoucher" label="支付凭证" width="150px">
<template #default="scope">
<el-image :src="scope.row.rechargeVoucher" alt="凭证" style="width: 50px; height: 50px" />
<el-image :preview-src-list="[scope.row.rechargeVoucher]" preview-teleported="true" :src="scope.row.rechargeVoucher" alt="凭证" style="width: 50px; height: 50px" />
</template>
</el-table-column>
<el-table-column prop="name" label="提交人" width="100px" />
@ -382,10 +387,10 @@ onMounted(async function () {
<el-table-column prop="createTime" label="提交时间" width="200px" />
<el-table-column fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<el-popconfirm title="确定将此条活动修改(删除)吗?" @confirm="delConfirm">
<el-popconfirm title="确定将此条活动删除吗?" @confirm="delConfirm">
<template #reference>
<el-button type="primary" text @click="del(scope.row)">
修改
删除
</el-button>
</template>
<template #actions="{ confirm, cancel }">

452
vue/gold-system/vue/gold-system/src/views/recharge/allRecharge.vue

@ -0,0 +1,452 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import { ElMessage, ElMessageBox } from "element-plus";
import { AiFillRead } from "vue-icons-plus/ai";
import axios from "axios";
import moment from "moment";
import API from "../../api/index.js";
//
//
const tableData = ref([]);
// ======================================
// rechargeVo
const rechargeVo = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const total = ref(100);
//
const getTime = ref([]);
//
const activity = ref([]);
//
const allData = ref([]);
//
const area = ref([]);
//
const activeName = ref("all");
//
const payWay = [
{
value: "微信",
label: "微信",
},
{
value: "支付宝",
label: "支付宝",
},
{
value: "银联",
label: "银联",
},
{
value: "信用卡",
label: "信用卡",
},
{
value: "借记卡",
label: "借记卡",
},
{
value: "现金充值",
label: "现金充值",
},
];
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 2) * 60 + "px";
});
//
// ==============================================================
//
const get = async function (val) {
try {
//
if (typeof val === "number") {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != "" && getTime.value.endDate != "") {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = "";
rechargeVo.value.endDate = "";
}
console.log("搜索参数", getObj.value);
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge",
{ ...getObj.value, rechargeVo: { ...rechargeVo.value } }
);
//
console.log("请求成功", result);
//
tableData.value = result.data.list;
console.log("tableData", tableData.value);
//
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const reset = function () {
rechargeVo.value.activityId = "";
rechargeVo.value.payWay = "";
rechargeVo.value.area = "";
rechargeVo.value.startDate = "";
rechargeVo.value.endDate = "";
getTime.value = {};
};
//
const getToday = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
);
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const adminAll = function () {
console.log("adminAll");
rechargeVo.value.status = "";
get();
};
//
const adminWait = function () {
rechargeVo.value.status = 0;
get();
console.log("adminWait");
};
//
const adminPass = function () {
rechargeVo.value.status = 1;
get();
console.log("adminPass");
};
//
const adminReject = function () {
rechargeVo.value.status = 2;
get();
console.log("adminReject");
};
//
const handleClick = function (tab, event) {
if (tab.props.name === "all") {
adminAll();
} else if (tab.props.name === "wait") {
adminWait();
} else if (tab.props.name === "pass") {
adminPass();
} else if (tab.props.name === "reject") {
adminReject();
}
};
//
const getActivity = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/select",
{}
);
//
console.log("请求成功", result);
//
activity.value = result.data;
console.log("activity", activity.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const getArea = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge",
{}
);
//
console.log("请求成功", result);
//
allData.value = result.data;
console.log("allData", allData.value);
//
area.value = [...new Set(allData.value.map((item) => item.area))];
console.log("地区", area.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === "number") {
console.log(
"总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
);
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
console.log("输入的数字合法");
get();
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
};
//
onMounted(async function () {
await get();
getActivity();
await getArea();
});
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px;">
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" size="large" style="width: 240px"
clearable>
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" size="large" style="width: 240px" clearable>
<el-option v-for="item in payWay" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" size="large" style="width: 240px" clearable>
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" />
<el-button style="margin-left: 10px;" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="全部" name="all"></el-tab-pane>
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
</el-tabs>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="username" label="姓名" width="100px" />
<el-table-column prop="jwcode" label="精网号" width="150px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="activityName" label="活动名称" width="150px" />
<el-table-column prop="rechargeGold" label="充值金额" width="100px" />
<el-table-column prop="rechargeWay" label="充值方式" width="100px" />
<el-table-column prop="paidGold" label="充值金币" width="100px" />
<el-table-column prop="freeGold" label="免费金币" width="100px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="payWay" label="支付方式" width="100px" />
<el-table-column prop="rechargeVoucher" label="支付凭证" width="150px">
<template #default="scope">
<el-image :preview-src-list="[scope.row.rechargeVoucher]" preview-teleported="true"
:src="scope.row.rechargeVoucher" alt="凭证" style="width: 50px; height: 50px" />
</template>
</el-table-column>
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="状态" width="100px">
<template #default="scope">
<span v-if="scope.row.status === 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>
</div>
</span>
</template>
</el-table-column>
<el-table-column prop="reson" label="驳回理由" width="200px" show-overflow-tooltip />
<el-table-column prop="rechargeTime" label="交款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="提交时间" width="200px" />
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
<div>{{ total }},每页 </div>
<el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
<el-option v-for="item in [5, 6, 7, 8, 9, 10]" :key="item" :label="item" :value="item"></el-option>
</el-select>
<div> </div>
</el-pagination>
<el-pagination background layout="prev, pager, next,slot" :page-size="getObj.pageSize" :total="total"
:current-page="getObj.pageNum" @current-change="get">
<div>跳至</div>
<el-input v-model="getObj.pageNum" style="width: 40px;" @change="checkNumber" />
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" layout="slot" :total="total">
<div>{{ total }},每页</div>
<el-select v-model="getObj.pageSize" class="page-size" @change="get()" style="width: 80px">
<el-option v-for="item in [5, 6, 7, 8, 9, 10]" :key="item" :label="item" :value="item"></el-option>
</el-select>
<div></div>
</el-pagination>
<el-pagination background layout="prev, pager, next,slot" :page-size="getObj.pageSize" :total="total"
:current-page="getObj.pageNum" @current-change="get">
<div>跳至</div>
<el-input v-model="getObj.pageNum" style="width: 40px" @change="checkNumber" />
<div></div>
</el-pagination>
</div>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

463
vue/gold-system/vue/gold-system/src/views/refund/addRefund.vue

@ -0,0 +1,463 @@
<script setup>
import { reactive } from "vue";
import { ref, computed, watch } from "vue";
import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import axios from "axios";
import { ElMessageBox } from "element-plus";
import API from "../../api/index.js";
import moment from "moment";
//
const adminData = ref({});
const getAdminData = async function () {
try {
const result = await API.post(
"http://192.168.8.93:10010/admin/userinfo",
{}
);
adminData.value = result;
addRefund.value.adminId = adminData.value.adminId;
console.log("请求成功", result);
console.log("用户信息", user.value);
} catch (error) {
console.log("请求失败", error);
}
};
getAdminData();
//
const addRefund = ref({
updateType: "退款",
allCoin: 0,
contactId: "",
refundGoods: "",
freeCoin: 0,
rechargeCoin: 0,
taskCoin: 0,
});
//
const cancel = function () {
addRefund.value = {};
addRefund.value.updateType = "退款";
addRefund.value.rechargeCoin = 0;
addRefund.value.freeCoin = 0;
addRefund.value.taskCoin = 0;
addRefund.value.allCoin = 0;
addRefund.value.adminId = adminData.value.adminId;
};
// 退
const add = async function () {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/refund/add",
addRefund.value
);
if (result.code === 0) {
ElMessage.error(result.msg);
return;
}
console.log("请求成功", result);
ElMessage.success("添加成功");
//
addRefund.value = {};
addRefund.value.adminId = adminData.value.adminId;
addRefund.value.updateType = "退款";
addRefund.value.allCoin = 0;
addRefund.value.contactId = "";
addRefund.value.refundGoods = "";
addRefund.value.freeCoin = 0;
addRefund.value.rechargeCoin = 0;
addRefund.value.taskCoin = 0;
user.value = {};
} catch (error) {
console.log("请求失败", error);
//
}
};
const addBefore = () => {
Ref.value.validate(async (valid) => {
if (valid) {
ElMessageBox.confirm("确认添加?")
.then(() => {
addRefund.value.freeCoin = Number(-addRefund.value.freeCoin);
addRefund.value.rechargeCoin = Number(-addRefund.value.rechargeCoin);
addRefund.value.taskCoin = Number(-addRefund.value.taskCoin);
add();
console.log("添加成功");
addRefund.value.allCoin = 0;
(addRefund.value.freeCoin = 0),
(addRefund.value.rechargeCoin = 0),
(addRefund.value.taskCoin = 0),
(addRefund.value = {});
})
.catch(() => {
console.log("取消添加");
});
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
});
};
//
//
const Ref = ref(null);
const startChange = (val) => {};
const rules = reactive({
jwcode: [{ required: true, message: "请输入精网号", trigger: "blur" }],
refundType: [{ required: true, message: "请选择退款类型", trigger: "blur" }],
contactId: [{ required: true, message: "请选择退款商品", trigger: "blur" }],
taskCoin: [{ required: true, message: "请输入任务金币", trigger: "blur" }],
freeCoin: [{ required: true, message: "请输入免费金币", trigger: "blur" }],
rechargeCoin: [
{ required: true, message: "请输入充值金币", trigger: "blur" },
],
allCoin: [
{ required: true, message: "请选择付款方式", trigger: "blur" },
{
validator: (rule, value) => {
if (value === 0) {
return Promise.reject(new Error("总金币不能为0"));
}
return Promise.resolve();
},
trigger: "blur",
},
],
});
//
const user = ref({});
const getUser = async function (jwcode) {
try {
// POST
const result = await API.post("http://192.168.8.93:10010/recharge/user", {
jwcode: jwcode,
});
//
console.log("请求成功", result);
//
user.value = result.data[0];
user.value.A =
Number(user.value.pendingRechargeTimes) +
Number(user.value.pendingSpendTimes);
console.log("用户信息", user.value);
if (result.data.code === 0) {
ElMessage.error(result.data.msg);
} else {
ElMessage.success(result.data.msg);
}
} catch (error) {
console.log("请求失败", error);
ElMessage.error("查询失败,请检查精网号是否正确");
//
}
};
const calculatedAllGold = computed(() => {
const sum =
Number(addRefund.value.freeCoin) +
Number(addRefund.value.rechargeCoin) +
Number(addRefund.value.taskCoin);
return !isNaN(sum) ? sum : 0;
});
watch(calculatedAllGold, (newVal) => {
addRefund.value.allCoin = newVal;
});
const AAA = computed(() => {
return addRefund.value.jwcode;
});
watch(AAA, (newVal) => {});
// 退
const refundType = [
{
value: "退款商品",
label: "退款商品",
},
{
value: "退款金币",
label: "退款金币",
},
];
//
const goods = ref([]);
const getGoods = async function (jwcode) {
try {
// POST
const result = await API.post(
"http://192.168.8.93:10010/consume/getDeatil/" + addRefund.value.jwcode
);
//
console.log("请求成功", result);
//
goods.value = result.data;
console.log("用户信息", goods.value);
} catch (error) {
console.log("请求失败", error);
ElMessage.error("查询失败,请检查精网号是否正确");
//
}
};
const calculatedRechargeGoods = computed(() => {
return (
+addRefund.value.freeCoin +
+addRefund.value.rechargeCoin +
+addRefund.value.taskCoin
);
});
watch(calculatedRechargeGoods, (newVal) => {
addRefund.value.allCoin = newVal;
});
watch(calculatedRechargeGoods, (newVal) => {
addRefund.value.allCoin = newVal;
console.log("计算的总金币", newVal);
});
//
const handleSelectionChange = (value) => {
const selectedItem = goods.value.find((item) => item.detailId === value);
if (selectedItem) {
addRefund.value.contactId = selectedItem.detailId;
addRefund.value.refundGoods = selectedItem.productName;
}
console.log("选择的商品", addRefund.value.refundGoods);
console.log("选择的商品ID", addRefund.value.contactId); // ID
};
</script>
<template>
<div>新增退款</div>
<el-form
:model="addRefund"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
class="form-style"
>
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addRefund.jwcode"
style="width: 220px"
@change="getGoods(addRefund.jwcode)"
/>
<el-button
type="primary"
@click="getUser(addRefund.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
<el-form-item prop="refundType" label="退款类型">
<el-select
v-model="addRefund.refundType"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item prop="contactId" label="退款商品">
<el-select
v-model="addRefund.contactId"
placeholder="请选择"
style="width: 300px"
@change="handleSelectionChange"
>
<el-option
v-for="item in goods"
:key="item.value"
:label="item.productName"
:value="item.detailId"
/>
</el-select>
</el-form-item>
<div style="display: flex; align-items: center">
<el-form-item prop="taskCoin" label="任务金币" style="float: left">
<el-input v-model="addRefund.taskCoin" style="width: 100px" />
<p></p>
</el-form-item>
<el-form-item
prop="freeCoin"
label="免费金币"
style="margin-left: -20px; float: left"
>
<el-input
v-model="addRefund.freeCoin"
style="float: left; width: 100px"
/>
<p></p>
</el-form-item>
<el-form-item
prop="rechargeCoin"
label="充值金币"
style="margin-left: -20px"
>
<el-input
v-model="addRefund.rechargeCoin"
style="float: left; width: 100px"
/>
<p></p>
</el-form-item>
</div>
<el-form-item prop="allCoin" label="退款金币总数">
<el-input disabled v-model="addRefund.allCoin" style="width: 100px">
</el-input>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addRefund.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-form-item prop="commitName" label="提交人">
<el-input
style="width: 300px"
:value="adminData.name"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
<el-button @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card style="width: 700px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 600px"
label-position="left"
>
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<el-row style="margin-top: 20px">
<el-col :span="12">
<el-form-item label="姓名:">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="历史金币总数">
<p>{{ user.totalRechargeGold }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前金币总数">
<p>{{ user.sumgold }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="首次充值日期">
<p v-if="user.firstRechargeDate">
{{ moment(user.firstRechargeDate).format("YYYY-MM-DD HH:mm:ss") }}
</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="充值次数">
<p>{{ user.rechargeTimes }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责客服">
<p>{{ adminData.name }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消费次数">
<p>{{ user.spendTimes }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属门店">
<p>{{ adminData.area }}</p>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="待审核">
<p>
{{ user.A }}
</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</template>
<style scoped>
p {
margin: 0px;
}
.el-form-item {
margin-left: 50px;
}
/* 上传图片的格式 */
.avatar-uploader .avatar {
width: 50px;
height: 50px;
display: block;
}
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 50px;
height: 50px;
text-align: center;
}
.form-style {
margin-top: 50px;
max-width: 50%;
float: left;
}
.form-style2 {
max-width: 50%;
}
</style>

117
vue/gold-system/src/views/refund/allRefund.vue → vue/gold-system/vue/gold-system/src/views/refund/allRefund.vue

@ -4,16 +4,17 @@ import ElementPlus from "element-plus";
import { AiFillRead } from "vue-icons-plus/ai";
import axios from "axios";
import moment from "moment";
import API from "../../api/index.js";
//
//
const tableData = ref([]);
// ======================================
// rechargeVo
const rechargeVo = ref({});
// detail
const detail = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
pageSize: 10,
});
//
const total = ref(100);
@ -43,7 +44,7 @@ const consumeType = [
//
const tableHeight = computed(function () {
return (getObj.value.pageSize + 2) * 60 + "px";
return (getObj.value.pageSize + 2) * 41 + "px";
});
//
@ -58,27 +59,27 @@ const get = async function (val) {
//
if (getTime.value != null) {
if (getTime.value.startDate != "" && getTime.value.endDate != "") {
rechargeVo.value.startDate = getTime.value[0];
rechargeVo.value.endDate = getTime.value[1];
detail.value.startDate = getTime.value[0];
detail.value.endDate = getTime.value[1];
}
} else {
rechargeVo.value.startDate = "";
rechargeVo.value.endDate = "";
detail.value.startDate = "";
detail.value.endDate = "";
}
console.log("搜索参数", getObj.value);
// POST
const result = await axios.post(
"http://192.168.8.93:10030/audit/audit/refund",
{ ...getObj.value, rechargeVo: { ...rechargeVo.value } }
);
const result = await API.post("http://192.168.8.93:10010/refund/search", {
...getObj.value,
detail: { ...detail.value },
});
//
console.log("请求成功", result);
//
tableData.value = result.data.data.list;
tableData.value = result.data.list;
console.log("tableData", tableData.value);
//
total.value = result.data.data.total;
total.value = result.data.total;
console.log("total", total.value);
} catch (error) {
console.log("请求失败", error);
@ -87,11 +88,11 @@ const get = async function (val) {
};
//
const reset = function () {
rechargeVo.value.goods = "";
rechargeVo.value.consumeType = "";
rechargeVo.value.area = "";
rechargeVo.value.startDate = "";
rechargeVo.value.endDate = "";
detail.value.refundGoods = "";
detail.value.refundType = "";
detail.value.adminArea = "";
detail.value.startDate = "";
detail.value.endDate = "";
get();
};
//
@ -149,24 +150,24 @@ const get7Days = function () {
//
const adminAll = function () {
console.log("adminAll");
rechargeVo.value.status = "";
detail.value.auditStatus = "";
get();
};
//
const adminWait = function () {
rechargeVo.value.status = 0;
detail.value.auditStatus = 0;
get();
console.log("adminWait");
};
//
const adminPass = function () {
rechargeVo.value.status = 1;
detail.value.auditStatus = 1;
get();
console.log("adminPass");
};
//
const adminReject = function () {
rechargeVo.value.status = 2;
detail.value.auditStatus = 2;
get();
console.log("adminReject");
};
@ -186,7 +187,7 @@ const handleClick = function (tab, event) {
const getActivity = async function () {
try {
// POST
const result = await axios.post(
const result = await API.post(
"http://192.168.8.93:10010/recharge/activity/select",
{}
);
@ -194,7 +195,7 @@ const getActivity = async function () {
//
console.log("请求成功", result);
//
activity.value = result.data.data;
activity.value = result.data;
console.log("activity", activity.value);
} catch (error) {
console.log("请求失败", error);
@ -205,14 +206,14 @@ const getActivity = async function () {
const getArea = async function () {
try {
// POST
const result = await axios.post(
const result = await API.post(
"http://192.168.8.93:10010/recharge/recharge",
{}
);
//
console.log("请求成功", result);
//
allData.value = result.data.data;
allData.value = result.data;
console.log("allData", allData.value);
//
area.value = [...new Set(allData.value.map((item) => item.area))];
@ -239,9 +240,9 @@ const delConfirm = async function () {
try {
console.log("delObj", delObj.value);
// POST
const result = await axios.post(
"http://192.168.8.174:10040/refund/softDelete",
delObj.value
const result = await API.post(
"http://192.168.8.93:10010/refund/softDelete?detailId=" +
delObj.value.detailId
);
//
console.log("请求成功", result);
@ -252,6 +253,25 @@ const delConfirm = async function () {
//
}
};
//
const goods = ref([]);
const getGoods = async function () {
try {
// POST
const result = await API.post("http://192.168.8.93:10010/product", {});
//
console.log("请求成功", result);
//
goods.value = result.data;
console.log("allData", allData.value);
console.log("地区", area.value);
} catch (error) {
console.log("请求失败", error);
//
}
};
getGoods();
</script>
<template>
@ -263,10 +283,11 @@ const delConfirm = async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">退款类型</el-text>
<el-select
v-model="rechargeVo.consumeType"
v-model="detail.refundType"
placeholder="请选择退款类型"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in consumeType"
@ -281,16 +302,17 @@ const delConfirm = async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">退款商品</el-text>
<el-select
v-model="rechargeVo.payWay"
v-model="detail.refundGoods"
placeholder="请选择支付方式"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in payWay"
v-for="item in goods"
:key="item.value"
:label="item.label"
:value="item.value"
:label="item.name"
:value="item.name"
/>
</el-select>
</div>
@ -299,10 +321,11 @@ const delConfirm = async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select
v-model="rechargeVo.area"
v-model="detail.adminArea"
placeholder="请选择所属地区"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in area"
@ -317,7 +340,7 @@ const delConfirm = async function () {
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-text class="mx-1" size="large">退款时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
@ -359,18 +382,18 @@ const delConfirm = async function () {
<div>
<el-table
:data="tableData"
v-if="(tableData.detailFlag = 1)"
v-if="(tableData.detaillFlag = 1)"
:height="tableHeight"
style="width: 100%"
>
<el-table-column prop="user" label="姓名" width="80px" />
<el-table-column prop="userName" label="姓名" width="80px" />
<el-table-column prop="jwcode" label="精网号" width="180px" />
<el-table-column prop="area" label="所属地区" width="120px" />
<el-table-column prop="refundType" label="退款类型" width="180px" />
<el-table-column prop="adminArea" label="所属地区" width="120px" />
<el-table-column prop="refundType" label="退款类型" width="100px" />
<el-table-column
prop="refundGoods"
label="退款商品"
width="120px"
width="200px"
/>
<el-table-column label="退款金币数" width="120px">
<template #default="scope">
@ -395,23 +418,23 @@ const delConfirm = async function () {
width="200px"
show-overflow-tooltip
/>
<el-table-column prop="name" label="提交人" width="100px" />
<el-table-column prop="status" label="审核状态" width="120px">
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="auditStatus" label="审核状态" width="120px">
<!-- 模板内容 -->
<template #default="scope">
<span v-if="scope.row.status === 1">
<span v-if="scope.row.auditStatus == 1">
<div class="status">
<span class="green-dot"></span>
<span>已通过</span>
</div>
</span>
<span v-if="scope.row.status === 0">
<span v-if="scope.row.auditStatus == 0">
<div class="status">
<span class="grey-dot"></span>
<span>待审核</span>
</div>
</span>
<span v-if="scope.row.status === 2">
<span v-if="scope.row.auditStatus == 2">
<div class="status">
<span class="red-dot"></span>
<span>已驳回</span>

359
vue/gold-system/vue/gold-system/src/views/usergold/index.vue

@ -0,0 +1,359 @@
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import ElementPlus from "element-plus";
import axios from "axios";
import { ta } from "element-plus/es/locales.mjs";
import API from "../../api/index.js";
//
const tableData = ref([]);
//
const tableAllData = ref([]);
//
const rechargeCoin = ref(0);
const freeCoin = ref(0);
const taskCoin = ref(0);
// ===========================================
//
const total = ref(100);
//
const getTime = ref([]);
// detail
const detail = ref({});
//
const getAllObj = ref({});
//
const getObj = ref({
pageNum: 1,
pageSize: 5,
});
//
const updateType = [
{
value: "充值",
label: "充值",
},
{
value: "消费",
label: "消费",
},
{
value: "退款",
label: "退款",
},
];
//
const tableHeight = computed(function () {
return getObj.value.pageSize * 50 + "px";
});
//
// ===========================================================================
//
const get = async function (val) {
try {
//
if (typeof val === "number") {
getObj.value.pageNum = val;
}
//
if (getTime.value != null) {
if (getTime.value.startDate != "" && getTime.value.endDate != "") {
detail.value.startDate = getTime.value[0];
detail.value.endDate = getTime.value[1];
}
} else {
detail.value.startDate = "";
detail.value.endDate = "";
}
console.log("搜索参数", getObj.value);
// POST
const result = await API.post("http://192.168.8.93:10010/detail", {
...getObj.value,
detail: { ...detail.value },
});
const result2 = await API.post("http://192.168.8.93:10010/detail", {
...getAllObj.value,
detail: { ...detail.value },
});
//
console.log("请求成功", result);
console.log("请求成功2", result2);
//
tableData.value = result.data.list;
console.log("tableData", tableData.value);
tableAllData.value = result2.data;
console.log("tableAllData", tableAllData.value);
//
total.value = result.data.total;
console.log("total", total.value);
//
rechargeCoin.value = tableAllData.value.reduce(
(pre, cur) => pre + cur.rechargeCoin,
0
);
freeCoin.value = tableAllData.value.reduce(
(pre, cur) => pre + cur.freeCoin,
0
);
taskCoin.value = tableAllData.value.reduce(
(pre, cur) => pre + cur.taskCoin,
0
);
console.log(
"各金币总数",
rechargeCoin.value,
freeCoin.value,
taskCoin.value
);
} catch (error) {
console.log("请求失败", error);
//
}
};
//
const reset = function () {
detail.value.jwcode = "";
detail.value.updateType = "";
detail.value.startDate = "";
detail.value.endDate = "";
getTime.value = {};
};
//
const getToday = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
);
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
getTime.value = [startDate, endDate];
console.log("getTime", getTime.value);
get();
};
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === "number") {
console.log(
"总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
);
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
console.log("输入的数字合法");
get();
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
} else {
//
ElMessage({
type: "error",
message: "请检查输入内容",
});
}
};
//
onMounted(async function () {
await get();
});
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="detail.jwcode"
style="width: 240px"
placeholder="请输入精网号"
clearable
/>
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">更新类型</el-text>
<el-select
v-model="detail.updateType"
placeholder="请选择更新类型"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in updateType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">更新时间</el-text>
<el-date-picker
v-model="getTime"
type="daterange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
/>
</div>
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
现有金币免费金币{{ freeCoin }}充值金币{{
rechargeCoin
}}任务金币{{ taskCoin }}
</div>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table-column prop="uname" label="姓名" />
<el-table-column prop="jwcode" label="精网号" />
<el-table-column prop="area" label="所属地区" />
<el-table-column prop="gold" label="更新数量">
<template #default="scope">
<span>{{
scope.row.rechargeCoin +
scope.row.freeCoin +
scope.row.taskCoin
}}</span>
</template>
</el-table-column>
<el-table-column prop="updateType" label="更新类型" />
<el-table-column prop="freeCoin" label="免费金币" />
<el-table-column prop="rechargeCoin" label="充值金币" />
<el-table-column prop="taskCoin" label="任务金币" />
<el-table-column prop="name" label="提交人" />
<el-table-column prop="createTime" label="更新时间" />
</el-table>
</div>
<!-- 分页 -->
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
:page-size="getObj.pageSize"
layout="slot"
:total="total"
>
<div>{{ total }},每页</div>
<el-select
v-model="getObj.pageSize"
class="page-size"
@change="get()"
style="width: 80px"
>
<el-option
v-for="item in [5, 6, 7, 8, 9, 10]"
:key="item"
:label="item"
:value="item"
></el-option>
</el-select>
<div></div>
</el-pagination>
<el-pagination
background
layout="prev, pager, next,slot"
:page-size="getObj.pageSize"
:total="total"
:current-page="getObj.pageNum"
@current-change="get"
>
<div>跳至</div>
<el-input
v-model="getObj.pageNum"
style="width: 40px"
@change="checkNumber"
/>
<div></div>
</el-pagination>
</div>
</el-card>
</el-col>
</el-row>
</template>
<style scoped>
.pagination {
display: flex;
}
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
</style>

1131
vue/gold-system/vue/gold-system/src/views/workspace/index.vue
File diff suppressed because it is too large
View File

107
vue/gold-system/vue/gold-system/src/views/z.vue

@ -0,0 +1,107 @@
<script setup>
import { all } from 'axios';
import * as echarts from 'echarts';
import { ref, onMounted, reactive, computed } from "vue";
import { VscInfo } from 'vue-icons-plus/vsc'
import { Bs1CircleFill, Bs2CircleFill, Bs3CircleFill, Bs4Circle, Bs5Circle, Bs6Circle, Bs7Circle, Bs8Circle } from 'vue-icons-plus/bs'
import axios from 'axios';
//
const option4Data = ref([]);
const a1=ref(1000);
const a2=ref(2000);
const a3=ref(3000);
const a4=ref(4000);
onMounted(async function () {
option4Data.value = [
{ value: a1.value, name: '1000金币' },
{ value: a2.value, name: '2000金币' },
{ value: a3.value, name: '3000金币' },
{ value: a4.value, name: '4000金币' },
];
// domecharts
var rechargeBar = echarts.init(document.getElementById('main'));
const option = {
tooltip: {
trigger: 'item'
},
legend: {
bottom: '-2%',
left: 'center',
orient: 'vertical'
},
grid: {
top: '0%', // 10%使
},
series: [
{
name: '全年累计消耗金币数(个)\n10000',
type: 'pie',
radius: ['80%', '60%'],
avoidLabelOverlap: false,
label: {
show: true,
position: 'center',
formatter: '{a}',
fontSize: 15,
fontWeight: 'bold'
},
labelLine: {
show: false
},
data: option4Data.value,
color: ['#57a5ff', '#7f29ff', '#f2d113']
}
]
};
// 使
rechargeBar.setOption(option);
})
const imgrule = ref('..\assets\韩信.png');
</script>
<template>
<div>
<el-image :preview-src-list="[imgrule]" preview-teleported="true" src="..\assets\动漫美女.png" alt="美女" style="width: 50px; height: 50px" />
</div>
<div id="main" style="width: 600px;height:400px;"></div>
</template>
<style scoped>
.comparedWithYesterday {
display: flex;
}
.ranking-item {
margin-bottom: 10px;
}
.ranking-header {
margin-bottom: 10px;
display: flex;
}
.goldCategory {
margin-right: 20px;
display: flex;
}
.bar {
display: flex;
}
.pie {
display: flex;
}
.el-row {
margin-bottom: 20px;
}
.el-radio-button {
border: 1px solid grey;
}
</style>

0
vue/gold-system/src/vite-env.d.ts → vue/gold-system/vue/gold-system/src/vite-env.d.ts

0
vue/gold-system/tsconfig.app.json → vue/gold-system/vue/gold-system/tsconfig.app.json

0
vue/gold-system/tsconfig.json → vue/gold-system/vue/gold-system/tsconfig.json

0
vue/gold-system/tsconfig.node.json → vue/gold-system/vue/gold-system/tsconfig.node.json

1
vue/gold-system/vite.config.ts → vue/gold-system/vue/gold-system/vite.config.ts

@ -4,4 +4,5 @@ import vue from '@vitejs/plugin-vue'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
})
Loading…
Cancel
Save