This commit is contained in:
gaomusan 2024-10-16 18:34:03 +08:00
commit 4f3e4e7271
111 changed files with 7122 additions and 0 deletions

33
project/jiaqingjiayi/.gitignore vendored Normal file
View File

@ -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/

259
project/jiaqingjiayi/mvnw vendored Normal file
View File

@ -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
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# 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
project/jiaqingjiayi/mvnw.cmd vendored Normal file
View File

@ -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 https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM 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"

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cj</groupId>
<artifactId>jiaqingjiayi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jiaqingjiayi</name>
<description>jiaqingjiayi</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.0.ALL</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<!--日期工具栏依赖-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://doc.xiaominfo.com/knife4j/documentation/get_start.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</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>

View File

@ -0,0 +1,188 @@
create database jqjy;
use jqjy;
create table user
(
username varchar(256) null comment '用户昵称',
id bigint auto_increment comment 'id'
primary key,
unionId varchar(256) null comment '支付宝开放平台id',
openId varchar(256) null comment 'openId',
userAccount varchar(256) null comment '账号',
avatarUrl varchar(256) null comment '用户头像',
gender tinyint null comment '性别',
userPassword varchar(512) not null comment '密码',
phone varchar(128) null comment '电话',
email varchar(512) null comment '邮箱',
userStatus int default 0 not null comment '状态 0 -正常',
createTime datetime default CURRENT_TIMESTAMP null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
isDelete tinyint default 0 not null comment '是否删除',
userRole int default 0 not null comment '用户角色 0 - 普通用户 1 - 管理员 2 - 商家 3 - 美甲师',
index idx_openId (openId)
) comment '用户' collate = utf8mb4_unicode_ci;
-- 商品表
create table if not exists commodities
(
id bigint auto_increment comment 'id' primary key,
businessId bigint not null comment '商家id',
commoditiesGroupId bigint not null comment '商品分组id',
commoditiesName varchar(128) not null comment '商品名称',
commoditiesImage varchar(1024) null comment '商品图片',
commoditiesPrice double not null comment '商品价格',
inventoryStatus int not null comment '库存数量',
status varchar(20) default '上架' not null comment '商品状态:上架,下架',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_businessId (businessId)
) comment '商品表' collate = utf8mb4_unicode_ci;
-- 商品分组表
create table if not exists commodities_group
(
id bigint auto_increment comment 'id' primary key,
businessId bigint not null comment '商家id',
groupName varchar(128) not null comment '商品分组名称',
isTopping tinyint default 0 not null comment '是否置顶:0不置顶,1置顶',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_businessId (businessId)
) comment '商品分组表' collate = utf8mb4_unicode_ci;
-- 商家表
create table if not exists business
(
id bigint auto_increment comment 'id' primary key,
userId bigint not null comment '用户id',
businessName varchar(512) not null comment '门店名称',
businessAvatar varchar(1024) not null comment '门店头像',
businessPhone varchar(64) not null comment '门店手机号',
address varchar(512) not null comment '店铺详细地址',
businessProfile varchar(512) null comment '门店简介',
businessImages varchar(1024) null comment '商家相册',
categoryId bigint null comment '分类id',
startBusiness varchar(64) not null comment '开始营业时间',
endBusiness varchar(64) not null comment '结束营业时间',
state tinyint default 0 not null comment '状态:0审核中,1启用,2禁用',
storeStatus tinyint default 0 not null comment '店铺状态:0休业,1营业',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_businessId (id),
index idx_userId (userId)
) comment '商家' collate = utf8mb4_unicode_ci;
-- 商家认证表
create table if not exists business_auth
(
id bigint auto_increment comment 'id' primary key,
businessId bigint not null comment '店铺id',
shopkeeper varchar(64) not null comment '店主名',
license varchar(1024) not null comment '营业执照',
frontIdCard varchar(1024) not null comment '身份证正面',
backIdCard varchar(1024) not null comment '身份证反面',
bankCard varchar(64) not null comment '银行卡号',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_businessId (businessId)
) comment '商家认证' collate = utf8mb4_unicode_ci;
-- 商品和规格的中间表
create table if not exists specifications_commodities
(
id bigint auto_increment comment 'id' primary key,
commoditiesId bigint not null comment '商品id',
specificationsId bigint not null comment '规格id',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_dishesId (commoditiesId),
index idx_specificationsId (specificationsId)
) comment '商品和规格的中间表' collate = utf8mb4_unicode_ci;
-- 规格表
create table if not exists specifications
(
id bigint auto_increment comment 'id' primary key,
businessId bigint not null comment '商家id',
specificationsName varchar(128) not null comment '规格名称',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_businessId (businessId)
) comment '规格表' collate = utf8mb4_unicode_ci;
-- 属性表
create table if not exists attribute
(
id bigint auto_increment comment 'id' primary key,
businessId bigint not null comment '商家id',
specificationsId bigint not null comment '规格id',
attributeName varchar(128) not null comment '属性名称',
attributeStatus tinyint default 0 not null comment '属性状态:0在售,1停售',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
index idx_businessId (businessId)
) comment '属性表' collate = utf8mb4_unicode_ci;
-- 购物车表
create table if not exists cart
(
id bigint auto_increment comment 'id' primary key,
userId bigint not null comment '用户id',
businessId bigint not null comment '商家id',
createTime datetime default CURRENT_TIMESTAMP not null comment '加入购物车时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
commoditiesId bigint null comment '商品id',
quantity int default 1 not null comment '商品数量',
price decimal(10, 2) not null comment '当前选择规格的价格',
subtotal decimal(10, 2) as ((`price` * `quantity`)) stored comment '小计(单价 * 数量)',
selectedOptions varchar(512) default '' not null comment '已选规格属性列表',
isDelete tinyint default 0 not null comment '是否删除',
index idx_userId (userId),
index idx_businessId (businessId)
) comment '购物车表' collate = utf8mb4_unicode_ci;
-- 美甲师表
create table if not exists manicurist
(
id BIGINT AUTO_INCREMENT COMMENT '美甲师唯一标识(主键,自增)' PRIMARY KEY,
userId BIGINT not null comment '用户ID关联用户表',
businessId bigint not null comment '商家id',
name VARCHAR(100) not null comment '美甲师姓名',
gender tinyint null comment '性别',
manicuristAvatar VARCHAR(255) COMMENT '美甲师头像文件的存储路径或链接',
phone VARCHAR(20) COMMENT '美甲师联系电话',
email VARCHAR(100) COMMENT '美甲师电子邮件',
employment_date DATE COMMENT '美甲师入职日期',
specialties VARCHAR(255) comment '美甲师的专长(如法式美甲、彩绘等)',
rating DECIMAL(3, 2) comment '美甲师的服务评分',
salary DECIMAL(10, 2) comment '美甲师的基本薪资',
manStatus int DEFAULT 0 comment'美甲师状态 0 表示正常 1 表示禁用',
isDeleted TINYINT DEFAULT 0 comment '逻辑删除标志0 表示未删除1 表示已删除',
createTime DATETIME DEFAULT CURRENT_TIMESTAMP not null comment '记录创建时间',
updateTime DATETIME DEFAULT CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '记录更新时间',
INDEX idx_userId (userId)
) comment ='美甲师表' COLLATE = utf8mb4_unicode_ci;
create table if not exists manicurist_auth
(
id BIGINT AUTO_INCREMENT COMMENT '认证唯一标识(主键,自增)' PRIMARY KEY,
artistId BIGINT not null comment '美甲师ID关联美甲师表',
certification_number VARCHAR(100) COMMENT '认证编号',
issuing_authority VARCHAR(100) COMMENT '发证机构',
certificate_path VARCHAR(255) COMMENT '证书文件的存储路径或链接',
createTime DATETIME default CURRENT_TIMESTAMP not null comment '记录创建时间',
updateTime DATETIME default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '记录更新时间',
isDeleted TINYINT default 0 comment '逻辑删除标志0 表示未删除1 表示已删除',
INDEX idx_artistId (artistId)
) comment ='美甲师认证表' COLLATE = utf8mb4_unicode_ci;
ALTER TABLE manicurist ADD COLUMN manStatus INT DEFAULT 0;

View File

@ -0,0 +1,16 @@
package com.cj.jiaqingjiayi;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.cj.jiaqingjiayi.mapper")
@SpringBootApplication
public class JiaqingjiayiApplication {
public static void main(String[] args) {
SpringApplication.run(JiaqingjiayiApplication.class, args);
}
}

View File

@ -0,0 +1,49 @@
package com.cj.jiaqingjiayi.common;
import lombok.Data;
import java.io.Serializable;
/**
*通用返回类
*
* @author wssb
*/
@Data
public class BaseResponse<T> implements Serializable {
/**
* 状态码
*/
private int code;
/**
* 数据
*/
private T data;
/**
* 消息
*/
private String message;
/**
* 描述
*/
private String description;
public BaseResponse(int code, T data, String message, String description) {
this.code = code;
this.data = data;
this.message = message;
this.description = description;
}
public BaseResponse(int code, T data, String message) {
this(code, data, message, "");
}
public BaseResponse(int code, T data) {
this(code, data, "", "");
}
public BaseResponse(ErrorCode errorCode) {
this(errorCode.getCode(), null , errorCode.getMessage(), errorCode.getDescription());
}
}

View File

@ -0,0 +1,48 @@
package com.cj.jiaqingjiayi.common;
/**
* 错误码
*/
public enum ErrorCode {
SUCCESS(0, "ok", ""),
PARAMS_ERROR(40000, "请求参数错误", ""),
NULL_ERROR(40001, "请求数据为空", ""),
NOT_LOGIN(40100, "未登录", ""),
NO_AUTH(40101, "无权限", ""),
NOT_FOUND_ERROR(40400,"请求数据不存在",""),
SYSTEM_ERROR(50000, "系统内部异常", ""),
OPERATION_ERROR(50001, "操作失败", "");
/**
* 状态码
*/
private final int code;
/**
* 状态码信息
*/
private final String message;
/**
* 状态码的详细描述
*/
private final String description;
ErrorCode(int code, String message, String description) {
this.code = code;
this.message = message;
this.description = description;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public String getDescription() {
return description;
}
}

View File

@ -0,0 +1,65 @@
package com.cj.jiaqingjiayi.common;
/**
* 返回工具类
*/
public class ResultUtils {
/**
* 成功
*
* @param data
* @param <T>
* @return
*/
public static <T> BaseResponse<T> success(T data) {
return new BaseResponse<>(0, data, "ok");
}
public static <T> BaseResponse<T> success(T data, String message) {
return new BaseResponse<>(0, data, message);
}
/**
* 失败
*
* @param errorCode
* @return
*/
public static BaseResponse error(ErrorCode errorCode) {
return new BaseResponse<>(errorCode);
}
/**
* 失败
*
* @param code
* @param message
* @param description
* @return
*/
public static BaseResponse error(int code, String message, String description) {
return new BaseResponse(code, null, message, description);
}
/**
* 失败
*
* @param errorCode
* @return
*/
public static BaseResponse error(ErrorCode errorCode, String message, String description) {
return new BaseResponse(errorCode.getCode(), null, message, description);
}
/**
* 失败
*
* @param errorCode
* @return
*/
public static BaseResponse error(ErrorCode errorCode, String description) {
return new BaseResponse(errorCode.getCode(), errorCode.getMessage(), description);
}
}

View File

@ -0,0 +1,28 @@
package com.cj.jiaqingjiayi.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 全局跨域配置
*
*
* @author bsz
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 覆盖所有请求
registry.addMapping("/**")
// 允许发送 Cookie
.allowCredentials(true)
// 放行哪些域名必须用 patterns否则 * 会和 allowCredentials 冲突
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.exposedHeaders("*");
}
}

View File

@ -0,0 +1,53 @@
package com.cj.jiaqingjiayi.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author bsz
* Knife4j 接口文档配置
*
* http://localhost:8080/api/doc.html 接口文档地址
*/
@Configuration
@EnableSwagger2
@Profile({"dev", "test"}) //版本控制访问
public class Knife4jConfig {
@Bean
public Docket defaultApi2() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// 指定 Controller 扫描包路径
.apis(RequestHandlerSelectors.basePackage("com.cj.jiaqingjiayi.controller"))
.paths(PathSelectors.any())
.build();
}
/**
* 自定义接口文档信息
* @return 接口文档
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 接口文档的标题
.title("甲情甲意")
// 接口文档的描述信息
.description("甲情甲意的接口文档,进行测试")
// 提供服务的是谁可以填写你自己的地址因为是你自己提供的服务
.termsOfServiceUrl("https://www.bilibili.com/video/BV1W2421w78j/?spm_id_from=333.337.search-card.all.click")
.contact(new Contact("gaomu", "https://account.bilibili.com/account/face/upload?spm_id_from=333.999.0.0", "1929829500@qq.com"))
// 版本
.version("1.0")
// 构建
.build();
}
}

View File

@ -0,0 +1,26 @@
package com.cj.jiaqingjiayi.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MyBatis Plus 配置
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 拦截器配置
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.contant;
/**
* 通用常量
*/
public interface CommonConstant {
/**
* 升序
*/
String SORT_ORDER_ASC = "ascend";
/**
* 降序
*/
String SORT_ORDER_DESC = " descend";
}

View File

@ -0,0 +1,32 @@
package com.cj.jiaqingjiayi.contant;
/**
* 正则表达式常量
*/
@SuppressWarnings("all")
public interface RegexConstant {
/**
* 手机号正则
*/
String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";
/**
* 邮箱正则
*/
String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
/**
* 18位身份证号正则
*/
String ID_CARD_REGEX = "^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9xX]$";
/**
* 验证码正则, 6位数字或字母
*/
String VERIFY_CODE_REGEX = "^[a-zA-Z\\d]{6}$";
/**
* 密码正则4~32位的字母数字下划线
*/
String PASSWORD_REGEX = "^\\w{4,32}$";
}

View File

@ -0,0 +1,31 @@
package com.cj.jiaqingjiayi.contant;
/**
* 用户常量
*/
public interface UserConstant {
/**
* 用户登录态键
*/
String USER_LOGIN_STATE = "userLoginState";
/**
* 盐值
*/
String USER_SALT = "yctf";
// ------- 权限 --------
/**
* 默认权限
*/
int DEFAULT_ROLE = 0;
/**
* 管理员权限
*/
int ADMIN_ROLE = 1;
}

View File

@ -0,0 +1,110 @@
package com.cj.jiaqingjiayi.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.request.AlipayUserInfoShareRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.alipay.api.response.AlipayUserInfoShareResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import com.cj.jiaqingjiayi.contant.UserConstant;
import com.cj.jiaqingjiayi.mapper.UserMapper;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.utils.RandomNumberGenerator;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.*;
@RestController
@RequestMapping("/Alipay")
public class AlipayController {
@Value("${alipay.appId}")
public String appId;
@Value("${alipay.appPrivateKey}")
public String appPrivateKey;
@Value("${alipay.alipayPublicKey}")
public String PublicKey;
@Resource
private UserMapper userMapper;
@Resource
private RandomNumberGenerator randomNumberGenerator;
private static String authToken;
/**
* 解析code获取open_id和token
* @return aaa
* @throws AlipayApiException 支付宝api异常
*/
@GetMapping("/parseCode")
public BaseResponse<User> login(String authcode, HttpServletRequest req) throws AlipayApiException {
String privateKey = appPrivateKey;
String alipayPublicKey = PublicKey;
AlipayConfig alipayConfig = new AlipayConfig();
//沙箱网关
alipayConfig.setServerUrl("https://openapi-sandbox.dl.alipaydev.com/gateway.do");
//支付宝网关
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(authcode);
request.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
// System.out.println(response.getBody());打印所有响应
authToken = response.getAccessToken();
if (!response.isSuccess()) {
return ResultUtils.error(ErrorCode.PARAMS_ERROR);
}
AlipayUserInfoShareRequest request1 = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse response1 = alipayClient.execute(request1, authToken);
User oid = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, response.getOpenId()));
if (response1.isSuccess()) {
if (oid == null) {
User user = new User();
user.setOpenId(response.getOpenId());
user.setUsername(StringUtils.isAnyBlank(response1.getNickName()) ? "随机名字" + randomNumberGenerator.generateRandomNumber() : response1.getNickName());
user.setUserPassword("123456");
user.setAvatarUrl(StringUtils.isAnyBlank(response1.getAvatar()) ? "https://tfs.alipayobjects.com/images/partner/ATuihpR50zu7UAAAAAAAAAAAAADtl2AA" : response1.getAvatar());
userMapper.insert(user);
req.getSession().setAttribute(UserConstant.USER_LOGIN_STATE,user);
return ResultUtils.success(user,"注册成功");
}
req.getSession().setAttribute(UserConstant.USER_LOGIN_STATE,oid);
return ResultUtils.success(oid,"登录成功");
}
req.getSession().setAttribute(UserConstant.USER_LOGIN_STATE,oid);
return ResultUtils.success(oid,"登录成功");
}
}

View File

@ -0,0 +1,185 @@
package com.cj.jiaqingjiayi.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.cj.jiaqingjiayi.model.domain.BusinessAuth;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.business.BusinessAddRequest;
import com.cj.jiaqingjiayi.model.request.business.BusinessQueryRequest;
import com.cj.jiaqingjiayi.model.request.business.BusinessUpdateRequest;
import com.cj.jiaqingjiayi.model.vo.BusinessAdminVO;
import com.cj.jiaqingjiayi.model.vo.BusinessVO;
import com.cj.jiaqingjiayi.service.BusinessAuthService;
import com.cj.jiaqingjiayi.service.BusinessService;
import com.cj.jiaqingjiayi.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import static com.cj.jiaqingjiayi.contant.UserConstant.USER_SALT;
/**
* 商家接口
*/
@Slf4j
@RestController
@RequestMapping("/business")
public class BusinessController {
@Resource
private UserService userService;
@Resource
private BusinessService businessService;
@Resource
private BusinessAuthService businessAuthService;
@PostMapping("/add")
public BaseResponse<Long> addBusiness(@RequestBody BusinessAddRequest businessAddRequest) {
ThrowUtils.throwIf(businessAddRequest == null, ErrorCode.PARAMS_ERROR);
User user = new User();
BeanUtils.copyProperties(businessAddRequest, user);
Business business = new Business();
BeanUtils.copyProperties(businessAddRequest, business);
BusinessAuth businessAuth = new BusinessAuth();
BeanUtils.copyProperties(businessAddRequest, businessAuth);
//对每个应该校验的业务进行校验
businessService.validUser(user, true);
businessService.validBusiness(business, true);
businessService.validBusinessAuth(businessAuth, true);
//加密
String encryptPassword = DigestUtils.md5DigestAsHex((USER_SALT + user.getUserPassword()).getBytes());
user.setUserPassword(encryptPassword);
//更改用户权限为商家
user.setUserRole(2);
//往user表中补充商家信息
user.setUsername(business.getBusinessName());
user.setAvatarUrl(business.getBusinessAvatar());
user.setPhone(business.getBusinessPhone());
//插入到表中
businessService.addBusiness(user, business, businessAuth);
return ResultUtils.success(business.getId(),"添加商家成功");
}
/**
* 管理员更新商家
* @param businessUpdateRequest
* @return
*/
@PostMapping("/update")
public BaseResponse<Boolean> updateBusiness (@RequestBody BusinessUpdateRequest businessUpdateRequest, HttpServletRequest request) {
//判断是否为管理员
userService.isAdmin(request);
if (businessUpdateRequest == null || businessUpdateRequest.getId() == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "传入参数为空");
}
Business business = new Business();
BeanUtils.copyProperties(businessUpdateRequest, business);
//更新不添加 只需要判断修改符不符合逻辑
businessService.validBusiness(business, false);
boolean updateById = businessService.updateById(business);
ThrowUtils.throwIf(!updateById, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
/**
* 根据id查询
* @param id
* @return
*/
@GetMapping("/getById")
public BaseResponse<BusinessAdminVO> getBusinessById(long id, HttpServletRequest request) {
//判断是否为管理员
userService.isAdmin(request);
ThrowUtils.throwIf(id < 0, ErrorCode.NULL_ERROR);
//获取商家视图
Business business = businessService.getById(id);
ThrowUtils.throwIf(business == null , ErrorCode.PARAMS_ERROR, "id不符合规范");
BusinessAdminVO businessAdminVO = businessAuthService.getBusinessAdminVO(business);
return ResultUtils.success(businessAdminVO);
}
/**
* 查询所有商家
* @return
*/
@PostMapping("/list")
public BaseResponse<List<Business>> listBusinessAll(){
List<Business> businessList = businessService.list();
return new BaseResponse<>(0,businessList,"查询成功");
}
/**
* 分页查询
* @param businessQueryRequest
* @return
*/
@PostMapping("/list/page")
//@AuthCheck(mustRole = 1)
public BaseResponse<Page<Business>> listBusinessByPage (@RequestBody BusinessQueryRequest businessQueryRequest) {
Page<Business> businessPage = businessService.page(new Page<>(businessQueryRequest.getCurrent(), businessQueryRequest.getPageSize()),
businessService.getQueryWrapper(businessQueryRequest));
return ResultUtils.success(businessPage);
}
/**
* 分页获取商家列表用户视图
*/
@PostMapping("/list/page/vo")
public BaseResponse<Page<BusinessVO>> listBusinessVOByPage(@RequestBody BusinessQueryRequest businessQueryRequest) {
long current = businessQueryRequest.getCurrent();
long size = businessQueryRequest.getPageSize();
ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
QueryWrapper<Business> queryWrapper = businessService.getQueryWrapper(businessQueryRequest);
// 只显示正常营业商家
queryWrapper.eq("state", 1);
Page<Business> businessPage = businessService.page(new Page<>(current, size), queryWrapper);
Page<BusinessVO> businessVOPage = new Page<>(current, size, businessPage.getTotal());
List<BusinessVO> businessVOList = businessService.getBusinessVO(businessPage.getRecords());
businessVOPage.setRecords(businessVOList);
return ResultUtils.success(businessVOPage);
}
@GetMapping("/current")
public BaseResponse<BusinessVO> getLoginBusiness(HttpServletRequest request){
//获取登录态
Business business = businessService.getLoginBusiness(request);
return ResultUtils.success(businessService.getBusinessVO(business));
}
}

View File

@ -0,0 +1,197 @@
package com.cj.jiaqingjiayi.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Cart;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.cart.CartAddRequest;
import com.cj.jiaqingjiayi.model.request.cart.CartDeleteRequest;
import com.cj.jiaqingjiayi.model.request.cart.CartQueryRequest;
import com.cj.jiaqingjiayi.model.request.cart.CartUpdateRequest;
import com.cj.jiaqingjiayi.model.vo.CartVO;
import com.cj.jiaqingjiayi.service.CartService;
import com.cj.jiaqingjiayi.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@Slf4j
@RequestMapping("/cart")
public class CartController {
@Resource
private CartService cartService;
@Resource
private UserService userService;
/**
* 添加进购物车
* @param cartAddRequest 添加请求
* @param request 网络请求
* @return 购物车id
*/
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Long> addCart (@RequestBody CartAddRequest cartAddRequest, HttpServletRequest request) {
if (cartAddRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
//校验
cartService.validCart(cartAddRequest);
//添加菜品到购物车
Long cart = cartService.addCart(cartAddRequest, request);
return ResultUtils.success(cart);
}
/**
* 更新购物车
* @param cartUpdateRequest 更新请求
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/update")
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> updateCart (@RequestBody CartUpdateRequest cartUpdateRequest, HttpServletRequest request){
if (cartUpdateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
//校验
CartAddRequest cartAddRequest = new CartAddRequest();
BeanUtils.copyProperties(cartUpdateRequest,cartAddRequest);
cartService.validCart(cartAddRequest);
Boolean cart = cartService.updateCart(cartUpdateRequest, request);
return ResultUtils.success(cart);
}
/**
* 删除购物车
* @param cartDeleteRequest 删除请求
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/delete")
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> deleteCart (@RequestBody CartDeleteRequest cartDeleteRequest, HttpServletRequest request) {
if (cartDeleteRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = cartDeleteRequest.getId();
Boolean cart = cartService.deleteCart(id, request);
ThrowUtils.throwIf(!cart, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
/**
* 根据商户id获取购物车脱敏列表
* @param cartQueryRequest 商户id
* @param request 网络请求
* @return 脱敏列表
*/
@PostMapping("/selectByBusinessId")
public BaseResponse<List<CartVO>> selectByBusinessId (@RequestBody CartQueryRequest cartQueryRequest, HttpServletRequest request) {
if (cartQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = cartQueryRequest.getId();
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
LambdaQueryWrapper<Cart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Cart::getBusinessId, businessId);
queryWrapper.eq(Cart::getUserId, userId);
List<Cart> cartList = cartService.list(queryWrapper);
List<CartVO> cartVOList = this.getCartVOList(cartList);
return ResultUtils.success(cartVOList);
}
/**
* 根据用户查找购物车列表
* @param request 网络请求
* @return 脱敏列表
*/
@PostMapping("/selectByUserId")
public BaseResponse<List<CartVO>> selectByUserId (HttpServletRequest request) {
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
LambdaQueryWrapper<Cart> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Cart::getUserId, userId);
List<Cart> cartList = cartService.list(wrapper);
List<CartVO> cartVOList = this.getCartVOList(cartList);
return ResultUtils.success(cartVOList);
}
/**
* 清空商家内的购物车
* @param cartQueryRequest 商家id
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/empty/business")
public BaseResponse<Boolean> emptyBusinessCart(@RequestBody CartQueryRequest cartQueryRequest, HttpServletRequest request) {
if (cartQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = cartQueryRequest.getId();
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
LambdaQueryWrapper<Cart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Cart::getBusinessId, businessId);
queryWrapper.eq(Cart::getUserId, userId);
boolean remove = cartService.remove(queryWrapper);
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
/**
* 清空用户购物车
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/empty/user")
public BaseResponse<Boolean> emptyUserCart(HttpServletRequest request) {
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
LambdaQueryWrapper<Cart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Cart::getUserId, userId);
boolean remove = cartService.remove(queryWrapper);
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
private List<CartVO> getCartVOList(List<Cart> cartList) {
if (CollectionUtils.isEmpty(cartList)) {
return new ArrayList<>();
}
return cartList.stream().map(item ->{
CartVO cartVO = new CartVO();
BeanUtils.copyProperties(item, cartVO);
return cartVO;
}).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,185 @@
package com.cj.jiaqingjiayi.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.cj.jiaqingjiayi.model.domain.Commodities;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.Commodities.CommoditiesAddRequest;
import com.cj.jiaqingjiayi.model.request.Commodities.CommoditiesDeleteRequest;
import com.cj.jiaqingjiayi.model.request.Commodities.CommoditiesQueryRequest;
import com.cj.jiaqingjiayi.model.request.Commodities.CommoditiesUpdateRequest;
import com.cj.jiaqingjiayi.model.vo.BusinessVO;
import com.cj.jiaqingjiayi.model.vo.CommoditiesVO;
import com.cj.jiaqingjiayi.model.vo.LoginUserVO;
import com.cj.jiaqingjiayi.service.BusinessService;
import com.cj.jiaqingjiayi.service.CommoditiesService;
import com.cj.jiaqingjiayi.service.SpecificationsCommoditiesService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/commodities")
public class CommoditiesController {
@Resource
private CommoditiesService commoditiesService;
@Resource
private BusinessService businessService;
@Resource
private SpecificationsCommoditiesService specificationsCommoditiesService;
/**
*添加商品
* @param commoditiesAddRequest 添加商品请求体
* @return 是否成功
*/
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> addCommodities (@RequestBody CommoditiesAddRequest commoditiesAddRequest, HttpServletRequest request) {
if (commoditiesAddRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Commodities commodities = new Commodities();
BeanUtils.copyProperties(commoditiesAddRequest,commodities);
//校验
commoditiesService.validCommodities(commodities,false);
//添加商家id
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
commodities.setBusinessId(businessId);
//保存商品信息
Long commoditiesId = commoditiesService.addCommodities(commodities);
//中间表中添加数据
List<Long> specificationsIds = commoditiesAddRequest.getSpecificationsIds();
specificationsCommoditiesService.add(commoditiesId,specificationsIds);
return ResultUtils.success(true);
}
/**
* 删除商品
* @param commoditiesDeleteRequest 删除请求
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/delete")
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> deleteCommodities(@RequestBody CommoditiesDeleteRequest commoditiesDeleteRequest, HttpServletRequest request) {
if (commoditiesDeleteRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long commoditiesId = commoditiesDeleteRequest.getId();
//获取商家id
Business business = businessService.getLoginBusiness(request);
Long businessId = business.getId();
//校验商品是不是当前登录商家的
LambdaQueryWrapper<Commodities> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Commodities::getId, commoditiesId);
wrapper.eq(Commodities::getBusinessId, businessId);
Commodities commodities = commoditiesService.getOne(wrapper);
ThrowUtils.throwIf(commodities == null, ErrorCode.OPERATION_ERROR, "当前商家无权限删除该商品");
//删除商品
boolean commoditiesRemove = commoditiesService.removeById(commoditiesId);
ThrowUtils.throwIf(!commoditiesRemove, ErrorCode.OPERATION_ERROR);
//删除中间表信息
specificationsCommoditiesService.deleteByCommoditiesId(commoditiesId);
return ResultUtils.success(true);
}
/**
* 更新商品
* @param commoditiesUpdateRequest 更新请求
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/update")
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> updateCommodities (@RequestBody CommoditiesUpdateRequest commoditiesUpdateRequest, HttpServletRequest request) {
if (commoditiesUpdateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Commodities commodities = new Commodities();
BeanUtils.copyProperties(commoditiesUpdateRequest, commodities);
//校验
commoditiesService.validCommodities(commodities, true);
//添加商家id
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
commodities.setBusinessId(businessId);
//更新商品
Boolean updateDishes = commoditiesService.updateCommodities(commodities);
ThrowUtils.throwIf(!updateDishes, ErrorCode.OPERATION_ERROR);
//更新中间表的信息
Long commoditiesId = commodities.getId();
List<Long> specificationsIds = commoditiesUpdateRequest.getSpecificationsIds();
return ResultUtils.success(specificationsCommoditiesService.updateByCommoditiesId(commoditiesId, specificationsIds));
}
/**
* 更新商品状态
* @param commoditiesUpdateRequest 商品请求体
* @param request 前端请求
* @return 是否成功
*/
@PostMapping("/update/status")
public BaseResponse<Boolean> updateCommoditiesStatus (@RequestBody CommoditiesUpdateRequest commoditiesUpdateRequest, HttpServletRequest request) {
Long id = commoditiesUpdateRequest.getId();
String status = commoditiesUpdateRequest.getStatus();
if (id == null || StringUtils.isBlank(status)) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);
}
//获取商家id
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
//更新状态
UpdateWrapper<Commodities> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id",id);
updateWrapper.eq("businessId",businessId);
updateWrapper.set("status",status);
return ResultUtils.success(commoditiesService.update(updateWrapper));
}
/**
*获取商品脱敏列表
* @param commoditiesQueryRequest 查询请求体
* @return 分页列表
*/
@PostMapping("/list/page/commoditiesVO")
public BaseResponse<Page<CommoditiesVO>> commoditiesVOPage(@RequestBody CommoditiesQueryRequest commoditiesQueryRequest) {
long current = commoditiesQueryRequest.getCurrent();
long pageSize = commoditiesQueryRequest.getPageSize();
//获取查询条件
QueryWrapper<Commodities> wrapper = commoditiesService.getWrapper(commoditiesQueryRequest);
//获取商家多有商品
Page<Commodities> commoditiesPage = commoditiesService.page(new Page<>(current, pageSize), wrapper);
//获取脱敏信息列表
List<Commodities> commoditiesList = commoditiesPage.getRecords();
long total = commoditiesPage.getTotal();
List<CommoditiesVO> commoditiesVOList = commoditiesService.getCommoditiesVOList(commoditiesList);
Page<CommoditiesVO> commoditiesVOPage = new Page<>(current, pageSize, total);
commoditiesVOPage.setRecords(commoditiesVOList);
return ResultUtils.success(commoditiesVOPage);
}
}

View File

@ -0,0 +1,168 @@
package com.cj.jiaqingjiayi.controller;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.*;
import com.cj.jiaqingjiayi.model.request.manicurist.ManicuristAddRequest;
import com.cj.jiaqingjiayi.model.request.manicurist.ManicuristUpdateRequest;
import com.cj.jiaqingjiayi.model.request.manicurist.MyManicuristUpdateRequest;
import com.cj.jiaqingjiayi.service.ManicuristService;
import com.cj.jiaqingjiayi.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import static com.cj.jiaqingjiayi.contant.UserConstant.USER_SALT;
@RestController
@Slf4j
@RequestMapping("/manicurist")
public class ManicuristController {
@Resource
private ManicuristService manicuristService;
@Resource
private UserService userService;
/**
* 添加美甲师
* @param manicuristAddRequest
* @return
*/
@PostMapping("/add")
public BaseResponse<Long> addManicurist(@RequestBody ManicuristAddRequest manicuristAddRequest,HttpServletRequest request) {
//判断是否为管理员
userService.isAdmin(request);
ThrowUtils.throwIf(manicuristAddRequest == null, ErrorCode.PARAMS_ERROR);
User user = new User();
BeanUtils.copyProperties(manicuristAddRequest, user);
Manicurist manicurist = new Manicurist();
BeanUtils.copyProperties(manicuristAddRequest, manicurist);
ManicuristAuth manicuristAuth = new ManicuristAuth();
BeanUtils.copyProperties(manicuristAddRequest, manicuristAuth);
//对每个应该校验的业务进行校验
manicuristService.validUser(user, true);
manicuristService.validManicurist(manicurist, true);
manicuristService.validManicuristAuth(manicuristAuth, true);
//加密
String encryptPassword = DigestUtils.md5DigestAsHex((USER_SALT + user.getUserPassword()).getBytes());
user.setUserPassword(encryptPassword);
//更改用户权限为美甲师
user.setUserRole(3);
//往user表中补充美甲师信息
user.setUsername(manicurist.getName());
user.setAvatarUrl(manicurist.getManicuristAvatar());
user.setPhone(manicurist.getPhone());
//插入到表中
manicuristService.addManicurist(user, manicurist, manicuristAuth);
return ResultUtils.success(manicurist.getId(),"添加美甲师成功");
}
/**
* 删除美甲师
*/
@PostMapping("/deleteMan")
public BaseResponse<Boolean> DeleteManicurist(long id, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
manicuristService.deleteMan(id);
return ResultUtils.success(true);
}
/**
* 管理员修改美甲师信息
* 确认一定会传入美甲师的id
*/
@PostMapping("/update")
public BaseResponse<Boolean> UpdateManicurist(@RequestBody ManicuristUpdateRequest manicuristUpdateRequest, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
if (manicuristUpdateRequest == null || manicuristUpdateRequest.getId() == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "传入参数为空");
}
Manicurist manicurist = new Manicurist();
if(manicuristUpdateRequest.getBusinessId() != null){
//检验美甲师绑定的商家是否存在
manicuristService.validManBus(manicuristUpdateRequest.getBusinessId());
}
//校验一下
manicuristService.validManicurist(manicurist, false);
BeanUtils.copyProperties(manicuristUpdateRequest, manicurist);
boolean result = manicuristService.updateById(manicurist);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true, "修改成功");
}
/**
*美甲师修改个人信息
*/
@PostMapping("/myUpdate")
public BaseResponse<Boolean> MyUpdateManicurist(@RequestBody MyManicuristUpdateRequest myUpdateRequest, HttpServletRequest request){
ThrowUtils.throwIf(myUpdateRequest == null, ErrorCode.NULL_ERROR);
User logingUser = userService.getLogingUser(request);
Manicurist manicuristLog = manicuristService.getById(logingUser);
Long manId = manicuristLog.getId();
Manicurist manicurist = new Manicurist();
BeanUtils.copyProperties(myUpdateRequest, manicurist);
manicuristService.validManicurist(manicurist, false);
manicurist.setId(manId);
boolean result = manicuristService.updateById(manicurist);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR, "修改失败");
return ResultUtils.success(true, "修改成功");
}
/**
* 根据id查询美甲师(管理员)
*/
@GetMapping("/queryById")
public BaseResponse<Manicurist> QueryByIdManicurist(long manicuristId, HttpServletRequest request){
userService.isAdmin(request);
ThrowUtils.throwIf(manicuristId < 0, ErrorCode.NULL_ERROR, "id不符合规范");
Manicurist manicurist = manicuristService.getById(manicuristId);
ThrowUtils.throwIf(manicurist == null, ErrorCode.PARAMS_ERROR, "美甲师不存在");
return ResultUtils.success(manicurist);
}
/**
* 查询全部美甲师(管理员)
*/
@PostMapping("/queryAll")
public BaseResponse<List<Manicurist>> QueryAllManicurist(HttpServletRequest request){
userService.isAdmin(request);
List<Manicurist> manicuristList = manicuristService.list();
return ResultUtils.success(manicuristList);
}
}

View File

@ -0,0 +1,352 @@
package com.cj.jiaqingjiayi.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.mapper.UserMapper;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.user.*;
import com.cj.jiaqingjiayi.model.vo.LoginUserVO;
import com.cj.jiaqingjiayi.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.cj.jiaqingjiayi.contant.UserConstant.*;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@Resource
private UserMapper userMapper;
/**
* 用户注册请求接口
*
* @param userRegisterRequest
* @return
*/
@PostMapping("/register")
public BaseResponse<Long> userRegister(@RequestBody UserRegisterRequest userRegisterRequest) {
if (userRegisterRequest == null){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
String userAccount = userRegisterRequest.getUserAccount();
String userPassword = userRegisterRequest.getUserPassword();
String checkPassword = userRegisterRequest.getCheckPassword();
if (StringUtils.isAllBlank(userAccount, userPassword, checkPassword)) {
return ResultUtils.error(ErrorCode.PARAMS_ERROR);
}
long result = userService.userRegister(userAccount, userPassword, checkPassword);
return ResultUtils.success(result);
}
/**
* 用户登录请求接口
*
* @param userLoginRequest
* @param request 前端请求对象
* @return
*/
@PostMapping("/login")
public BaseResponse<LoginUserVO> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {
if (userLoginRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
String userAccount = userLoginRequest.getUserAccount();
String userPassword = userLoginRequest.getUserPassword();
if (StringUtils.isAllBlank(userAccount, userPassword)){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
LoginUserVO loginUserVO = userService.userLogin(userAccount, userPassword, request);
return ResultUtils.success(loginUserVO);
}
/**
* 用户注销接口
* @param request
* @return
*/
@PostMapping("/logout")
public BaseResponse<Integer> userLogout(HttpServletRequest request) {
if (request == null) {
throw new BusinessException(ErrorCode.NULL_ERROR, "传入参数为空");
}
int result = userService.userLogout(request);
return ResultUtils.success(result);
}
/**
* 查询用户(管理员)
* @param searchRequest
* @param request
* @return
*/
@GetMapping("/search")
public BaseResponse<List<User>> searchUsers(UserSearchRequest searchRequest, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
String username = searchRequest.getUsername();
String userAccount = searchRequest.getUserAccount();
Integer gender = searchRequest.getGender();
String phone = searchRequest.getPhone();
String email = searchRequest.getEmail();
Integer userStatus = searchRequest.getUserStatus();
Integer userRole = searchRequest.getUserRole();
Date updateTime = searchRequest.getUpdateTime();
Date createTime = searchRequest.getCreateTime();
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//校验
// username
if (StringUtils.isNotBlank(username)) {
queryWrapper.like("username", username);
}
// userAccount
if (StringUtils.isNotBlank(userAccount)) {
queryWrapper.like("userAccount", userAccount);
}
// gender
if (gender != null) {
queryWrapper.eq("gender", gender);
}
// phone
if (StringUtils.isNotBlank(phone)) {
queryWrapper.like("phone", phone);
}
// email
if (StringUtils.isNotBlank(email)) {
queryWrapper.like("email", email);
}
// userStatus
if (userStatus != null) {
queryWrapper.eq("userStates", userStatus);
}
//userRole
if (userRole != null) {
queryWrapper.eq("userRole", userRole);
}
if (updateTime != null) {
queryWrapper.like("updateTime", updateTime);
}
if (createTime != null) {
queryWrapper.like("createTime", createTime);
}
if(StringUtils.isNotBlank(username)){
queryWrapper.like("username", username);
}
List<User> userList = userService.list(queryWrapper);
List<User> users = userList.stream().map(userService::getSafetyUser).collect(Collectors.toList());
//用户脱敏
return ResultUtils.success(users);
}
/**
* 分页获取用户列表仅管理员
*
* @return 用户列表
*/
@PostMapping("/list/page")
public BaseResponse<Page<User>> listUserByPage(@RequestBody UserSearchRequest userSearchRequest, HttpServletRequest request) {
//判断是否为管理员
userService.isAdmin(request);
long current = userSearchRequest.getCurrent();
long size = userSearchRequest.getPageSize();
Page<User> userPage = userService.page(new Page<>(current, size),
userService.getQueryWrapper(userSearchRequest));
return ResultUtils.success(userPage);
}
/**
* 删除用户(管理员)
* @param deleteRequest
* @param request
* @return
*/
@PostMapping("/delete")
public BaseResponse<Boolean> deleteUser(@RequestBody UserDeleteRequest deleteRequest, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
if(deleteRequest == null || deleteRequest.getId() <= 0){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "id不合法");
}
boolean removeUser = userService.removeById(deleteRequest.getId());
return ResultUtils.success(removeUser);
}
/**
* 获取当前登录的用户信息
* @param request
* @return
*/
@GetMapping("/current")
public BaseResponse<LoginUserVO> getLoginUser(HttpServletRequest request){
//获取登录态
User user = userService.getLogingUser(request);
return ResultUtils.success(userService.getLoginUserVO(user));
}
/**
* 根据id获取用户(管理员)
* @param id
* @param request
* @return
*/
@GetMapping("/getById")
public BaseResponse<User> getUserById(long id, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
if(id < 0){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "id不符合规范");
}
User user = userService.getById(id);
if(user == null){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在");
}
return ResultUtils.success(user);
}
/**
* 用户修改密码
* @param updatePasswordRequest
* @param request
* @return
*/
@PostMapping("/password/update")
public BaseResponse<Boolean> updateUserPassword(@RequestBody UserUpdatePasswordRequest updatePasswordRequest,
HttpServletRequest request){
boolean update = userService.updateUserPassword(updatePasswordRequest, request);
if(update){
return ResultUtils.success(true);
} else {
return ResultUtils.error(ErrorCode.OPERATION_ERROR);
}
}
/**
* 添加用户(管理员)
* @param userAddRequest
* @param request
* @return
*/
@PostMapping("/add")
public BaseResponse<Long> addUser(@RequestBody UserAddRequest userAddRequest, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
if(userAddRequest == null){
throw new BusinessException(ErrorCode.NULL_ERROR,"传入数据为空");
}
User user = new User();
String userAccount = userAddRequest.getUserAccount();
String userPassword = userAddRequest.getUserPassword();
if(StringUtils.isAnyBlank(userAccount, userPassword)){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "未输入账号密码");
}
if(userAccount.length() < 4){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号过短");
}
//判断密码是否小于6
if(userPassword.length() < 6){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码过短");
}
//判断是否有特殊字符
String validPattern = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Matcher matcher = Pattern.compile(validPattern).matcher(userAccount);
if (matcher.find()) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "包含特殊字符");
}
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
long count = userService.count(queryWrapper);
if(count > 0){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户已存在");
}
BeanUtils.copyProperties(userAddRequest, user);
String password = DigestUtils.md5DigestAsHex((USER_SALT + userPassword).getBytes());
user.setUserPassword(password);
boolean save = userService.save(user);
if(!save){
throw new BusinessException(ErrorCode.OPERATION_ERROR);
}
return ResultUtils.success(user.getId());
}
/**
* 更新用户信息(管理员)
* @param userUpdateRequest
* @param request
* @return
*/
@PostMapping("/update")
public BaseResponse<Boolean> updateUser(@RequestBody UserUpdateRequest userUpdateRequest, HttpServletRequest request){
//判断是否为管理员
userService.isAdmin(request);
User user = new User();
BeanUtils.copyProperties(userUpdateRequest, user);
boolean res = userService.updateById(user);
if(!res){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "该用户不存在");
}
return ResultUtils.success(true);
}
/**
* 更新个人信息
* @param userUpdateMyRequest
* @param request
* @return
*/
@PostMapping("/user/update")
public BaseResponse<Boolean> updateMyUser(@RequestBody UserUpdateMyRequest userUpdateMyRequest, HttpServletRequest request){
if(userUpdateMyRequest == null){
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
User logingUser = userService.getLogingUser(request);
User user = new User();
BeanUtils.copyProperties(userUpdateMyRequest, user);
user.setId(logingUser.getId());
boolean result = userService.updateById(user);
if(!result){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "操作失败");
}
return ResultUtils.success(true);
}
}

View File

@ -0,0 +1,49 @@
package com.cj.jiaqingjiayi.exception;
import com.cj.jiaqingjiayi.common.ErrorCode;
/**
* 自定义异常类
*
*/
public class BusinessException extends RuntimeException {
/**
* 异常码
*/
private final int code;
/**
* 描述
*/
private final String description;
public BusinessException(String message, int code, String description) {
super(message);
this.code = code;
this.description = description;
}
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
this.description = errorCode.getDescription();
}
public BusinessException(ErrorCode errorCode, String description) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
}

View File

@ -0,0 +1,31 @@
package com.cj.jiaqingjiayi.exception;
import com.cj.jiaqingjiayi.common.BaseResponse;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.common.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常处理器
*
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public BaseResponse<?> businessExceptionHandler(BusinessException e) {
log.error("businessException: " + e.getMessage(), e);
return ResultUtils.error(e.getCode(), e.getMessage(), e.getDescription());
}
@ExceptionHandler(RuntimeException.class)
public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {
log.error("runtimeException", e);
return ResultUtils.error(ErrorCode.SYSTEM_ERROR, e.getMessage(), "");
}
}

View File

@ -0,0 +1,44 @@
package com.cj.jiaqingjiayi.exception;
import com.cj.jiaqingjiayi.common.ErrorCode;
/**
* 抛异常工具类
*/
@SuppressWarnings("all")
public class ThrowUtils {
/**
* 条件成立则抛异常
*
* @param condition 条件
* @param runtimeException 运行时异常
*/
public static void throwIf(boolean condition, RuntimeException runtimeException) {
if (condition) {
throw runtimeException;
}
}
/**
* 条件成立则抛异常
*
* @param condition 条件
* @param errorCode 自定义异常
*/
public static void throwIf(boolean condition, ErrorCode errorCode) {
throwIf(condition, new BusinessException(errorCode));
}
/**
* 条件成立则抛异常
*
* @param condition 条件
* @param errorCode 自定义异常
* @param message 报错信息
*/
public static void throwIf(boolean condition, ErrorCode errorCode, String message) {
throwIf(condition, new BusinessException(errorCode, message));
}
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.Attribute;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表attribute(属性表)的数据库操作Mapper
* @createDate 2024-08-21 16:29:45
* @Entity com.cj.jiaqingjiayi.model.domain.Attribute
*/
public interface AttributeMapper extends BaseMapper<Attribute> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.BusinessAuth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表business_auth(商家认证)的数据库操作Mapper
* @createDate 2024-07-28 17:18:28
* @Entity com.cj.jiaqingjiayi.model.domain.BusinessAuth
*/
public interface BusinessAuthMapper extends BaseMapper<BusinessAuth> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表business(商家)的数据库操作Mapper
* @createDate 2024-07-28 17:16:33
* @Entity com.cj.jiaqingjiayi.model.domain.Business
*/
public interface BusinessMapper extends BaseMapper<Business> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.Cart;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表cart(购物车表)的数据库操作Mapper
* @createDate 2024-09-05 15:15:56
* @Entity com.cj.jiaqingjiayi.model.domain.Cart
*/
public interface CartMapper extends BaseMapper<Cart> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.Commodities;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表commodities(商品表)的数据库操作Mapper
* @createDate 2024-08-20 19:55:49
* @Entity com.cj.jiaqingjiayi.model.domain.Commodities
*/
public interface CommoditiesMapper extends BaseMapper<Commodities> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.ManicuristAuth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表manicurist_auth(美甲师认证表)的数据库操作Mapper
* @createDate 2024-09-23 18:46:06
* @Entity com.cj.jiaqingjiayi.model.domain.ManicuristAuth
*/
public interface ManicuristAuthMapper extends BaseMapper<ManicuristAuth> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.Manicurist;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表manicurist(美甲师表)的数据库操作Mapper
* @createDate 2024-09-23 19:23:08
* @Entity com.cj.jiaqingjiayi.model.domain.Manicurist
*/
public interface ManicuristMapper extends BaseMapper<Manicurist> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.SpecificationsCommodities;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表specifications_commodities(商品和规格的中间表)的数据库操作Mapper
* @createDate 2024-08-21 16:21:41
* @Entity com.cj.jiaqingjiayi.model.domain.SpecificationsCommodities
*/
public interface SpecificationsCommoditiesMapper extends BaseMapper<SpecificationsCommodities> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.cj.jiaqingjiayi.model.domain.Specifications;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 高木
* @description 针对表specifications(规格表)的数据库操作Mapper
* @createDate 2024-08-21 16:20:48
* @Entity com.cj.jiaqingjiayi.model.domain.Specifications
*/
public interface SpecificationsMapper extends BaseMapper<Specifications> {
}

View File

@ -0,0 +1,18 @@
package com.cj.jiaqingjiayi.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cj.jiaqingjiayi.model.domain.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @author ly
*
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -0,0 +1,56 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 属性表
* @TableName attribute
*/
@TableName(value ="attribute")
@Data
public class Attribute implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商家id
*/
private Long businessId;
/**
* 规格id
*/
private Long specificationsId;
/**
* 属性名称
*/
private String attributeName;
/**
* 属性状态:0在售,1停售
*/
private Integer attributeStatus;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,101 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 商家
* @TableName business
*/
@TableName(value ="business")
@Data
public class Business implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 门店名称
*/
private String businessName;
/**
* 门店头像
*/
private String businessAvatar;
/**
* 门店手机号
*/
private String businessPhone;
/**
* 店铺详细地址
*/
private String address;
/**
* 门店简介
*/
private String businessProfile;
/**
* 商家相册
*/
private String businessImages;
/**
* 分类id
*/
private Long categoryId;
/**
* 开始营业时间
*/
private String startBusiness;
/**
* 结束营业时间
*/
private String endBusiness;
/**
* 状态:0审核中,1启用,2禁用
*/
private Integer state;
/**
* 店铺状态:0休业,1营业
*/
private Integer storeStatus;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,71 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 商家认证
* @TableName business_auth
*/
@TableName(value ="business_auth")
@Data
public class BusinessAuth implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 店铺id
*/
private Long businessId;
/**
* 店主名
*/
private String shopkeeper;
/**
* 营业执照
*/
private String license;
/**
* 身份证正面
*/
private String frontIdCard;
/**
* 身份证反面
*/
private String backIdCard;
/**
* 银行卡号
*/
private String bankCard;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,77 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 购物车表
* @TableName cart
*/
@TableName(value ="cart")
@Data
public class Cart implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 商家id
*/
private Long businessId;
/**
* 加入购物车时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 商品id
*/
private Long commoditiesId;
/**
* 商品数量
*/
private Integer quantity;
/**
* 当前选择规格的价格
*/
private BigDecimal price;
/**
* 小计单价 * 数量
*/
private BigDecimal subtotal;
/**
* 已选规格属性列表
*/
private String selectedOptions;
/**
* 是否删除
*/
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,76 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 商品表
* @TableName commodities
*/
@TableName(value ="commodities")
@Data
public class Commodities implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商家id
*/
private Long businessId;
/**
* 商品分组id
*/
private Long commoditiesGroupId;
/**
* 商品名称
*/
private String commoditiesName;
/**
* 商品图片
*/
private String commoditiesImage;
/**
* 商品价格
*/
private Double commoditiesPrice;
/**
* 库存数量
*/
private Integer inventoryStatus;
/**
* 商品状态上架下架
*/
private String status;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,96 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 美甲师表
* @TableName manicurist
*/
@TableName(value ="manicurist")
@Data
public class Manicurist implements Serializable {
/**
* 美甲师唯一标识主键自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户ID关联用户表
*/
private Long userId;
/**
* 商家ID关联商家表
*/
private Long businessId;
/**
* 美甲师姓名
*/
private String name;
/**
* 性别
*/
private Integer gender;
/**
* 美甲师联系电话
*/
private String phone;
/**
* 美甲师电子邮件
*/
private String email;
/**
* 美甲师入职日期
*/
private Date employment_date;
/**
* 美甲师的专长如法式美甲彩绘等
*/
private String specialties;
/**
* 美甲师的服务评分
*/
private BigDecimal rating;
/**
* 美甲师的基本薪资
*/
private BigDecimal salary;
/**
* 逻辑删除标志0 表示未删除1 表示已删除
*/
@TableLogic
private Integer isDelete;
/**
* 记录创建时间
*/
private Date createTime;
/**
* 记录更新时间
*/
private Date updateTime;
/**
* 美甲师头像的存储路径或链接
*/
private String manicuristAvatar;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,60 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 美甲师认证表
* @TableName manicurist_auth
*/
@TableName(value ="manicurist_auth")
@Data
public class ManicuristAuth implements Serializable {
/**
* 认证唯一标识主键自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 美甲师ID关联美甲师表
*/
private Long artistId;
/**
* 认证编号
*/
private String certification_number;
/**
* 发证机构
*/
private String issuing_authority;
/**
* 证书文件的存储路径或链接
*/
private String certificate_path;
/**
* 记录创建时间
*/
private Date createTime;
/**
* 记录更新时间
*/
private Date updateTime;
/**
* 逻辑删除标志0 表示未删除1 表示已删除
*/
@TableLogic
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,51 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 规格表
* @TableName specifications
*/
@TableName(value ="specifications")
@Data
public class Specifications implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商家id
*/
private Long businessId;
/**
* 规格名称
*/
private String specificationsName;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,51 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 商品和规格的中间表
* @TableName specifications_commodities
*/
@TableName(value ="specifications_commodities")
@Data
public class SpecificationsCommodities implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商品id
*/
private Long commoditiesId;
/**
* 规格id
*/
private Long specificationsId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private Integer isDelete;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,97 @@
package com.cj.jiaqingjiayi.model.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户
* @TableName user
*/
@TableName(value ="user")
@Data
public class User implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 支付宝开放平台id
*/
private String unionId;
/**
* openId
*/
private String openId;
/**
* 用户昵称
*/
private String username;
/**
* 账号
*/
private String userAccount;
/**
* 用户头像
*/
private String avatarUrl;
/**
* 性别
*/
private Integer gender;
/**
* 密码
*/
private String userPassword;
/**
* 电话
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 状态 0 -正常
*/
private Integer userStatus;
/**
* 创建时间
*/
private Date createTime;
/**
*
*/
private Date updateTime;
/**
* 是否删除
*/
@TableLogic
private Integer isDelete;
/**
* 用户角色 0 - 普通用户 1 - 管理员
*/
private Integer userRole;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,54 @@
package com.cj.jiaqingjiayi.model.request.Commodities;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
public class CommoditiesAddRequest implements Serializable {
@Serial
private static final long serialVersionUID = -8094188745265544921L;
/**
* 该商品的规格id列表
*/
private List<Long> specificationsIds;
/**
* 商家id
*/
private Long businessId;
/**
* 商品分组id
*/
private Long commoditiesGroupId;
/**
* 商品名称
*/
private String commoditiesName;
/**
* 商品图片
*/
private String commoditiesImage;
/**
* 商品价格
*/
private Double commoditiesPrice;
/**
* 库存数量
*/
private Integer inventoryStatus;
/**
* 商品状态上架下架
*/
private String status;
}

View File

@ -0,0 +1,20 @@
package com.cj.jiaqingjiayi.model.request.Commodities;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
public class CommoditiesDeleteRequest implements Serializable {
@Serial
private static final long serialVersionUID = 8880136450188924209L;
/**
* id
*/
private Long id;
}

View File

@ -0,0 +1,35 @@
package com.cj.jiaqingjiayi.model.request.Commodities;
import com.cj.jiaqingjiayi.model.request.PageRequest;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
public class CommoditiesQueryRequest extends PageRequest implements Serializable {
@Serial
private static final long serialVersionUID = -483140126402634506L;
/**
* 商家id
*/
private Long businessId;
/**
* 商品分组id
*/
private Long commoditiesGroupId;
/**
* 商品名称
*/
private String commoditiesName;
/**
* 商品状态上架下架
*/
private String status;
}

View File

@ -0,0 +1,61 @@
package com.cj.jiaqingjiayi.model.request.Commodities;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
public class CommoditiesUpdateRequest implements Serializable {
@Serial
private static final long serialVersionUID = 7891617409382838083L;
/**
* id
*/
private Long id;
/**
* 该商品的规格id列表
*/
private List<Long> specificationsIds;
/**
* 商家id
*/
private Long businessId;
/**
* 商品分组id
*/
private Long commoditiesGroupId;
/**
* 商品名称
*/
private String commoditiesName;
/**
* 商品图片
*/
private String commoditiesImage;
/**
* 商品价格
*/
private Double commoditiesPrice;
/**
* 库存数量
*/
private Integer inventoryStatus;
/**
* 商品状态上架下架
*/
private String status;
}

View File

@ -0,0 +1,34 @@
package com.cj.jiaqingjiayi.model.request;
import com.cj.jiaqingjiayi.contant.CommonConstant;
import lombok.Data;
/**
* 分页请求
*/
@Data
public class PageRequest {
/**
* 当前页号
*/
private long current = 1;
/**
* 页面大小
*/
private long pageSize = 10;
/**
* 排序字段
*/
private String sortField;
/**
* 排序顺序默认升序
*/
private String sortOrder = CommonConstant.SORT_ORDER_ASC;
}

View File

@ -0,0 +1,99 @@
package com.cj.jiaqingjiayi.model.request.business;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 商家添加请求
*
* @TableName business
*/
@Data
public class BusinessAddRequest implements Serializable {
@Serial
private static final long serialVersionUID = 7762081065466040395L;
/**
* 账号
*/
private String userAccount;
/**
* 密码
*/
private String userPassword;
/**
* 门店名
*/
private String businessName;
/**
* 门店头像
*/
private String businessAvatar;
/**
* 门店手机号
*/
private String businessPhone;
/**
* 店铺详细地址
*/
private String address;
/**
* 门店简介
*/
private String businessProfile;
/**
* 商家相册
*/
private String businessImages;
/**
* 分类id
*/
private Long categoryId;
/**
* 店主名
*/
private String shopkeeper;
/**
* 营业执照
*/
private String license;
/**
* 身份证正面
*/
private String frontIdCard;
/**
* 身份证反面
*/
private String backIdCard;
/**
* 银行卡号
*/
private String bankCard;
/**
* 开始营业时间
*/
private String startBusiness;
/**
* 结束营业时间
*/
private String endBusiness;
}

View File

@ -0,0 +1,62 @@
package com.cj.jiaqingjiayi.model.request.business;
import com.cj.jiaqingjiayi.model.request.PageRequest;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.io.Serializable;
/**
* 商家查询请求体
*
* @TableName business
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class BusinessQueryRequest extends PageRequest implements Serializable {
/**
* id
*/
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 门店名称
*/
private String businessName;
/**
* 门店地址
*/
private String address;
/**
* 门店简介
*/
private String businessProfile;
/**
* 分类id
*/
private Long categoryId;
/**
* 状态:0禁用,1启用
*/
private Integer state;
/**
* 店铺状态:0休业,1营业
*/
private Integer storeStatus;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,83 @@
package com.cj.jiaqingjiayi.model.request.business;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 商家更新请求
*
*/
@Data
public class BusinessUpdateRequest implements Serializable {
@Serial
private static final long serialVersionUID = 2615860827104965045L;
/**
* id
*/
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 门店昵称
*/
private String businessName;
/**
* 门店头像
*/
private String businessAvatar;
/**
* 门店手机号
*/
private String businessPhone;
/**
* 店铺详细地址
*/
private String address;
/**
* 门店简介
*/
private String businessProfile;
/**
* 商家相册
*/
private String businessImages;
/**
* 分类id
*/
private Long categoryId;
/**
* 开始营业时间
*/
private String startBusiness;
/**
* 结束营业时间
*/
private String endBusiness;
/**
* 状态:0禁用,1启用
*/
private Integer state;
/**
* 店铺状态:0休业,1营业
*/
private Integer storeStatus;
}

View File

@ -0,0 +1,36 @@
package com.cj.jiaqingjiayi.model.request.cart;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author xy
*/
@Data
public class CartAddRequest implements Serializable {
@Serial
private static final long serialVersionUID = 2466273435949197859L;
/**
* 商家id
*/
private Long businessId;
/**
* 关联的商品id
*/
private Long commoditiesId;
/**
* 商品数量
*/
private Integer quantity;
/**
* 已选规格属性列表
*/
private String selectedOptions = "";
}

View File

@ -0,0 +1,23 @@
package com.cj.jiaqingjiayi.model.request.cart;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author xy
*/
@Data
public class CartDeleteRequest implements Serializable {
@Serial
private static final long serialVersionUID = -8695320813786782366L;
/**
* id
*/
private Long id;
}

View File

@ -0,0 +1,23 @@
package com.cj.jiaqingjiayi.model.request.cart;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author xy
*/
@Data
public class CartQueryRequest implements Serializable {
@Serial
private static final long serialVersionUID = -3655808874226929017L;
/**
* id
*/
private Long id;
}

View File

@ -0,0 +1,43 @@
package com.cj.jiaqingjiayi.model.request.cart;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author xy
*/
@Data
public class CartUpdateRequest implements Serializable {
@Serial
private static final long serialVersionUID = -8867758794571915534L;
/**
* id
*/
private Long id;
/**
* 关联的商品id
*/
private Long commoditiesId;
/**
* 商品数量
*/
private Integer quantity;
/**
* 是否加入有规格的商品
*/
private Boolean isSelectedOptions = false;
/**
* 已选规格属性列表
*/
private String selectedOptions = "";
}

View File

@ -0,0 +1,76 @@
package com.cj.jiaqingjiayi.model.request.manicurist;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ManicuristAddRequest implements Serializable {
@Serial
private static final long serialVersionUID = -1651547088747557889L;
/**
* 账号
*/
private String userAccount;
/**
* 密码
*/
private String userPassword;
/**
* 美甲师姓名
*/
private String name;
/**
* 性别
*/
private Integer gender;
/**
* 美甲师联系电话
*/
private String phone;
/**
* 美甲师电子邮件
*/
private String email;
/**
* 美甲师的专长如法式美甲彩绘等
*/
private String specialties;
/**
* 美甲师的服务评分
*/
private BigDecimal rating;
/**
* 美甲师的基本薪资
*/
private BigDecimal salary;
/**
* 认证编号
*/
private String certification_number;
/**
* 发证机构
*/
private String issuing_authority;
/**
* 证书文件的存储路径或链接
*/
private String certificate_path;
}

View File

@ -0,0 +1,78 @@
package com.cj.jiaqingjiayi.model.request.manicurist;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.cj.jiaqingjiayi.model.request.PageRequest;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ManicuristQueryRequest extends PageRequest implements Serializable {
@Serial
private static final long serialVersionUID = -5433330530903928177L;
/**
* 美甲师唯一标识主键自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户ID关联用户表
*/
private Long userId;
/**
* 商家ID关联商家表
*/
private Long businessId;
/**
* 美甲师姓名
*/
private String name;
/**
* 性别
*/
private Integer gender;
/**
* 美甲师联系电话
*/
private String phone;
/**
* 美甲师电子邮件
*/
private String email;
/**
* 美甲师入职日期
*/
private Date employment_date;
/**
* 美甲师的专长如法式美甲彩绘等
*/
private String specialties;
/**
* 美甲师的服务评分
*/
private BigDecimal rating;
/**
* 美甲师的基本薪资
*/
private BigDecimal salary;
/**
* 美甲师头像的存储路径或链接
*/
private String manicuristAvatar;
}

View File

@ -0,0 +1,72 @@
package com.cj.jiaqingjiayi.model.request.manicurist;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ManicuristUpdateRequest implements Serializable {
@Serial
private static final long serialVersionUID = -5199566725120312494L;
/**
* 美甲师唯一标识主键自增
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商家ID关联商家表
*/
private Long businessId;
/**
* 美甲师姓名
*/
private String name;
/**
* 性别
*/
private Integer gender;
/**
* 美甲师联系电话
*/
private String phone;
/**
* 美甲师电子邮件
*/
private String email;
/**
* 美甲师入职日期
*/
private Date employment_date;
/**
* 美甲师的专长如法式美甲彩绘等
*/
private String specialties;
/**
* 美甲师的服务评分
*/
private BigDecimal rating;
/**
* 美甲师的基本薪资
*/
private BigDecimal salary;
/**
* 美甲师头像的存储路径或链接
*/
private String manicuristAvatar;
}

View File

@ -0,0 +1,47 @@
package com.cj.jiaqingjiayi.model.request.manicurist;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class MyManicuristUpdateRequest implements Serializable {
@Serial
private static final long serialVersionUID = -3025700511375845200L;
/**
* 美甲师姓名
*/
private String name;
/**
* 性别
*/
private Integer gender;
/**
* 美甲师联系电话
*/
private String phone;
/**
* 美甲师电子邮件
*/
private String email;
/**
* 美甲师的专长如法式美甲彩绘等
*/
private String specialties;
/**
* 美甲师头像的存储路径或链接
*/
private String manicuristAvatar;
}

View File

@ -0,0 +1,41 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
/**
*
* 用户创建请求
*
* @author gm
*/
@Data
public class UserAddRequest implements Serializable {
private static final long serialVersionUID = 3646996345132590650L;
/**
* 用户昵称
*/
private String username;
/**
* 用户账号
*/
private String userAccount;
/**
* 用户密码
*/
private String userPassword;
/**
* 用户头像
*/
private String avatarUrl;
}

View File

@ -0,0 +1,16 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
//用户删除请求
@Data
public class UserDeleteRequest implements Serializable {
private Long id;
private static final long serialVersionUID = -8544256059657791194L;
}

View File

@ -0,0 +1,26 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
/**
* 用户登录请求体
*/
@Data
public class UserLoginRequest implements Serializable {
private static final long serialVersionUID = 3191241716373120793L;
/**
* 用户账号
*/
private String userAccount;
/**
* 用户密码
*/
private String userPassword;
}

View File

@ -0,0 +1,30 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
/**
* 用户注册请求体参数
*
*/
@Data
public class UserRegisterRequest implements Serializable {
/**
* 防止序列化出现冲突
*/
private static final long serialVersionUID = 3553317334228624372L;
/**
* 用户账号
*/
private String userAccount;
/**
* 用户密码
*/
private String userPassword;
/**
* 校验密码
*/
private String checkPassword;
}

View File

@ -0,0 +1,67 @@
package com.cj.jiaqingjiayi.model.request.user;
import com.cj.jiaqingjiayi.model.request.PageRequest;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*用户查询请求
*/
@Data
public class UserSearchRequest extends PageRequest implements Serializable {
/**
* 用户昵称
*/
private String username;
/**
* 账号
*/
private String userAccount;
/**
* 用户头像
*/
private String avatarUrl;
/**
* 性别
*/
private Integer gender;
/**
* 电话
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 状态 0-正常 1-注销 2-封号
*/
private Integer userStatus;
/**
* 更新时间
*/
private Date updateTime;
/**
* 创建时间
*/
private Date createTime;
/**
*
*/
private Integer userRole;
}

View File

@ -0,0 +1,39 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
@Data
public class UserUpdateMyRequest implements Serializable {
private static final long serialVersionUID = 1864770371473794809L;
/**
* 用户名
*/
private String userName;
/**
* 用户头像
*/
private String avatarUrl;
/**
* 性别
*/
private String gender;
/**
* 电话
*/
private String phone;
/**
* 邮箱
*/
private String email;
}

View File

@ -0,0 +1,29 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
/**
* @author Shier
* CreateTime 2023/5/11 12:24
*/
@Data
public class UserUpdatePasswordRequest implements Serializable {
private static final long serialVersionUID = 5430586373534242807L;
/**
* 原密码
*/
private String userPassword;
/**
* 新密码
*/
private String newPassword;
/**
* 确认新密码
*/
private String checkNewPassword;
}

View File

@ -0,0 +1,58 @@
package com.cj.jiaqingjiayi.model.request.user;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 用户更新请求
*
* @author gm
*/
@Data
public class UserUpdateRequest implements Serializable {
private Long id;
/**
* 用户昵称
*/
private String userName;
/**
* 用户头像
*/
private String avatarUrl;
/**
* 性别
*/
private Integer gender;
/**
* 电话
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 状态 0 - 正常 1 - 封禁
*/
private Integer userStates;
/**
* 更新时间
*/
private Date updateTime;
/**
* 用户 or 管理员
*/
private Integer userRole;
}

View File

@ -0,0 +1,29 @@
package com.cj.jiaqingjiayi.model.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
public class AttributeVO implements Serializable {
@Serial
private static final long serialVersionUID = 7506939017812523180L;
/**
* id
*/
private Long id;
/**
* 属性名称
*/
private String attributeName;
/**
* 属性状态:0在售,1停售
*/
private Integer attributeStatus;
}

View File

@ -0,0 +1,119 @@
package com.cj.jiaqingjiayi.model.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 商家视图(管理员视角)
*/
@Data
public class BusinessAdminVO implements Serializable {
@Serial
private static final long serialVersionUID = 1250238798844609277L;
/**
* id
*/
private Long id;
/**
* 商家id
*/
private Long businessId;
/**
* 用户id
*/
private Long userId;
/**
* 门店名称
*/
private String businessName;
/**
* 门店头像
*/
private String businessAvatar;
/**
* 门店手机号
*/
private String businessPhone;
/**
* 店铺详细地址
*/
private String address;
/**
* 门店简介
*/
private String businessProfile;
/**
* 商家相册
*/
private String businessImages;
/**
* 分类id
*/
private Long categoryId;
/**
* 店主名
*/
private String shopkeeper;
/**
* 营业执照
*/
private String license;
/**
* 身份证正面
*/
private String frontIdCard;
/**
* 身份证反面
*/
private String backIdCard;
/**
* 银行卡号
*/
private String bankCard;
/**
* 开始营业时间
*/
private String startBusiness;
/**
* 结束营业时间
*/
private String endBusiness;
/**
* 状态:0禁用,1启用
*/
private Integer state;
/**
* 店铺状态:0休业,1营业
*/
private Integer storeStatus;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -0,0 +1,89 @@
package com.cj.jiaqingjiayi.model.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 商家视图 (用户视角)
*
*
*/
@Data
public class BusinessVO implements Serializable {
@Serial
private static final long serialVersionUID = 1672328670137974814L;
/**
* id
*/
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 门店名称
*/
private String businessName;
/**
* 门店头像
*/
private String businessAvatar;
/**
* 门店手机号
*/
private String businessPhone;
/**
* 店铺详细地址
*/
private String address;
/**
* 门店简介
*/
private String businessProfile;
/**
* 商家相册
*/
private String businessImages;
/**
* 开始营业时间
*/
private String startBusiness;
/**
* 结束营业时间
*/
private String endBusiness;
/**
* 月售
*/
private Long monthlySales;
/**
* 分类id
*/
private Long categoryId;
/**
* 店铺状态:0休业,1营业
*/
private Integer storeStatus;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -0,0 +1,54 @@
package com.cj.jiaqingjiayi.model.vo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 购物车表
* @TableName cart
*/
@TableName(value ="cart")
@Data
public class CartVO implements Serializable {
/**
* id
*/
private Long id;
/**
* 商家id
*/
private Long businessId;
/**
* 商品id
*/
private Long commoditiesId;
/**
* 商品数量
*/
private Integer quantity;
/**
* 当前选择规格的价格
*/
private BigDecimal price;
/**
* 小计单价 * 数量
*/
private BigDecimal subtotal;
/**
* 已选规格属性列表
*/
private String selectedOptions;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,36 @@
package com.cj.jiaqingjiayi.model.vo;
import lombok.Data;
@Data
public class CommoditiesVO {
/**
* 商品名称
*/
private String CommoditiesName;
/**
* 商品图片
*/
private String CommoditiesImage;
/**
* 商品价格
*/
private Double CommoditiesPrice;
/**
* 库存数量
*/
private Integer inventoryStatus;
/**
* 商品状态上架下架
*/
private String status;
/**
* 是否有规格0没有1
*/
private Integer isSpecification = 0;
}

View File

@ -0,0 +1,59 @@
package com.cj.jiaqingjiayi.model.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 已登录用户视图脱敏
* @author bsz
*/
@Data
public class LoginUserVO implements Serializable {
/**
* 用户 id
*/
private Long id;
/**
* 用户昵称
*/
private String username;
/**
* 用户头像
*/
private String avatarUrl;
/**
* 性别
*/
private Integer gender;
/**
* 手机号
*/
private String phone;
/**
* 用户角色user/admin
*/
private Integer userRole;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@Serial
private static final long serialVersionUID = 6304492672093490894L;
}

View File

@ -0,0 +1,68 @@
package com.cj.jiaqingjiayi.model.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.math.BigDecimal;
import java.util.Date;
public class ManicuristVO {
/**
* 美甲师唯一标识主键自增
*/
private Long id;
/**
* 用户ID关联用户表
*/
private Long userId;
/**
* 商家ID关联商家表
*/
private Long businessId;
/**
* 美甲师姓名
*/
private String name;
/**
* 性别
*/
private Integer gender;
/**
* 美甲师联系电话
*/
private String phone;
/**
* 美甲师电子邮件
*/
private String email;
/**
* 美甲师入职日期
*/
private Date employment_date;
/**
* 美甲师的专长如法式美甲彩绘等
*/
private String specialties;
/**
* 美甲师的服务评分
*/
private BigDecimal rating;
/**
* 美甲师头像的存储路径或链接
*/
private String manicuristAvatar;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,31 @@
package com.cj.jiaqingjiayi.model.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
public class SpecificationsVO implements Serializable {
@Serial
private static final long serialVersionUID = 7672330198150498714L;
/**
* 规格id
*/
private Long id;
/**
* 规格名称
*/
private String specificationsName;
/**
* 该规格的所有属性
*/
private List<AttributeVO> attributeVOList;
}

View File

@ -0,0 +1,20 @@
package com.cj.jiaqingjiayi.service;
import com.cj.jiaqingjiayi.model.domain.Attribute;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.vo.SpecificationsVO;
import java.util.List;
/**
* @author 高木
* @description 针对表attribute(属性表)的数据库操作Service
* @createDate 2024-08-21 16:29:45
*/
public interface AttributeService extends IService<Attribute> {
/**
* 根据规格id获取属性脱敏列表
*/
List<SpecificationsVO> getBySpecificationsVoId(List<SpecificationsVO> specificationsVOList);
}

View File

@ -0,0 +1,19 @@
package com.cj.jiaqingjiayi.service;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.cj.jiaqingjiayi.model.domain.BusinessAuth;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.vo.BusinessAdminVO;
/**
* @author 高木
* @description 针对表business_auth(商家认证)的数据库操作Service
* @createDate 2024-07-28 17:18:28
*/
public interface BusinessAuthService extends IService<BusinessAuth> {
/**
* 获取脱敏的商家信息
*/
BusinessAdminVO getBusinessAdminVO(Business business);
}

View File

@ -0,0 +1,54 @@
package com.cj.jiaqingjiayi.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.domain.BusinessAuth;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.business.BusinessQueryRequest;
import com.cj.jiaqingjiayi.model.vo.BusinessVO;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @author 高木
* @description 针对表business(商家)的数据库操作Service
* @createDate 2024-07-28 17:16:33
*/
public interface BusinessService extends IService<Business> {
/**
* 添加商户和商家的账户以及填充认证信息
* @param user
* @param business
* @param businessAuth
*/
void addBusiness(User user, Business business, BusinessAuth businessAuth);
/**
*校验
*/
void validUser(User user, boolean add);
void validBusiness(Business business, boolean add);
void validBusinessAuth(BusinessAuth businessAuth, boolean add);
/**
* 获取查询条件
*/
QueryWrapper<Business> getQueryWrapper(BusinessQueryRequest businessQueryRequest);
public BusinessVO getBusinessVO(Business business);
/**
* 获取脱敏的商家信息
*/
List<BusinessVO> getBusinessVO(List<Business> businessList);
/**
* 获取当前登录商家
*/
Business getLoginBusiness(HttpServletRequest request);
}

View File

@ -0,0 +1,37 @@
package com.cj.jiaqingjiayi.service;
import com.cj.jiaqingjiayi.model.domain.Cart;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.request.cart.CartAddRequest;
import com.cj.jiaqingjiayi.model.request.cart.CartUpdateRequest;
import javax.servlet.http.HttpServletRequest;
/**
* @author 高木
* @description 针对表cart(购物车表)的数据库操作Service
* @createDate 2024-09-05 15:15:56
*/
public interface CartService extends IService<Cart> {
/**
* 校验
*/
void validCart(CartAddRequest cartAddRequest);
/**
* 添加菜品
*/
Long addCart (CartAddRequest cartAddRequest, HttpServletRequest request);
/**
* 更新购物车菜品
*/
Boolean updateCart(CartUpdateRequest cartUpdateRequest, HttpServletRequest request);
/**
* 删除购物车菜品
*/
Boolean deleteCart(Long cartId, HttpServletRequest request);
}

View File

@ -0,0 +1,54 @@
package com.cj.jiaqingjiayi.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cj.jiaqingjiayi.model.domain.Commodities;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.request.Commodities.CommoditiesQueryRequest;
import com.cj.jiaqingjiayi.model.vo.CommoditiesVO;
import java.util.List;
/**
* @author 高木
* @description 针对表commodities(商品表)的数据库操作Service
* @createDate 2024-08-20 19:55:49
*/
public interface CommoditiesService extends IService<Commodities> {
/**
* 校验
*/
void validCommodities(Commodities commodities, Boolean update);
/**
* 添加商品
*/
Long addCommodities(Commodities commodities);
/**
* 根据分组id删除商品
*/
void removeByCommoditiesGroupId(Long commoditiesId);
/**
* 更新菜品
*/
Boolean updateCommodities(Commodities commodities);
/**
* 获取商品脱敏信息
*/
CommoditiesVO getCommoditiesVO(Commodities commodities);
/**
* 获取商品查询条件
*/
QueryWrapper<Commodities> getWrapper(CommoditiesQueryRequest commoditiesQueryRequest);
/**
* 获取商品脱敏信信息
*/
List<CommoditiesVO> getCommoditiesVOList(List<Commodities> commoditiesVOList);
}

View File

@ -0,0 +1,13 @@
package com.cj.jiaqingjiayi.service;
import com.cj.jiaqingjiayi.model.domain.ManicuristAuth;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 高木
* @description 针对表manicurist_auth(美甲师认证表)的数据库操作Service
* @createDate 2024-09-23 18:46:06
*/
public interface ManicuristAuthService extends IService<ManicuristAuth> {
}

View File

@ -0,0 +1,42 @@
package com.cj.jiaqingjiayi.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cj.jiaqingjiayi.model.domain.*;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.request.business.BusinessQueryRequest;
import com.cj.jiaqingjiayi.model.request.manicurist.ManicuristQueryRequest;
/**
* @author 高木
* @description 针对表manicurist(美甲师表)的数据库操作Service
* @createDate 2024-09-23 19:23:08
*/
public interface ManicuristService extends IService<Manicurist> {
/**
* 添加美甲师和商家的账户以及填充认证信息
* @param user
* @param manicurist
* @param manicuristAuth
*/
void addManicurist(User user, Manicurist manicurist, ManicuristAuth manicuristAuth);
/**
*校验
*/
void validUser(User user, boolean add);
void validManicurist(Manicurist manicurist, boolean add);
void validManicuristAuth(ManicuristAuth manicuristAuth, boolean add);
//检验商家是否存在
void validManBus(Long businessId);
void deleteMan(long id);
/**
* 获取查询条件
*/
QueryWrapper<Manicurist> getQueryWrapper(ManicuristQueryRequest manicuristQueryRequest);
}

View File

@ -0,0 +1,37 @@
package com.cj.jiaqingjiayi.service;
import com.cj.jiaqingjiayi.model.domain.SpecificationsCommodities;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.vo.SpecificationsVO;
import java.util.List;
/**
* @author 高木
* @description 针对表specifications_commodities(商品和规格的中间表)的数据库操作Service
* @createDate 2024-08-21 16:21:41
*/
public interface SpecificationsCommoditiesService extends IService<SpecificationsCommodities> {
/**
* 添加中间表信息
*/
Boolean add(Long commoditiesId, List<Long> specificationsIds);
/**
* 删除中间表信息
*/
void deleteByCommoditiesId(Long commoditiesId);
/**
* 更新中间表信息
*/
Boolean updateByCommoditiesId(Long commoditiesId, List<Long> specificationsIds);
/**
* 根据中间表数据中的规格id获取规格信息和属性
*/
List<SpecificationsVO> getSpecificationsAddAttribute(List<SpecificationsCommodities> specificationsCommoditiesList);
}

View File

@ -0,0 +1,13 @@
package com.cj.jiaqingjiayi.service;
import com.cj.jiaqingjiayi.model.domain.Specifications;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 高木
* @description 针对表specifications(规格表)的数据库操作Service
* @createDate 2024-08-21 16:20:48
*/
public interface SpecificationsService extends IService<Specifications> {
}

View File

@ -0,0 +1,80 @@
package com.cj.jiaqingjiayi.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.user.UserSearchRequest;
import com.cj.jiaqingjiayi.model.request.user.UserUpdatePasswordRequest;
import com.cj.jiaqingjiayi.model.vo.LoginUserVO;
import javax.servlet.http.HttpServletRequest;
import static com.cj.jiaqingjiayi.contant.UserConstant.ADMIN_ROLE;
import static com.cj.jiaqingjiayi.contant.UserConstant.USER_LOGIN_STATE;
public interface UserService extends IService<User> {
/**
* 用户注册
*
* @param userAccount 登陆账号
* @param userPassword 登录密码
* @param checkPassword 校验密码
* @return 新用户id
*/
long userRegister(String userAccount, String userPassword, String checkPassword);
/**
*
* @param userAccount 登陆账号
* @param userPassword 登陆密码
* @param request 返回请求
* @return 脱敏后的用户信息
*/
LoginUserVO userLogin(String userAccount, String userPassword, HttpServletRequest request);
/**
* 用户注销
* @param request
* @return
*/
int userLogout(HttpServletRequest request);
/**
* 用户脱敏
* @param user
* @return
*/
User getSafetyUser(User user);
/**
* 获取当前用户登录信息
*
* @param request
* @return
*/
User getLogingUser(HttpServletRequest request);
/**
* 用户修改密码
* @param userUpdatePasswordRequest
* @param request
* @return
*/
boolean updateUserPassword(UserUpdatePasswordRequest userUpdatePasswordRequest, HttpServletRequest request);
/**
* 分页条件
* @param searchRequest
* @return
*/
QueryWrapper<User> getQueryWrapper(UserSearchRequest searchRequest);
LoginUserVO getLoginUserVO(User user);
/**
* 判断是否为管理员
* @return
*/
void isAdmin(HttpServletRequest request);
}

View File

@ -0,0 +1,63 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.model.domain.Attribute;
import com.cj.jiaqingjiayi.model.vo.AttributeVO;
import com.cj.jiaqingjiayi.model.vo.SpecificationsVO;
import com.cj.jiaqingjiayi.service.AttributeService;
import com.cj.jiaqingjiayi.mapper.AttributeMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 高木
* @description 针对表attribute(属性表)的数据库操作Service实现
* @createDate 2024-08-21 16:29:45
*/
@Service
public class AttributeServiceImpl extends ServiceImpl<AttributeMapper, Attribute>
implements AttributeService{
@Override
public List<SpecificationsVO> getBySpecificationsVoId(List<SpecificationsVO> specificationsVOList) {
if (CollectionUtils.isEmpty(specificationsVOList)) {
return specificationsVOList;
}
return specificationsVOList.stream().peek(item ->{
Long specificationsId = item.getId();
//根据规格id获取属性
QueryWrapper<Attribute> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("specificationsId",specificationsId);
List<Attribute> attributeList = this.list(queryWrapper);
//获取属性脱敏信息
List<AttributeVO> attributeVOList = getAttributeVOList(attributeList);
item.setAttributeVOList(attributeVOList);
}).collect(Collectors.toList());
}
/**
* 获取脱敏属性列表
* @param attributes 为脱敏列表
* @return 脱敏列表
*/
private List<AttributeVO> getAttributeVOList (List<Attribute> attributes) {
if (CollectionUtils.isEmpty(attributes)) {
return new ArrayList<>();
}
return attributes.stream().map(item -> {
AttributeVO attributeVO = new AttributeVO();
BeanUtils.copyProperties(item,attributeVO);
return attributeVO;
}).collect(Collectors.toList());
}
}

View File

@ -0,0 +1,55 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.cj.jiaqingjiayi.model.domain.BusinessAuth;
import com.cj.jiaqingjiayi.model.vo.BusinessAdminVO;
import com.cj.jiaqingjiayi.service.BusinessAuthService;
import com.cj.jiaqingjiayi.mapper.BusinessAuthMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
/**
* @author 高木
* @description 针对表business_auth(商家认证)的数据库操作Service实现
* @createDate 2024-07-28 17:18:28
*/
@Service
public class BusinessAuthServiceImpl extends ServiceImpl<BusinessAuthMapper, BusinessAuth>
implements BusinessAuthService{
@Override
public BusinessAdminVO getBusinessAdminVO(Business business) {
if (business == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
BusinessAdminVO businessAdminVO = new BusinessAdminVO();
//关联认证信息 传入到视图中
BusinessAuth businessAuth = new BusinessAuth();
Long id = business.getId();
if (id != null && id > 0) {
QueryWrapper<BusinessAuth> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("businessId", id);
businessAuth = this.getOne(queryWrapper);
}
BeanUtils.copyProperties(business, businessAdminVO);
if (businessAuth == null) {
throw new BusinessException(ErrorCode.NULL_ERROR);
}
BeanUtils.copyProperties(businessAuth, businessAdminVO);
return businessAdminVO;
}
}

View File

@ -0,0 +1,212 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.contant.CommonConstant;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.cj.jiaqingjiayi.model.domain.BusinessAuth;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.business.BusinessQueryRequest;
import com.cj.jiaqingjiayi.model.vo.BusinessVO;
import com.cj.jiaqingjiayi.service.BusinessAuthService;
import com.cj.jiaqingjiayi.service.BusinessService;
import com.cj.jiaqingjiayi.mapper.BusinessMapper;
import com.cj.jiaqingjiayi.service.ManicuristService;
import com.cj.jiaqingjiayi.service.UserService;
import com.cj.jiaqingjiayi.utils.RegexUtils;
import com.cj.jiaqingjiayi.utils.SqlUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 高木
* @description 针对表business(商家)的数据库操作Service实现
* @createDate 2024-07-28 17:16:33
*/
@Service
public class BusinessServiceImpl extends ServiceImpl<BusinessMapper, Business>
implements BusinessService{
@Resource
private UserService userService;
@Resource
private BusinessAuthService businessAuthService;
@Override
@Transactional(rollbackFor = Exception.class)
public synchronized void addBusiness(User user, Business business, BusinessAuth businessAuth) {
boolean save = userService.save(user);
ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建商家失败");
//商家绑定user
business.setUserId(user.getId());
boolean save1 = this.save(business);
ThrowUtils.throwIf(!save1, ErrorCode.OPERATION_ERROR, "绑定id失败");
//添加认证信息
businessAuth.setBusinessId(business.getId());
boolean save2 = businessAuthService.save(businessAuth);
ThrowUtils.throwIf(!save2, ErrorCode.OPERATION_ERROR, "商家认证信息失败");
}
@Override
public void validUser(User user, boolean add) {
ThrowUtils.throwIf(user == null , ErrorCode.NULL_ERROR);
String userAccount = user.getUserAccount();
String userPassword = user.getUserPassword();
if (add) {
ThrowUtils.throwIf(StringUtils.isAllBlank(userAccount, userPassword), ErrorCode.PARAMS_ERROR);
if (userAccount.length() < 4) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号不符合要求");
}
if(userPassword.length() < 8) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码不符合要求");
}
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
long count = userService.count(queryWrapper);
if (count > 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "账号重复");
}
}
}
@Override
public void validBusiness(Business business, boolean add) {
Long id = business.getId();
String businessName = business.getBusinessName();
String businessAvatar = business.getBusinessAvatar();
String businessPhone = business.getBusinessPhone();
String address = business.getAddress();
String startBusiness = business.getStartBusiness();
String endBusiness = business.getEndBusiness();
//只在添加时严格校验 保证商家信息是全的
if (add) {
if (StringUtils.isAnyBlank(businessName, businessAvatar, businessPhone, address, startBusiness, endBusiness)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "商家信息不全");
}
}
Business byId = getById(id);
ThrowUtils.throwIf(byId == null, ErrorCode.NULL_ERROR, "商家不存在");
// 有参数可以校验参数 保证商家名字唯一
if (StringUtils.isNotBlank(businessName)) {
QueryWrapper<Business> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("businessName", businessName);
long count = this.count(queryWrapper);
ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "门店名称重复");
}
//校验手机号格式
if (StringUtils.isNotBlank(businessPhone)) {
boolean phoneInvalid = RegexUtils.isPhoneInvalid(businessPhone);
ThrowUtils.throwIf(phoneInvalid, ErrorCode.PARAMS_ERROR, "手机号格式错误");
QueryWrapper<Business> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("businessPhone", businessPhone);
long count = this.count(queryWrapper);
ThrowUtils.throwIf(count > 0 , ErrorCode.OPERATION_ERROR, "手机号重复");
}
}
@Override
public void validBusinessAuth(BusinessAuth businessAuth, boolean add) {
//只在添加时严格校验 保证商家认证信息是全的
if (add) {
String shopkeeper = businessAuth.getShopkeeper();
String license = businessAuth.getLicense();
String frontIdCard = businessAuth.getFrontIdCard();
String backIdCard = businessAuth.getBackIdCard();
String bankCard = businessAuth.getBankCard();
if (StringUtils.isAnyBlank(shopkeeper, license, frontIdCard, bankCard, backIdCard)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "商家认证信息不全");
}
}
}
@Override
public QueryWrapper<Business> getQueryWrapper(BusinessQueryRequest businessQueryRequest) {
if (businessQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
Long id = businessQueryRequest.getId();
Long userId = businessQueryRequest.getUserId();
Long categoryId = businessQueryRequest.getCategoryId();
Integer state = businessQueryRequest.getState();
Integer storeStatus = businessQueryRequest.getStoreStatus();
String businessName = businessQueryRequest.getBusinessName();
String address = businessQueryRequest.getAddress();
String businessProfile = businessQueryRequest.getBusinessProfile();
String sortField = businessQueryRequest.getSortField();
String sortOrder = businessQueryRequest.getSortOrder();
QueryWrapper<Business> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId);
queryWrapper.eq(ObjectUtils.isNotEmpty(categoryId), "categoryId", categoryId);
queryWrapper.eq(ObjectUtils.isNotEmpty(state), "state", state);
queryWrapper.eq(ObjectUtils.isNotEmpty(storeStatus), "storeStatus", storeStatus);
queryWrapper.like(StringUtils.isNotBlank(businessName), "businessName", businessName);
queryWrapper.like(StringUtils.isNotBlank(address), "address", address);
queryWrapper.like(StringUtils.isNotBlank(businessProfile), "businessProfile", businessProfile);
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
sortField);
return queryWrapper;
}
@Override
public BusinessVO getBusinessVO(Business business) {
BusinessVO businessVO = new BusinessVO();
if (business == null) {
return null;
}
BeanUtils.copyProperties(business,businessVO);
return businessVO;
}
@Override
public List<BusinessVO> getBusinessVO(List<Business> businessList) {
if (CollectionUtils.isEmpty(businessList)) {
return new ArrayList<>();
}
return businessList.stream().map(this::getBusinessVO).collect(Collectors.toList());
}
@Override
public Business getLoginBusiness(HttpServletRequest request) {
User loginUser = userService.getLogingUser(request);
QueryWrapper<Business> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userId",loginUser.getId());
Business business = this.getOne(queryWrapper);
ThrowUtils.throwIf(business == null,ErrorCode.NOT_FOUND_ERROR,"当前用户没有关联商家");
return business;
}
}

View File

@ -0,0 +1,143 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Business;
import com.cj.jiaqingjiayi.model.domain.Cart;
import com.cj.jiaqingjiayi.model.domain.Commodities;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.cart.CartAddRequest;
import com.cj.jiaqingjiayi.model.request.cart.CartUpdateRequest;
import com.cj.jiaqingjiayi.service.BusinessService;
import com.cj.jiaqingjiayi.service.CartService;
import com.cj.jiaqingjiayi.mapper.CartMapper;
import com.cj.jiaqingjiayi.service.CommoditiesService;
import com.cj.jiaqingjiayi.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
/**
* @author 高木
* @description 针对表cart(购物车表)的数据库操作Service实现
* @createDate 2024-09-05 15:15:56
*/
@Service
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart>
implements CartService{
@Resource
private UserService userService;
@Resource
private BusinessService businessService;
@Resource
private CommoditiesService commoditiesService;
@Override
public void validCart(CartAddRequest cartAddRequest) {
if (cartAddRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = cartAddRequest.getBusinessId();
Long commoditiesId = cartAddRequest.getCommoditiesId();
Integer quantity = cartAddRequest.getQuantity();
if (quantity == null || quantity < 1) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR,"商品数量错误");
}
Business business = businessService.getById(businessId);
if (business == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR,"不存在该商家");
}
Commodities commodities = commoditiesService.getById(commoditiesId);
if (commodities == null || commodities.getStatus().equals("下架")){
throw new BusinessException(ErrorCode.PARAMS_ERROR,"不存在该商品");
}
}
@Override
public Long addCart(CartAddRequest cartAddRequest, HttpServletRequest request) {
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
Long businessId = cartAddRequest.getBusinessId();
Long commoditiesId = cartAddRequest.getCommoditiesId();
//计算商品价格
Commodities commodities = commoditiesService.getById(commoditiesId);
BigDecimal price = new BigDecimal(String.valueOf(commodities.getCommoditiesPrice()));
//保存购物车商品
Cart cart = new Cart();
cart.setBusinessId(businessId);
cart.setUserId(userId);
cart.setPrice(price);
cart.setCommoditiesId(commoditiesId);
boolean save = this.save(cart);
ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR);
return cart.getId();
}
@Override
public Boolean updateCart(CartUpdateRequest cartUpdateRequest, HttpServletRequest request) {
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
Long commoditiesId = cartUpdateRequest.getCommoditiesId();
String selectedOptions = cartUpdateRequest.getSelectedOptions();
Long id = cartUpdateRequest.getId();
ThrowUtils.throwIf(id == null,ErrorCode.OPERATION_ERROR,"购物车id不存在");
//检验该购物车是否为登录用户的
Cart cartId =this.getById(id);
Long cartUserId = cartId.getUserId();
if (userId.equals(cartUserId)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR,"无法操作该购物车");
}
Commodities commodities = commoditiesService.getById(commoditiesId);
BigDecimal price = new BigDecimal(String.valueOf(commodities.getCommoditiesPrice()));
LambdaQueryWrapper<Cart> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Cart::getId, id);
Cart cart = this.getOne(wrapper);
Integer quantity = cartUpdateRequest.getQuantity();
if (cartUpdateRequest.getIsSelectedOptions()) {
cart.setQuantity(cart.getQuantity() + quantity);
} else {
cart.setQuantity(quantity);
}
cart.setPrice(price);
cart.setSubtotal(null);
cart.setSelectedOptions(selectedOptions);
return this.updateById(cart);
}
@Override
public Boolean deleteCart(Long cartId, HttpServletRequest request) {
User loginUser = userService.getLogingUser(request);
Long userId = loginUser.getId();
Cart cart = this.getById(cartId);
Long cartUserId = cart.getUserId();
if (!userId.equals(cartUserId)) {
throw new BusinessException(ErrorCode.OPERATION_ERROR, "该用户无权删除该购物车");
}
boolean remove = this.removeById(cartId);
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR);
return true;
}
}

View File

@ -0,0 +1,176 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.contant.CommonConstant;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Commodities;
import com.cj.jiaqingjiayi.model.domain.SpecificationsCommodities;
import com.cj.jiaqingjiayi.model.request.Commodities.CommoditiesQueryRequest;
import com.cj.jiaqingjiayi.model.vo.CommoditiesVO;
import com.cj.jiaqingjiayi.service.CommoditiesService;
import com.cj.jiaqingjiayi.mapper.CommoditiesMapper;
import com.cj.jiaqingjiayi.service.SpecificationsCommoditiesService;
import com.cj.jiaqingjiayi.utils.SqlUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 高木
* @description 针对表commodities(商品表)的数据库操作Service实现
* @createDate 2024-08-20 19:55:49
*/
@Service
public class CommoditiesServiceImpl extends ServiceImpl<CommoditiesMapper, Commodities>
implements CommoditiesService{
@Resource
private SpecificationsCommoditiesService specificationsCommoditiesService;
@Override
public void validCommodities(Commodities commodities, Boolean update) {
Long id = commodities.getId();
Long commoditiesGroupId = commodities.getCommoditiesGroupId();
String commoditiesName = commodities.getCommoditiesName();
Double commoditiesPrice = commodities.getCommoditiesPrice();
String status = commodities.getStatus();
Integer inventoryStatus = commodities.getInventoryStatus();
if (update) {
if (id == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
}
if (StringUtils.isAnyBlank(commoditiesName,status)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
if (commoditiesGroupId == null || commoditiesPrice == null || inventoryStatus == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
}
@Override
public Long addCommodities(Commodities commodities) {
//判断商品是否存在
validCommoditiesName(commodities);
//保存代码
boolean save = this.save(commodities);
ThrowUtils.throwIf(!save,ErrorCode.OPERATION_ERROR);
return commodities.getId();
}
@Override
public void removeByCommoditiesGroupId(Long commoditiesGroupId) {
QueryWrapper<Commodities> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("commoditiesGroupId",commoditiesGroupId);
List<Commodities> list = this.list(queryWrapper);
//判断该分组是否有商品
if (list.isEmpty()) {
return;
}
boolean remove = this.remove(queryWrapper);
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR);
//删除中间表数据
for (Commodities commodities : list) {
Long commoditiesId = commodities.getId();
specificationsCommoditiesService.deleteByCommoditiesId(commoditiesId);
}
}
@Override
public Boolean updateCommodities(Commodities commodities) {
//判断商品是否存在
validCommoditiesName(commodities);
//更新商品
return this.updateById(commodities);
}
@Override
public CommoditiesVO getCommoditiesVO(Commodities commodities) {
if (commodities == null) {
return null;
}
long count = getCount(commodities);
CommoditiesVO commoditiesVO = new CommoditiesVO();
if (count > 0) {
commoditiesVO.setIsSpecification(1);
}
return commoditiesVO;
}
@Override
public QueryWrapper<Commodities> getWrapper(CommoditiesQueryRequest commoditiesQueryRequest) {
Long businessId = commoditiesQueryRequest.getBusinessId();
Long commoditiesGroupId = commoditiesQueryRequest.getCommoditiesGroupId();
String status = commoditiesQueryRequest.getStatus();
String commoditiesName = commoditiesQueryRequest.getCommoditiesName();
String sortField = commoditiesQueryRequest.getSortField();
String sortOrder = commoditiesQueryRequest.getSortOrder();
QueryWrapper<Commodities> wrapper = new QueryWrapper<>();
wrapper.eq(businessId != null, "businessId", businessId);
wrapper.eq(commoditiesGroupId != null, "commoditiesGroupId", commoditiesGroupId);
wrapper.eq(StringUtils.isNotBlank(status), "status", status);
wrapper.like(StringUtils.isNotBlank(commoditiesName), "commoditiesName", commoditiesName);
wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField);
return wrapper;
}
@Override
public List<CommoditiesVO> getCommoditiesVOList(List<Commodities> commoditiesVOList) {
if (CollectionUtils.isEmpty(commoditiesVOList)) {
return new ArrayList<>();
}
return commoditiesVOList.stream().map(item->{
long count = getCount(item);
CommoditiesVO commoditiesVO = new CommoditiesVO();
BeanUtils.copyProperties(item,commoditiesVO);
if (count > 0) {
commoditiesVO.setIsSpecification(1);
}
return commoditiesVO;
}).collect(Collectors.toList());
}
private void validCommoditiesName(Commodities commodities) {
QueryWrapper<Commodities> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("commoditiesName",commodities.getCommoditiesName());
queryWrapper.eq("businessId",commodities.getBusinessId());
long count = this.count(queryWrapper);
if (commodities.getId() == null) {
ThrowUtils.throwIf(count > 0,ErrorCode.PARAMS_ERROR,"已存在该商品");
}
else {
ThrowUtils.throwIf(count > 0,ErrorCode.PARAMS_ERROR,"已存在该商品");
}
}
private long getCount(Commodities commodities) {
Long commoditiesId = commodities.getId();
QueryWrapper<SpecificationsCommodities> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("commoditiesId",commoditiesId);
return specificationsCommoditiesService.count(queryWrapper);
}
}

View File

@ -0,0 +1,22 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.model.domain.ManicuristAuth;
import com.cj.jiaqingjiayi.service.ManicuristAuthService;
import com.cj.jiaqingjiayi.mapper.ManicuristAuthMapper;
import org.springframework.stereotype.Service;
/**
* @author 高木
* @description 针对表manicurist_auth(美甲师认证表)的数据库操作Service实现
* @createDate 2024-09-23 18:46:06
*/
@Service
public class ManicuristAuthServiceImpl extends ServiceImpl<ManicuristAuthMapper, ManicuristAuth>
implements ManicuristAuthService{
}

View File

@ -0,0 +1,198 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.contant.CommonConstant;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.*;
import com.cj.jiaqingjiayi.model.request.business.BusinessQueryRequest;
import com.cj.jiaqingjiayi.model.request.manicurist.ManicuristQueryRequest;
import com.cj.jiaqingjiayi.service.*;
import com.cj.jiaqingjiayi.mapper.ManicuristMapper;
import com.cj.jiaqingjiayi.utils.RegexUtils;
import com.cj.jiaqingjiayi.utils.SqlUtils;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author 高木
* @description 针对表manicurist(美甲师表)的数据库操作Service实现
* @createDate 2024-09-23 19:23:08
*/
@Service
public class ManicuristServiceImpl extends ServiceImpl<ManicuristMapper, Manicurist>
implements ManicuristService{
@Resource
private UserService userService;
@Resource
private BusinessService businessService;
@Resource
private ManicuristAuthService manicuristAuthService;
@Override
public void addManicurist(User user, Manicurist manicurist, ManicuristAuth manicuristAuth) {
boolean save = userService.save(user);
ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "添加美甲师失败");
//美甲师绑定user
manicurist.setUserId(user.getId());
boolean save1 = this.save(manicurist);
ThrowUtils.throwIf(!save1, ErrorCode.OPERATION_ERROR, "绑定id失败");
//添加认证信息
manicuristAuth.setArtistId(manicurist.getId());
boolean save2 = manicuristAuthService.save(manicuristAuth);
ThrowUtils.throwIf(!save2, ErrorCode.OPERATION_ERROR, "添加美甲师认证信息失败");
}
@Override
public void validUser(User user, boolean add) {
ThrowUtils.throwIf(user == null , ErrorCode.NULL_ERROR);
String userAccount = user.getUserAccount();
String userPassword = user.getUserPassword();
if (add) {
ThrowUtils.throwIf(StringUtils.isAllBlank(userAccount, userPassword), ErrorCode.PARAMS_ERROR);
if (userAccount.length() < 4) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号不符合要求");
}
if(userPassword.length() < 8) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码不符合要求");
}
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
long count = userService.count(queryWrapper);
if (count > 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "账号重复");
}
}
}
@Override
public void validManicurist(Manicurist manicurist, boolean add) {
Long id = manicurist.getId();
String manicuristName = manicurist.getName();
String manicuristPhone = manicurist.getPhone();
String gender = Integer.toString(manicurist.getGender());
//只在添加时严格校验 保证商家信息是全的
if (add) {
if (StringUtils.isAnyBlank(manicuristName, manicuristPhone, gender)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "信息不全");
}
}
if(!add){
Manicurist byId = this.getById(id);
ThrowUtils.throwIf(byId == null, ErrorCode.NULL_ERROR, "美甲师不存在");
}
if(StringUtils.isNotBlank(manicuristName)){
QueryWrapper<Manicurist> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", manicuristName);
long count = this.count(queryWrapper);
ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "美甲师名称重复");
}
//校验手机号格式
if (StringUtils.isNotBlank(manicuristPhone)) {
boolean phoneInvalid = RegexUtils.isPhoneInvalid(manicuristPhone);
ThrowUtils.throwIf(phoneInvalid, ErrorCode.PARAMS_ERROR, "手机号格式错误");
QueryWrapper<Manicurist> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("Phone", manicuristPhone);
long count = this.count(queryWrapper);
ThrowUtils.throwIf(count > 0 , ErrorCode.OPERATION_ERROR, "手机号重复");
}
}
@Override
public void validManicuristAuth(ManicuristAuth manicuristAuth, boolean add) {
//只在添加时严格校验 保证认证信息是全的
if (add) {
String certification_number = manicuristAuth.getCertification_number();
String certificate_path = manicuristAuth.getCertificate_path();
String issuing_authority = manicuristAuth.getIssuing_authority();
if (StringUtils.isAnyBlank(certification_number, certificate_path, issuing_authority)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "美甲师认证信息不全");
}
}
}
@Override
public void validManBus(Long businessId) {
Business byId = businessService.getById(businessId);
ThrowUtils.throwIf(byId == null, ErrorCode.NULL_ERROR, "商家不存在");
}
@Override
public void deleteMan(long id) {
Manicurist manicurist = this.getById(id);
ThrowUtils.throwIf(manicurist == null, ErrorCode.OPERATION_ERROR, "删除的美甲师不存在");
Long userId = manicurist.getUserId();
User user = userService.getById(userId);
user.setUserRole(0);
boolean update = userService.updateById(user);
ThrowUtils.throwIf(!update, ErrorCode.PARAMS_ERROR, "操作失败");
boolean result = this.removeById(id);
ThrowUtils.throwIf(!result, ErrorCode.PARAMS_ERROR, "操作失败");
}
@Override
public QueryWrapper<Manicurist> getQueryWrapper(ManicuristQueryRequest manicuristQueryRequest) {
if (manicuristQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
Long id = manicuristQueryRequest.getId();
Long userId = manicuristQueryRequest.getUserId();
Long businessId = manicuristQueryRequest.getBusinessId();
String name = manicuristQueryRequest.getName();
Integer gender = manicuristQueryRequest.getGender();
String Phone = manicuristQueryRequest.getPhone();
String email = manicuristQueryRequest.getEmail();
Date employment_date = manicuristQueryRequest.getEmployment_date();
String specialties = manicuristQueryRequest.getSpecialties();
BigDecimal rating = manicuristQueryRequest.getRating();
BigDecimal salary = manicuristQueryRequest.getSalary();
QueryWrapper<Manicurist> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId);
queryWrapper.eq(ObjectUtils.isNotEmpty(businessId), "businessId", businessId);
queryWrapper.eq(ObjectUtils.isNotEmpty(name), "name", name);
queryWrapper.like(ObjectUtils.isNotEmpty(gender), "gender", gender);
queryWrapper.eq(ObjectUtils.isNotEmpty(Phone), "Phone", Phone);
queryWrapper.eq(ObjectUtils.isNotEmpty(email), "email", email);
queryWrapper.like(ObjectUtils.isNotEmpty(employment_date), "employment_date", employment_date);
queryWrapper.like(ObjectUtils.isNotEmpty(specialties), "specialties", specialties);
queryWrapper.like(ObjectUtils.isNotEmpty(rating), "rating", rating);
queryWrapper.like(ObjectUtils.isNotEmpty(salary), "salary", salary);
String sortField = manicuristQueryRequest.getSortField();
String sortOrder = manicuristQueryRequest.getSortOrder();
queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
sortField);
return queryWrapper;
}
}

View File

@ -0,0 +1,91 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.model.domain.Specifications;
import com.cj.jiaqingjiayi.model.domain.SpecificationsCommodities;
import com.cj.jiaqingjiayi.model.vo.SpecificationsVO;
import com.cj.jiaqingjiayi.service.AttributeService;
import com.cj.jiaqingjiayi.service.SpecificationsCommoditiesService;
import com.cj.jiaqingjiayi.mapper.SpecificationsCommoditiesMapper;
import com.cj.jiaqingjiayi.service.SpecificationsService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 高木
* @description 针对表specifications_commodities(商品和规格的中间表)的数据库操作Service实现
* @createDate 2024-08-21 16:21:41
*/
@Service
public class SpecificationsCommoditiesServiceImpl extends ServiceImpl<SpecificationsCommoditiesMapper, SpecificationsCommodities>
implements SpecificationsCommoditiesService{
@Resource
private SpecificationsService specificationsService;
@Resource
private AttributeService attributeService;
@Override
public Boolean add(Long commoditiesId, List<Long> specificationsIds) {
if (CollectionUtils.isEmpty(specificationsIds)) {
return true;
}
for (Long specificationsId: specificationsIds) {
SpecificationsCommodities specificationsDishes = new SpecificationsCommodities();
specificationsDishes.setSpecificationsId(specificationsId);
specificationsDishes.setCommoditiesId(commoditiesId);
boolean save = this.save(specificationsDishes);
ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR);
}
return true;
}
@Override
public void deleteByCommoditiesId(Long commoditiesId) {
QueryWrapper<SpecificationsCommodities> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("commoditiesId",commoditiesId);
long count = this.count(queryWrapper);
if (count < 1) {
return;
}
boolean remove = this.remove(queryWrapper);
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR);
}
@Override
public Boolean updateByCommoditiesId(Long commoditiesId, List<Long> specificationsIds) {
//删除之前的中间表信息
deleteByCommoditiesId(commoditiesId);
//保存更新的中间表信息
return add(commoditiesId,specificationsIds);
}
@Override
public List<SpecificationsVO> getSpecificationsAddAttribute(List<SpecificationsCommodities> specificationsCommoditiesList) {
List<SpecificationsVO> specificationsVOList = specificationsCommoditiesList.stream().map(item -> {
Long specificationsId = item.getSpecificationsId();
Specifications specifications = specificationsService.getById(specificationsId);
SpecificationsVO specificationsVO = new SpecificationsVO();
BeanUtils.copyProperties(specifications, specificationsVO);
return specificationsVO;
}).collect(Collectors.toList());
return attributeService.getBySpecificationsVoId(specificationsVOList);
}
}

View File

@ -0,0 +1,22 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.model.domain.Specifications;
import com.cj.jiaqingjiayi.service.SpecificationsService;
import com.cj.jiaqingjiayi.mapper.SpecificationsMapper;
import org.springframework.stereotype.Service;
/**
* @author 高木
* @description 针对表specifications(规格表)的数据库操作Service实现
* @createDate 2024-08-21 16:20:48
*/
@Service
public class SpecificationsServiceImpl extends ServiceImpl<SpecificationsMapper, Specifications>
implements SpecificationsService{
}

View File

@ -0,0 +1,334 @@
package com.cj.jiaqingjiayi.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cj.jiaqingjiayi.common.ErrorCode;
import com.cj.jiaqingjiayi.exception.BusinessException;
import com.cj.jiaqingjiayi.exception.ThrowUtils;
import com.cj.jiaqingjiayi.mapper.UserMapper;
import com.cj.jiaqingjiayi.model.domain.User;
import com.cj.jiaqingjiayi.model.request.user.UserSearchRequest;
import com.cj.jiaqingjiayi.model.request.user.UserUpdatePasswordRequest;
import com.cj.jiaqingjiayi.model.vo.LoginUserVO;
import com.cj.jiaqingjiayi.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.cj.jiaqingjiayi.contant.UserConstant.*;
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {
@Resource
private UserMapper userMapper;
/**
* 盐值 对密码进行混淆加密
*/
private static final String SALT = "yctf";
/**
* 用户注册
*
* @param userAccount 登陆账号
* @param userPassword 登录密码
* @param checkPassword 校验密码
* @return 新id
*/
@Override
public long userRegister(String userAccount, String userPassword, String checkPassword) {
//1.非空
if (StringUtils.isAllBlank(userAccount, userPassword, checkPassword)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数为空");
}
//2.账号长度不小于4位
if (userAccount.length() < 4) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号过短");
}
//3.密码长度不小于8位
if (userPassword.length() < 8 || checkPassword.length() < 8) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码过短");
}
//正则表达式看账户包不包含特殊字符
String validPattern = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Matcher matcher = Pattern.compile(validPattern).matcher(userAccount);
if (matcher.find()) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "不符合规范");
}
//检验密码和校验密码是否相同
if (!userPassword.equals(checkPassword)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "两次输入密码不同");
}
//账户不能重复进行查询数据库看当中是否存在相同名称用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
Long count = userMapper.selectCount(queryWrapper);
if (count > 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "存在相同用户");
}
//对密码加密
String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());
User user = new User();
user.setUserAccount(userAccount);
user.setUserPassword(encryptPassword);
boolean saveResult = this.save(user);
if (!saveResult) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "插入失败!");
}
return user.getId();
}
/**
* 登录
*
* @param userAccount 登陆账号
* @param userPassword 登陆密码
* @param request 返回请求
* @return 用户信息
*/
@Override
public LoginUserVO userLogin(String userAccount, String userPassword, HttpServletRequest request) {
//非空
if (StringUtils.isAllBlank(userAccount, userPassword)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数为空");
}
//账号长度不小于四位
if (userAccount.length() < 4) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号过短");
}
if (userPassword.length() < 8) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码过短");
}
//正则表达式看账户包不包含特殊字符
String validPattern = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Matcher matcher = Pattern.compile(validPattern).matcher(userAccount);
if (matcher.find()) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "不符合规范");
}
//校验账号密码是否相同
String encodePassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes(StandardCharsets.UTF_8));
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("userAccount", userAccount);
queryWrapper.eq("userPassword", encodePassword);
User user = userMapper.selectOne(queryWrapper);
//用户不存在
if (user == null) {
log.info("user login failed, userAccount Cannot match userPassword");
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号或密码有误!");
}
//用户登陆成功
request.getSession().setAttribute(USER_LOGIN_STATE, user);
return this.getLoginUserVO(user);
}
/**
* 实现用户注销
* @param request
* @return
*/
@Override
public int userLogout(HttpServletRequest request) {
request.getSession().removeAttribute(USER_LOGIN_STATE);
return 1;
}
/**
* 用户脱敏
* @param user
* @return
*/
@Override
public User getSafetyUser(User user) {
User safeUser = new User();
safeUser.setId(user.getId());
safeUser.setUsername(user.getUsername());
safeUser.setUserAccount(user.getUserAccount());
safeUser.setAvatarUrl(user.getAvatarUrl());
safeUser.setGender(user.getGender());
safeUser.setPhone(user.getPhone());
safeUser.setEmail(user.getEmail());
safeUser.setUserStatus(user.getUserStatus());
safeUser.setCreateTime(user.getCreateTime());
return safeUser;
}
/**
* 获取当前登录用户的信息
* @param request
* @return
*/
@Override
public User getLogingUser(HttpServletRequest request) {
Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE);
User currentUser = (User) userObj;
if(currentUser == null){
throw new BusinessException(ErrorCode.NOT_LOGIN, "未登录");
}
Long userId = currentUser.getId();
currentUser = this.getById(userId);
return currentUser;
}
/**
* 用户修改密码
* @param updatePasswordRequest
* @param request
* @return
*/
@Override
public boolean updateUserPassword(UserUpdatePasswordRequest updatePasswordRequest, HttpServletRequest request) {
if (updatePasswordRequest == null){
throw new BusinessException(ErrorCode.NULL_ERROR);
}
/**
* 判断用户是否存在
*/
User logingUser = getLogingUser(request);
Long userId = logingUser.getId();
if(userId < 0 || userId == null){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在");
}
String newPassword = updatePasswordRequest.getNewPassword();
/**
* 确认密码
*/
if(!newPassword.equals(updatePasswordRequest.getCheckNewPassword())){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "两次输入密码不相同");
}
/**
* 判断修改后的密码是否与原密码相同
*/
User user = new User();
BeanUtils.copyProperties(updatePasswordRequest, user);
user.setId(logingUser.getId());
if (newPassword.equals(updatePasswordRequest.getUserPassword())){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "修改后的密码与原密码不能相同");
}
//使用MD5加密新密码
String mdedPassword = DigestUtils.md5DigestAsHex((USER_SALT + updatePasswordRequest.getNewPassword()).getBytes());
String odlPassword = DigestUtils.md5DigestAsHex((USER_SALT + updatePasswordRequest.getUserPassword()).getBytes());
if(!logingUser.getUserPassword().equals(odlPassword)){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "旧密码错误");
}
user.setUserPassword(mdedPassword);
boolean result = updateById(user);
if(!result){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "修改失败");
}
return true;
}
@Override
/**
* 分页查询
*
* @param searchRequest
* @return
*/
public QueryWrapper<User> getQueryWrapper(UserSearchRequest searchRequest) {
if (searchRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
String username = searchRequest.getUsername();
String userAccount = searchRequest.getUserAccount();
Integer gender = searchRequest.getGender();
String phone = searchRequest.getPhone();
String email = searchRequest.getEmail();
Integer userStatus = searchRequest.getUserStatus();
Integer userRole = searchRequest.getUserRole();
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Date updateTime = searchRequest.getUpdateTime();
Date createTime = searchRequest.getCreateTime();
// username
if (StringUtils.isNotBlank(username)) {
queryWrapper.like("username", username);
}
// userAccount
if (StringUtils.isNotBlank(userAccount)) {
queryWrapper.like("userAccount", userAccount);
}
// gender
if (StringUtils.isNotBlank(username)) {
queryWrapper.eq("gender", gender);
}
// phone
if (StringUtils.isNotBlank(phone)) {
queryWrapper.like("phone", phone);
}
// email
if (StringUtils.isNotBlank(email)) {
queryWrapper.like("email", email);
}
// userStatus
if (userStatus != null) {
queryWrapper.eq("userStatus", userStatus);
}
if (userRole != null) {
queryWrapper.eq("userRole", userRole);
}
if (updateTime != null) {
queryWrapper.like("updateTime", updateTime);
}
if (createTime != null) {
queryWrapper.like("createTime", createTime);
}
return queryWrapper;
}
@Override
public LoginUserVO getLoginUserVO(User user) {
if (user == null) {
return null;
}
LoginUserVO loginUserVO = new LoginUserVO();
BeanUtils.copyProperties(user, loginUserVO);
return loginUserVO;
}
/**
* 判断是否为管理员
* @return
*/
@Override
public void isAdmin(HttpServletRequest request){
Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE);
User user = (User) userObj;
ThrowUtils.throwIf(!(user != null && user.getUserRole() == ADMIN_ROLE) ,ErrorCode.NO_AUTH, "无管理员权限");
}
}

View File

@ -0,0 +1,14 @@
package com.cj.jiaqingjiayi.utils;
import org.springframework.stereotype.Component;
import java.util.Random;
@Component
public class RandomNumberGenerator {
// 生成指定范围内的随机整数
public int generateRandomNumber() {
Random random = new Random();
return random.nextInt(9000 - 1000 + 1) + 1000;
}
}

View File

@ -0,0 +1,61 @@
package com.cj.jiaqingjiayi.utils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import static com.cj.jiaqingjiayi.contant.RegexConstant.*;
/**
* @author 玄德
*/
@SuppressWarnings("all")
public class RegexUtils {
/**
* 是否是无效手机格式
*
* @param phone 要校验的手机号
* @return true:符合false不符合
*/
public static boolean isPhoneInvalid(String phone) {
return mismatch(phone, PHONE_REGEX);
}
/**
* 是否是无效邮箱格式
*
* @param email 要校验的邮箱
* @return true:符合false不符合
*/
public static boolean isEmailInvalid(String email) {
return mismatch(email, EMAIL_REGEX);
}
/**
* 是否是无效18位身份证格式
*
* @param idCard 要校验的身份证号码
* @return true:符合false不符合
*/
public static boolean isIdCardInvalid(String idCard) {
return mismatch(idCard, ID_CARD_REGEX);
}
/**
* 是否是无效验证码格式
*
* @param code 要校验的验证码
* @return true:符合false不符合
*/
public static boolean isCodeInvalid(String code) {
return mismatch(code, VERIFY_CODE_REGEX);
}
// 校验是否不符合正则格式
private static boolean mismatch(String str, String regex) {
if (StringUtils.isBlank(str)) {
return true;
}
return !str.matches(regex);
}
}

View File

@ -0,0 +1,27 @@
package com.cj.jiaqingjiayi.utils;
import org.apache.commons.lang3.StringUtils;
/**
* SQL 工具
*
* @author <a href="https://github.com/liyupi">程序员鱼皮</a>
* @from <a href="https://yupi.icu">编程导航知识星球</a>
*/
@SuppressWarnings("all")
public class SqlUtils {
/**
* 校验排序字段是否合法防止 SQL 注入
*
* @param sortField
* @return
*/
public static boolean validSortField(String sortField) {
if (StringUtils.isBlank(sortField)) {
return false;
}
return !StringUtils.containsAny(sortField, "=", "(", ")", " ");
}
}

View File

@ -0,0 +1,49 @@
spring:
application:
name: jiaqingjiayi
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://154.8.193.216/jiaqingjiayi
# username: jiaqingjiayi
# password: 123456
url: jdbc:mysql://localhost:3306/jqjy
username: root
password: 123456
mvc:
pathmatch:
matching-strategy: ant_path_matcher
profiles:
active: dev
knife4j:
enable: true
server:
port: 8080
servlet:
context-path: /api
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
global-config:
db-config:
logic-delete-field: isDelete
logic-delete-value: 1
logic-not-delete-value: 0
session:
timeout: 86400
aliyun:
oss:
file:
endpoint: xxxx
keyid: xxxx
keysecret: xxxx
bucketname: xxxx
alipay:
#支付宝开放平台
appId: 2021004151684053
alipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSEl6J0GoBCiuUmlaGOftoKftzBZL9/HwmcclIjHxDwM2Nmk7Q+p8nNSO4CtQU5nWZZBzSQ7/p0YBfdH5CGBpz9/vvB1va9CGYLLbog//n3kr4VPtC6cA0TNLiFgT86SzieL8wgRvfyba4q2lrGW1QN6Wnc5r3Ew3BepSvANDaETkLS2djwnOAN/i5RHSZWN948oiHEU8/c5SMjBwPi7g95LblZ3PfGa8h7MLXw+qD1CY1lumkT5Wt/Jv57akT2O/GryF90uEDZVR1bCuxK/1UDCT0MYj5Adl8D2cxVi57UgAPAD/BbGHF6tfnz3leC0S5zFxnb8i4uVGgsul89M9wIDAQAB"
appPrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQChISXonQagEKK5SaVoY5+2gp+3MFkv38fCZxyUiMfEPAzY2aTtD6nyc1I7gK1BTmdZlkHNJDv+nRgF90fkIYGnP3++8HW9r0IZgstuiD/+feSvhU+0LpwDRM0uIWBPzpLOJ4vzCBG9/JtriraWsZbVA3padzmvcTDcF6lK8A0NoROQtLZ2PCc4A3+LlEdJlY33jyiIcRTz9zlIyMHA+LuD3ktuVnc98ZryHswtfD6oPUJjWW6aRPla38m/ntqRPY78avIX3S4QNlVHVsK7Er/VQMJPQxiPkB2XwPZzFWLntSAA8AP8FsYcXq1+fPeV4LRLnMXGdvyLi5UaCy6Xz0z3AgMBAAECggEAaGWvyB0lU8QzilWbJB2YN4o+rVRYFNqq9NwV+m7877nwoPezEh2aAQqS9xaSKsP/1l2yWJXngTqLfCIRpE/JT3Gm9TGbN8E71IeYAw+oVt1+s/JuB9JDJyMGxaK+Yjb3iza4SEisJiprEKyZTN3XWkCcn8yrxW5TN+bkuzb5XiA8j3VxT5S9dybFtXS8vxTaqF47XkbvSqj4ohmEiyiFWtQbLBON1Uoje+RNXZL6QNaKzck7QePFd5S9Qz97kHUWHC51qz+lXYlMUME5ORXQbckfreRKll0AzGr8r5rSz1FkOafywr6kAeIhiOa+r8AveNXg+U+0SpYN9ti9QZ8NcQKBgQDhW5M21Bgrfp/wsrumqlkePORNkh8/98Wgsz4uEVb2sNkLQyAdS4HNFzc1KldIoi3Vc+E7NBFPuVQ/d+o72iJ0eT+ThsoCiTAWJGkWouFSDWAFppqEY6Z3Le4gb6/xIZlAYdN1KQiJZORhBpfBTUGtmsxpXFRNdtQd6O88DDqW+wKBgQC3Cd4HwpytDCPynLw0tJfJyCSIVrt5Ksic2J5AXMCATbNB4UHX0FAvDZvxh/7fERBz3eB+q2hY4jKuTASL58eKEFnp32ggONyKGYasn4k8qNf8dnlVUnbN3r/vSG4r+3OY2QY5aiHELvIrUKtlrhg/j7T9qCtCafaoTEiGT9gxNQKBgQCVOfOIufdrTcUROPmDiofKux2etCTXUfXezPJexQKmBkMi7wcj/uzr5vSa0vfLVAEvuDUr4/WWqi08feZwTajFIcjUosu/1CIwd1nTMHYtxEeSVlk5U1dW0eY+OlbyQIJfnKfOjCZn/JQyH5B74vGbyMaU+huk1Avv5mAMjjh54wKBgElenS+DJQaAnVA833xI/6cUoQA9s/xH2A53DkhCZa+IddhskNYPXHTgAah5mQKVdoDbaYec8cDfOu1+7zuddvCyyTfkI3r3EAATZ1Z+xKYaECnU26IF4jV3mnwyDmd27clRBRuynUJkhxIxzeJ+PJ4N3sDmziBbFVI08cVU8BYZAoGAbDZONt1PFEFyIINZuTWbwK/BoHTzvDEmu2v6GXcslOurrgjMKArVT4TZyXoe56QJe9gJfmOYuTw6kwEzSDZtQvdi2jPNj4s14P8oWAro6x7tLo/18FQn/6DLpq9eaiI4TYN0P8NUI8sym9Ns8WFXFRb78vyx90j2apvV6+S8pek="

Some files were not shown because too many files have changed in this diff Show More