Compare commits

..

No commits in common. "master" and "v3.1" have entirely different histories.
master ... v3.1

440 changed files with 13276 additions and 29329 deletions

1
.github/FUNDING.yml vendored
View File

@ -1 +0,0 @@
custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html

3
.gitignore vendored
View File

@ -25,9 +25,6 @@ target/
*.iml *.iml
*.ipr *.ipr
### JRebel ###
rebel.xml
### NetBeans ### ### NetBeans ###
nbproject/private/ nbproject/private/
build/* build/*

View File

@ -1,29 +1,14 @@
<p align="center">
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.2</h1>
<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4>
<p align="center">
<a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
<a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.2-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>
## 平台简介 ## 平台简介
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
* 前端采用Vue、Element UI。 * 前端采用Vue、Element UI。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。 * 后端采用Spring Boot、Spring Security、Redis & Jwt。
* 权限认证使用Jwt支持多终端认证系统。 * 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制。 * 支持加载动态权限菜单,多方式轻松权限控制。
* 高效率开发,使用代码生成器可以一键生成前后端代码。 * 高效率开发,使用代码生成器可以一键生成前后端代码。
* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 * 提供了一个Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。
* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast)Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。
* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) * 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
* 特别鸣谢:[element](https://github.com/ElemeFE/element)[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)[eladmin-web](https://github.com/elunez/eladmin-web)。 * 感谢[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin)[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search)。
* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp; * 阿里云优惠券:[点我进入](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp;
* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp;
## 内置功能 ## 内置功能
@ -42,9 +27,8 @@
13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载 。 13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载 。
14. 系统接口根据业务代码自动生成相关的api接口文档。 14. 系统接口根据业务代码自动生成相关的api接口文档。
15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。 15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。
16. 缓存监控:对系统的缓存信息查询,命令统计等。 16. 在线构建器拖动表单元素生成相应的HTML代码。
17. 在线构建器拖动表单元素生成相应的HTML代码。 17. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
18. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
## 在线体验 ## 在线体验
@ -87,11 +71,11 @@
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-6d73c2140ce694e3de4c05035fdc1868d4c.png"/></td>
</tr> </tr>
</table> </table>
## 若依前后端分离交流群 ## 若依前后端分离交流群
QQ群 [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) 点击按钮入群。 QQ群 [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) 点击按钮入群。

View File

@ -1,6 +1,6 @@
@echo off @echo off
echo. echo.
echo [信息] 清理工程target生成路径。 echo [信息] 清理生成路径。
echo. echo.
%~d0 %~d0

View File

@ -1,6 +1,6 @@
@echo off @echo off
echo. echo.
echo [信息] 使用Jar命令运行Web工程。 echo [信息] 运行Web工程。
echo. echo.
cd %~dp0 cd %~dp0

33
demo/.gitignore vendored
View File

@ -1,33 +0,0 @@
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/

Binary file not shown.

View File

@ -1,2 +0,0 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

316
demo/mvnw vendored
View File

@ -1,316 +0,0 @@
#!/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.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
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"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`\\unset -f command; \\command -v java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

188
demo/mvnw.cmd vendored
View File

@ -1,188 +0,0 @@
@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 Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%

View File

@ -1,41 +0,0 @@
<?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.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

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

View File

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

119
pom.xml
View File

@ -6,179 +6,174 @@
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<version>3.8.2</version> <version>3.1.0</version>
<name>ruoyi</name> <name>ruoyi</name>
<url>http://www.ruoyi.vip</url> <url>http://www.ruoyi.vip</url>
<description>若依管理系统</description> <description>若依管理系统</description>
<properties> <properties>
<ruoyi.version>3.8.2</ruoyi.version> <ruoyi.version>3.1.0</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version> <java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> <mybatis.boot.version>1.3.2</mybatis.boot.version>
<druid.version>1.2.11</druid.version> <druid.version>1.1.14</druid.version>
<bitwalker.version>1.21</bitwalker.version> <bitwalker.version>1.19</bitwalker.version>
<swagger.version>3.0.0</swagger.version> <swagger.version>2.9.2</swagger.version>
<kaptcha.version>2.3.2</kaptcha.version> <kaptcha.version>2.3.2</kaptcha.version>
<mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version> <pagehelper.boot.version>1.2.5</pagehelper.boot.version>
<pagehelper.boot.version>1.4.2</pagehelper.boot.version> <fastjson.version>1.2.70</fastjson.version>
<fastjson.version>1.2.83</fastjson.version> <oshi.version>3.9.1</oshi.version>
<oshi.version>6.1.6</oshi.version> <commons.io.version>2.5</commons.io.version>
<commons.io.version>2.11.0</commons.io.version> <commons.fileupload.version>1.3.3</commons.fileupload.version>
<commons.fileupload.version>1.4</commons.fileupload.version> <poi.version>3.17</poi.version>
<commons.collections.version>3.2.2</commons.collections.version> <velocity.version>1.7</velocity.version>
<poi.version>4.1.2</poi.version> <jwt.version>0.9.0</jwt.version>
<velocity.version>2.3</velocity.version>
<jwt.version>0.9.1</jwt.version>
</properties> </properties>
<!-- 依赖声明 --> <!-- 依赖声明 -->
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<!-- SpringBoot的依赖配置--> <!-- SpringBoot的依赖配置-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId> <artifactId>spring-boot-dependencies</artifactId>
<version>2.5.14</version> <version>2.1.1.RELEASE</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<!-- 阿里数据库连接池 --> <!--阿里数据库连接池 -->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version> <version>${druid.version}</version>
</dependency> </dependency>
<!-- 解析客户端操作系统、浏览器等 --> <!-- 解析客户端操作系统、浏览器等 -->
<dependency> <dependency>
<groupId>eu.bitwalker</groupId> <groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId> <artifactId>UserAgentUtils</artifactId>
<version>${bitwalker.version}</version> <version>${bitwalker.version}</version>
</dependency> </dependency>
<!-- SpringBoot集成mybatis框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<!-- pagehelper 分页插件 --> <!-- pagehelper 分页插件 -->
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId> <artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version> <version>${pagehelper.boot.version}</version>
</dependency> </dependency>
<!-- 获取系统信息 --> <!-- 获取系统信息 -->
<dependency> <dependency>
<groupId>com.github.oshi</groupId> <groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId> <artifactId>oshi-core</artifactId>
<version>${oshi.version}</version> <version>${oshi.version}</version>
</dependency> </dependency>
<!-- Swagger3依赖 --> <!-- swagger2-->
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId> <artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version> <version>${swagger.version}</version>
<exclusions> <exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion> <exclusion>
<groupId>io.swagger</groupId> <groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId> <artifactId>swagger-models</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- io常用工具类 --> <!-- swagger2-UI-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--io常用工具类 -->
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>${commons.io.version}</version> <version>${commons.io.version}</version>
</dependency> </dependency>
<!-- 文件上传工具类 --> <!--文件上传工具类 -->
<dependency> <dependency>
<groupId>commons-fileupload</groupId> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload.version}</version> <version>${commons.fileupload.version}</version>
</dependency> </dependency>
<!-- excel工具 --> <!-- excel工具 -->
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version> <version>${poi.version}</version>
</dependency> </dependency>
<!-- velocity代码生成使用模板 --> <!--velocity代码生成使用模板 -->
<dependency> <dependency>
<groupId>org.apache.velocity</groupId> <groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId> <artifactId>velocity</artifactId>
<version>${velocity.version}</version> <version>${velocity.version}</version>
</dependency> </dependency>
<!-- collections工具类 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons.collections.version}</version>
</dependency>
<!-- 阿里JSON解析器 --> <!-- 阿里JSON解析器 -->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>${fastjson.version}</version> <version>${fastjson.version}</version>
</dependency> </dependency>
<!-- Token生成与解析--> <!--Token生成与解析-->
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
<version>${jwt.version}</version> <version>${jwt.version}</version>
</dependency> </dependency>
<!-- 验证码 --> <!--验证码 -->
<dependency> <dependency>
<groupId>com.github.penggle</groupId> <groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId> <artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version> <version>${kaptcha.version}</version>
</dependency> </dependency>
<!-- 定时任务--> <!-- 定时任务-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId> <artifactId>ruoyi-quartz</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 代码生成--> <!-- 代码生成-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId> <artifactId>ruoyi-generator</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 核心模块--> <!-- 核心模块-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId> <artifactId>ruoyi-framework</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 系统模块--> <!-- 系统模块-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId> <artifactId>ruoyi-system</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 通用工具--> <!-- 通用工具-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
@ -223,7 +218,7 @@
<repository> <repository>
<id>public</id> <id>public</id>
<name>aliyun nexus</name> <name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url> <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </releases>
@ -234,7 +229,7 @@
<pluginRepository> <pluginRepository>
<id>public</id> <id>public</id>
<name>aliyun nexus</name> <name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url> <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </releases>

View File

@ -1,128 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>3.8.2</version> <version>3.1.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId> <artifactId>ruoyi-admin</artifactId>
<description> <description>
web服务入口 web服务入口
</description> </description>
<dependencies> <dependencies>
<dependency> <!-- spring-boot-devtools -->
<dependency>
<groupId>org.apache.poi</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<artifactId>poi</artifactId> <optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<version>4.0.1</version>
<!-- swagger2-->
</dependency> <dependency>
<groupId>io.springfox</groupId>
<dependency> <artifactId>springfox-swagger2</artifactId>
</dependency>
<groupId>org.apache.poi</groupId>
<!--防止进入swagger页面报类型转换错误排除2.9.2中的引用手动增加1.5.21版本-->
<artifactId>poi-ooxml</artifactId> <dependency>
<groupId>io.swagger</groupId>
<version>4.0.1</version> <artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency> </dependency>
<dependency>
<dependency> <groupId>io.swagger</groupId>
<groupId>org.springframework.boot</groupId> <artifactId>swagger-models</artifactId>
<artifactId>spring-boot-devtools</artifactId> <version>1.5.21</version>
<optional>true</optional> <!-- 表示依赖不会传递 --> </dependency>
</dependency>
<!-- swagger2-UI-->
<!-- swagger3--> <dependency>
<dependency> <groupId>io.springfox</groupId>
<groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId>
<artifactId>springfox-boot-starter</artifactId> </dependency>
</dependency>
<!-- Mysql驱动包 -->
<!-- 防止进入swagger页面报类型转换错误排除3.0.0中的引用手动增加1.6.2版本 --> <dependency>
<dependency> <groupId>mysql</groupId>
<groupId>io.swagger</groupId> <artifactId>mysql-connector-java</artifactId>
<artifactId>swagger-models</artifactId> </dependency>
<version>1.6.6</version>
</dependency> <!-- 核心模块-->
<!-- knife4j --> <dependency>
<dependency> <groupId>com.ruoyi</groupId>
<groupId>com.github.xiaoymin</groupId> <artifactId>ruoyi-framework</artifactId>
<artifactId>knife4j-spring-boot-starter</artifactId> </dependency>
<version>3.0.3</version>
</dependency> <!-- 定时任务-->
<!-- postgresql驱动包--> <dependency>
<dependency> <groupId>com.ruoyi</groupId>
<groupId>org.postgresql</groupId> <artifactId>ruoyi-quartz</artifactId>
<artifactId>postgresql</artifactId> </dependency>
<version>42.2.20</version>
</dependency> <!-- 代码生成-->
<dependency>
<!-- Mysql驱动包 --> <groupId>com.ruoyi</groupId>
<dependency> <artifactId>ruoyi-generator</artifactId>
<groupId>mysql</groupId> </dependency>
<artifactId>mysql-connector-java</artifactId>
</dependency> </dependencies>
<!-- 核心模块--> <build>
<dependency> <plugins>
<groupId>com.ruoyi</groupId> <plugin>
<artifactId>ruoyi-framework</artifactId> <groupId>org.springframework.boot</groupId>
</dependency> <artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.1.RELEASE</version>
<!-- 定时任务--> <configuration>
<dependency> <fork>true</fork> <!-- 如果没有该配置devtools不会生效 -->
<groupId>com.ruoyi</groupId> </configuration>
<artifactId>ruoyi-quartz</artifactId> <executions>
</dependency> <execution>
<goals>
<!-- 代码生成--> <goal>repackage</goal>
<dependency> </goals>
<groupId>com.ruoyi</groupId> </execution>
<artifactId>ruoyi-generator</artifactId> </executions>
</dependency> </plugin>
<plugin>
</dependencies> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<build> <version>3.1.0</version>
<plugins> <configuration>
<plugin> <failOnMissingWebXml>false</failOnMissingWebXml>
<groupId>org.springframework.boot</groupId> <warName>${project.artifactId}</warName>
<artifactId>spring-boot-maven-plugin</artifactId> </configuration>
<version>2.1.1.RELEASE</version> </plugin>
<configuration> </plugins>
<fork>true</fork> <!-- 如果没有该配置devtools不会生效 --> <finalName>${project.artifactId}</finalName>
</configuration> </build>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project> </project>

View File

@ -1,35 +1,30 @@
package com.ruoyi; package com.ruoyi;
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
/** * 启动程序
* 启动程序 *
* * @author ruoyi
* @author ruoyi */
*/ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class RuoYiApplication
@MapperScan("com.ruoyi.system.mapper_yada") {
public class RuoYiApplication public static void main(String[] args)
{ {
public static void main(String[] args) // System.setProperty("spring.devtools.restart.enabled", "false");
{ SpringApplication.run(RuoYiApplication.class, args);
// System.setProperty("spring.devtools.restart.enabled", "false"); System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
SpringApplication.run(RuoYiApplication.class, args); " .-------. ____ __ \n" +
System.out.println(); " | _ _ \\ \\ \\ / / \n" +
System.out.println(" --->>>启动成功!<<<---"); " | ( ' ) | \\ _. / ' \n" +
// System.out.println("(♥◠‿◠)ノ゙ ლ(´ڡ`ლ)゙ \n" + " |(_ o _) / _( )_ .' \n" +
// " .-------. ____ __ \n" + " | (_,_).' __ ___(_ o _)' \n" +
// " | _ _ \\ \\ \\ / / \n" + " | |\\ \\ | || |(_,_)' \n" +
// " | ( ' ) | \\ _. / ' \n" + " | | \\ `' /| `-' / \n" +
// " |(_ o _) / _( )_ .' \n" + " | | \\ / \\ / \n" +
// " | (_,_).' __ ___(_ o _)' \n" + " ''-' `'-' `-..-' ");
// " | |\\ \\ | || |(_,_)' \n" + }
// " | | \\ `' /| `-' / \n" + }
// " | | \\ / \\ / \n" +
// " ''-' `'-' `-..-' ");
}
}

View File

@ -1,18 +1,18 @@
package com.ruoyi; package com.ruoyi;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/** /**
* web容器中进行部署 * web容器中进行部署
* *
* @author ruoyi * @author ruoyi
*/ */
public class RuoYiServletInitializer extends SpringBootServletInitializer public class RuoYiServletInitializer extends SpringBootServletInitializer
{ {
@Override @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{ {
return application.sources(RuoYiApplication.class); return application.sources(RuoYiApplication.class);
} }
} }

View File

@ -0,0 +1,86 @@
package com.ruoyi.web.controller.common;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.code.kaptcha.Producer;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.sign.Base64;
import com.ruoyi.common.utils.uuid.IdUtils;
/**
* 验证码操作处理
*
* @author ruoyi
*/
@RestController
public class CaptchaController
{
@Resource(name = "captchaProducer")
private Producer captchaProducer;
@Resource(name = "captchaProducerMath")
private Producer captchaProducerMath;
@Autowired
private RedisCache redisCache;
// 验证码类型
@Value("${ruoyi.captchaType}")
private String captchaType;
/**
* 生成验证码
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
// 保存验证码信息
String uuid = IdUtils.simpleUUID();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String capStr = null, code = null;
BufferedImage image = null;
// 生成验证码
if ("math".equals(captchaType))
{
String capText = captchaProducerMath.createText();
capStr = capText.substring(0, capText.lastIndexOf("@"));
code = capText.substring(capText.lastIndexOf("@") + 1);
image = captchaProducerMath.createImage(capStr);
}
else if ("char".equals(captchaType))
{
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
}
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
// 转换流信息写出
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
try
{
ImageIO.write(image, "jpg", os);
}
catch (IOException e)
{
return AjaxResult.error(e.getMessage());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("uuid", uuid);
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;
}
}

View File

@ -1,163 +1,109 @@
package com.ruoyi.web.controller.common; package com.ruoyi.web.controller.common;
import java.util.ArrayList; import javax.servlet.http.HttpServletRequest;
import java.util.List; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import javax.servlet.http.HttpServletResponse; import org.slf4j.LoggerFactory;
import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired;
import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.PostMapping; import com.ruoyi.common.config.RuoYiConfig;
import org.springframework.web.bind.annotation.RequestMapping; import com.ruoyi.common.constant.Constants;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils; /**
import com.ruoyi.common.utils.file.FileUtils; * 通用请求处理
import com.ruoyi.framework.config.ServerConfig; *
* @author ruoyi
/** */
* 通用请求处理 @RestController
* public class CommonController
* @author ruoyi {
*/ private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@RestController
@RequestMapping("/common") @Autowired
public class CommonController private ServerConfig serverConfig;
{
private static final Logger log = LoggerFactory.getLogger(CommonController.class); /**
* 通用下载请求
@Autowired *
private ServerConfig serverConfig; * @param fileName 文件名称
* @param delete 是否删除
private static final String FILE_DELIMETER = ","; */
@GetMapping("common/download")
/** public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
* 通用下载请求 {
* try
* @param fileName 文件名称 {
* @param delete 是否删除 if (!FileUtils.isValidFilename(fileName))
*/ {
@GetMapping("/download") throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) }
{ String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
try String filePath = RuoYiConfig.getDownloadPath() + fileName;
{
if (!FileUtils.checkAllowDownload(fileName)) response.setCharacterEncoding("utf-8");
{ response.setContentType("multipart/form-data");
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); response.setHeader("Content-Disposition",
} "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName));
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); FileUtils.writeBytes(filePath, response.getOutputStream());
String filePath = RuoYiConfig.getDownloadPath() + fileName; if (delete)
{
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.deleteFile(filePath);
FileUtils.setAttachmentResponseHeader(response, realFileName); }
FileUtils.writeBytes(filePath, response.getOutputStream()); }
if (delete) catch (Exception e)
{ {
FileUtils.deleteFile(filePath); log.error("下载文件失败", e);
} }
} }
catch (Exception e)
{ /**
log.error("下载文件失败", e); * 通用上传请求
} */
} @PostMapping("/common/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception
/** {
* 通用上传请求单个 try
*/ {
@PostMapping("/upload") // 上传文件路径
public AjaxResult uploadFile(MultipartFile file) throws Exception String filePath = RuoYiConfig.getUploadPath();
{ // 上传并返回新文件名称
try String fileName = FileUploadUtils.upload(filePath, file);
{ String url = serverConfig.getUrl() + fileName;
// 上传文件路径 AjaxResult ajax = AjaxResult.success();
String filePath = RuoYiConfig.getUploadPath(); ajax.put("fileName", fileName);
// 上传并返回新文件名称 ajax.put("url", url);
String fileName = FileUploadUtils.upload(filePath, file); return ajax;
String url = serverConfig.getUrl() + fileName; }
AjaxResult ajax = AjaxResult.success(); catch (Exception e)
ajax.put("url", url); {
ajax.put("fileName", fileName); return AjaxResult.error(e.getMessage());
ajax.put("newFileName", FileUtils.getName(fileName)); }
ajax.put("originalFilename", file.getOriginalFilename()); }
return ajax;
} /**
catch (Exception e) * 本地资源通用下载
{ */
return AjaxResult.error(e.getMessage()); @GetMapping("/common/download/resource")
} public void resourceDownload(String name, HttpServletRequest request, HttpServletResponse response) throws Exception
} {
// 本地资源路径
/** String localPath = RuoYiConfig.getProfile();
* 通用上传请求多个 // 数据库资源地址
*/ String downloadPath = localPath + StringUtils.substringAfter(name, Constants.RESOURCE_PREFIX);
@PostMapping("/uploads") // 下载名称
public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
{ response.setCharacterEncoding("utf-8");
try response.setContentType("multipart/form-data");
{ response.setHeader("Content-Disposition",
// 上传文件路径 "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName));
String filePath = RuoYiConfig.getUploadPath(); FileUtils.writeBytes(downloadPath, response.getOutputStream());
List<String> urls = new ArrayList<String>(); }
List<String> fileNames = new ArrayList<String>(); }
List<String> newFileNames = new ArrayList<String>();
List<String> originalFilenames = new ArrayList<String>();
for (MultipartFile file : files)
{
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
urls.add(url);
fileNames.add(fileName);
newFileNames.add(FileUtils.getName(fileName));
originalFilenames.add(file.getOriginalFilename());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
* 本地资源通用下载
*/
@GetMapping("/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
try
{
if (!FileUtils.checkAllowDownload(resource))
{
throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
}
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
}
}

View File

@ -1,53 +0,0 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
/**
* 缓存监控
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/cache")
public class CacheController
{
@Autowired
private RedisTemplate<String, String> redisTemplate;
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping()
public AjaxResult getInfo() throws Exception
{
Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
Map<String, Object> result = new HashMap<>(3);
result.put("info", info);
result.put("dbSize", dbSize);
List<Map<String, String>> pieList = new ArrayList<>();
commandStats.stringPropertyNames().forEach(key -> {
Map<String, String> data = new HashMap<>(2);
String property = commandStats.getProperty(key);
data.put("name", StringUtils.removeStart(key, "cmdstat_"));
data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
pieList.add(data);
});
result.put("commandStats", pieList);
return AjaxResult.success(result);
}
}

View File

@ -1,27 +1,28 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.framework.web.domain.Server; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.framework.web.domain.Server;
/**
* 服务器监控 /**
* * 服务器监控
* @author ruoyi *
*/ * @author ruoyi
@RestController */
@RequestMapping("/monitor/server") @RestController
public class ServerController @RequestMapping("/monitor/server")
{ public class ServerController extends BaseController
@PreAuthorize("@ss.hasPermi('monitor:server:list')") {
@GetMapping() @PreAuthorize("@ss.hasPermi('monitor:server:list')")
public AjaxResult getInfo() throws Exception @GetMapping()
{ public AjaxResult getInfo() throws Exception
Server server = new Server(); {
server.copyTo(); Server server = new Server();
return AjaxResult.success(server); server.copyTo();
} return AjaxResult.success(server);
} }
}

View File

@ -1,69 +1,67 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping; import com.ruoyi.common.annotation.Log;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysLogininforService;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.service.ISysLogininforService; /**
* 系统访问记录
/** *
* 系统访问记录 * @author ruoyi
* */
* @author ruoyi @RestController
*/ @RequestMapping("/monitor/logininfor")
@RestController public class SysLogininforController extends BaseController
@RequestMapping("/monitor/logininfor") {
public class SysLogininforController extends BaseController @Autowired
{ private ISysLogininforService logininforService;
@Autowired
private ISysLogininforService logininforService; @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
@GetMapping("/list")
@PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") public TableDataInfo list(SysLogininfor logininfor)
@GetMapping("/list") {
public TableDataInfo list(SysLogininfor logininfor) startPage();
{ List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
startPage(); return getDataTable(list);
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); }
return getDataTable(list);
} @Log(title = "登陆日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
@Log(title = "登录日志", businessType = BusinessType.EXPORT) @GetMapping("/export")
@PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") public AjaxResult export(SysLogininfor logininfor)
@PostMapping("/export") {
public void export(HttpServletResponse response, SysLogininfor logininfor) List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
{ ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); return util.exportExcel(list, "登陆日志");
ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class); }
util.exportExcel(response, list, "登录日志");
} @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
@Log(title = "登陆日志", businessType = BusinessType.DELETE)
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") @DeleteMapping("/{infoIds}")
@Log(title = "登录日志", businessType = BusinessType.DELETE) public AjaxResult remove(@PathVariable Long[] infoIds)
@DeleteMapping("/{infoIds}") {
public AjaxResult remove(@PathVariable Long[] infoIds) return toAjax(logininforService.deleteLogininforByIds(infoIds));
{ }
return toAjax(logininforService.deleteLogininforByIds(infoIds));
} @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
@Log(title = "登陆日志", businessType = BusinessType.CLEAN)
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") @DeleteMapping("/clean")
@Log(title = "登录日志", businessType = BusinessType.CLEAN) public AjaxResult clean()
@DeleteMapping("/clean") {
public AjaxResult clean() logininforService.cleanLogininfor();
{ return AjaxResult.success();
logininforService.cleanLogininfor(); }
return AjaxResult.success(); }
}
}

View File

@ -1,69 +1,66 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping; import com.ruoyi.common.annotation.Log;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysOperLogService;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.service.ISysOperLogService; /**
* 操作日志记录
/** *
* 操作日志记录 * @author ruoyi
* */
* @author ruoyi @RestController
*/ @RequestMapping("/monitor/operlog")
@RestController public class SysOperlogController extends BaseController
@RequestMapping("/monitor/operlog") {
public class SysOperlogController extends BaseController @Autowired
{ private ISysOperLogService operLogService;
@Autowired
private ISysOperLogService operLogService; @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
@GetMapping("/list")
@PreAuthorize("@ss.hasPermi('monitor:operlog:list')") public TableDataInfo list(SysOperLog operLog)
@GetMapping("/list") {
public TableDataInfo list(SysOperLog operLog) startPage();
{ List<SysOperLog> list = operLogService.selectOperLogList(operLog);
startPage(); return getDataTable(list);
List<SysOperLog> list = operLogService.selectOperLogList(operLog); }
return getDataTable(list);
} @Log(title = "操作日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
@Log(title = "操作日志", businessType = BusinessType.EXPORT) @GetMapping("/export")
@PreAuthorize("@ss.hasPermi('monitor:operlog:export')") public AjaxResult export(SysOperLog operLog)
@PostMapping("/export") {
public void export(HttpServletResponse response, SysOperLog operLog) List<SysOperLog> list = operLogService.selectOperLogList(operLog);
{ ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
List<SysOperLog> list = operLogService.selectOperLogList(operLog); return util.exportExcel(list, "操作日志");
ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); }
util.exportExcel(response, list, "操作日志");
} @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/{operIds}")
@Log(title = "操作日志", businessType = BusinessType.DELETE) public AjaxResult remove(@PathVariable Long[] operIds)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") {
@DeleteMapping("/{operIds}") return toAjax(operLogService.deleteOperLogByIds(operIds));
public AjaxResult remove(@PathVariable Long[] operIds) }
{
return toAjax(operLogService.deleteOperLogByIds(operIds)); @Log(title = "操作日志", businessType = BusinessType.CLEAN)
} @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/clean")
@Log(title = "操作日志", businessType = BusinessType.CLEAN) public AjaxResult clean()
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") {
@DeleteMapping("/clean") operLogService.cleanOperLog();
public AjaxResult clean() return AjaxResult.success();
{ }
operLogService.cleanOperLog(); }
return AjaxResult.success();
}
}

View File

@ -1,92 +1,92 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService; import com.ruoyi.system.service.ISysUserOnlineService;
/** /**
* 在线用户监控 * 在线用户监控
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@RequestMapping("/monitor/online") @RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController public class SysUserOnlineController extends BaseController
{ {
@Autowired @Autowired
private ISysUserOnlineService userOnlineService; private ISysUserOnlineService userOnlineService;
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
@PreAuthorize("@ss.hasPermi('monitor:online:list')") @PreAuthorize("@ss.hasPermi('monitor:online:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(String ipaddr, String userName) public TableDataInfo list(String ipaddr, String userName)
{ {
Collection<String> keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); Collection<String> keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*");
List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>(); List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
for (String key : keys) for (String key : keys)
{ {
LoginUser user = redisCache.getCacheObject(key); LoginUser user = redisCache.getCacheObject(key);
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
{ {
if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
{ {
userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
} }
} }
else if (StringUtils.isNotEmpty(ipaddr)) else if (StringUtils.isNotEmpty(ipaddr))
{ {
if (StringUtils.equals(ipaddr, user.getIpaddr())) if (StringUtils.equals(ipaddr, user.getIpaddr()))
{ {
userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
} }
} }
else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
{ {
if (StringUtils.equals(userName, user.getUsername())) if (StringUtils.equals(userName, user.getUsername()))
{ {
userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
} }
} }
else else
{ {
userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
} }
} }
Collections.reverse(userOnlineList); Collections.reverse(userOnlineList);
userOnlineList.removeAll(Collections.singleton(null)); userOnlineList.removeAll(Collections.singleton(null));
return getDataTable(userOnlineList); return getDataTable(userOnlineList);
} }
/** /**
* 强退用户 * 强退用户
*/ */
@PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
@Log(title = "在线用户", businessType = BusinessType.FORCE) @Log(title = "在线用户", businessType = BusinessType.FORCE)
@DeleteMapping("/{tokenId}") @DeleteMapping("/{tokenId}")
public AjaxResult forceLogout(@PathVariable String tokenId) public AjaxResult forceLogout(@PathVariable String tokenId)
{ {
redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId);
return AjaxResult.success(); return AjaxResult.success();
} }
} }

View File

@ -1,134 +1,135 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated;
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
/**
* 参数配置 信息操作处理 /**
* * 参数配置 信息操作处理
* @author ruoyi *
*/ * @author ruoyi
@RestController */
@RequestMapping("/system/config") @RestController
public class SysConfigController extends BaseController @RequestMapping("/system/config")
{ public class SysConfigController extends BaseController
@Autowired {
private ISysConfigService configService; @Autowired
private ISysConfigService configService;
/**
* 获取参数配置列表 /**
*/ * 获取参数配置列表
@PreAuthorize("@ss.hasPermi('system:config:list')") */
@GetMapping("/list") @PreAuthorize("@ss.hasPermi('system:config:list')")
public TableDataInfo list(SysConfig config) @GetMapping("/list")
{ public TableDataInfo list(SysConfig config)
startPage(); {
List<SysConfig> list = configService.selectConfigList(config); startPage();
return getDataTable(list); List<SysConfig> list = configService.selectConfigList(config);
} return getDataTable(list);
}
@Log(title = "参数管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:config:export')") @Log(title = "参数管理", businessType = BusinessType.EXPORT)
@PostMapping("/export") @PreAuthorize("@ss.hasPermi('system:config:export')")
public void export(HttpServletResponse response, SysConfig config) @GetMapping("/export")
{ public AjaxResult export(SysConfig config)
List<SysConfig> list = configService.selectConfigList(config); {
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class); List<SysConfig> list = configService.selectConfigList(config);
util.exportExcel(response, list, "参数数据"); ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
} return util.exportExcel(list, "参数数据");
}
/**
* 根据参数编号获取详细信息 /**
*/ * 根据参数编号获取详细信息
@PreAuthorize("@ss.hasPermi('system:config:query')") */
@GetMapping(value = "/{configId}") @PreAuthorize("@ss.hasPermi('system:config:query')")
public AjaxResult getInfo(@PathVariable Long configId) @GetMapping(value = "/{configId}")
{ public AjaxResult getInfo(@PathVariable Long configId)
return AjaxResult.success(configService.selectConfigById(configId)); {
} return AjaxResult.success(configService.selectConfigById(configId));
}
/**
* 根据参数键名查询参数值 /**
*/ * 根据参数键名查询参数值
@GetMapping(value = "/configKey/{configKey}") */
public AjaxResult getConfigKey(@PathVariable String configKey) @GetMapping(value = "/configKey/{configKey}")
{ public AjaxResult getConfigKey(@PathVariable String configKey)
return AjaxResult.success(configService.selectConfigByKey(configKey)); {
} return AjaxResult.success(configService.selectConfigByKey(configKey));
}
/**
* 新增参数配置 /**
*/ * 新增参数配置
@PreAuthorize("@ss.hasPermi('system:config:add')") */
@Log(title = "参数管理", businessType = BusinessType.INSERT) @PreAuthorize("@ss.hasPermi('system:config:add')")
@PostMapping @Log(title = "参数管理", businessType = BusinessType.INSERT)
public AjaxResult add(@Validated @RequestBody SysConfig config) @PostMapping
{ @RepeatSubmit
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) public AjaxResult add(@Validated @RequestBody SysConfig config)
{ {
return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
} {
config.setCreateBy(getUsername()); return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
return toAjax(configService.insertConfig(config)); }
} config.setCreateBy(SecurityUtils.getUsername());
return toAjax(configService.insertConfig(config));
/** }
* 修改参数配置
*/ /**
@PreAuthorize("@ss.hasPermi('system:config:edit')") * 修改参数配置
@Log(title = "参数管理", businessType = BusinessType.UPDATE) */
@PutMapping @PreAuthorize("@ss.hasPermi('system:config:edit')")
public AjaxResult edit(@Validated @RequestBody SysConfig config) @Log(title = "参数管理", businessType = BusinessType.UPDATE)
{ @PutMapping
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) public AjaxResult edit(@Validated @RequestBody SysConfig config)
{ {
return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
} {
config.setUpdateBy(getUsername()); return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
return toAjax(configService.updateConfig(config)); }
} config.setUpdateBy(SecurityUtils.getUsername());
return toAjax(configService.updateConfig(config));
/** }
* 删除参数配置
*/ /**
@PreAuthorize("@ss.hasPermi('system:config:remove')") * 删除参数配置
@Log(title = "参数管理", businessType = BusinessType.DELETE) */
@DeleteMapping("/{configIds}") @PreAuthorize("@ss.hasPermi('system:config:remove')")
public AjaxResult remove(@PathVariable Long[] configIds) @Log(title = "参数管理", businessType = BusinessType.DELETE)
{ @DeleteMapping("/{configIds}")
configService.deleteConfigByIds(configIds); public AjaxResult remove(@PathVariable Long[] configIds)
return success(); {
} return toAjax(configService.deleteConfigByIds(configIds));
}
/**
* 刷新参数缓存 /**
*/ * 清空缓存
@PreAuthorize("@ss.hasPermi('system:config:remove')") */
@Log(title = "参数管理", businessType = BusinessType.CLEAN) @PreAuthorize("@ss.hasPermi('system:config:remove')")
@DeleteMapping("/refreshCache") @Log(title = "参数管理", businessType = BusinessType.CLEAN)
public AjaxResult refreshCache() @DeleteMapping("/clearCache")
{ public AjaxResult clearCache()
configService.resetConfigCache(); {
return AjaxResult.success(); configService.clearCache();
} return AjaxResult.success();
} }
}

View File

@ -1,165 +1,163 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
/**
* 部门信息 /**
* * 部门信息
* @author ruoyi *
*/ * @author ruoyi
@RestController */
@RequestMapping("/system/dept") @RestController
public class SysDeptController extends BaseController @RequestMapping("/system/dept")
{ public class SysDeptController extends BaseController
@Autowired {
private ISysDeptService deptService; @Autowired
private ISysDeptService deptService;
/**
* 获取部门列表 /**
*/ * 获取部门列表
@PreAuthorize("@ss.hasPermi('system:dept:list')") */
@GetMapping("/list") @PreAuthorize("@ss.hasPermi('system:dept:list')")
public AjaxResult list(SysDept dept) @GetMapping("/list")
{ public AjaxResult list(SysDept dept)
List<SysDept> depts = deptService.selectDeptList(dept); {
return AjaxResult.success(depts); List<SysDept> depts = deptService.selectDeptList(dept);
} return AjaxResult.success(depts);
}
/**
* 查询部门列表排除节点 /**
*/ * 查询部门列表排除节点
@PreAuthorize("@ss.hasPermi('system:dept:list')") */
@GetMapping("/list/exclude/{deptId}") @PreAuthorize("@ss.hasPermi('system:dept:list')")
public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) @GetMapping("/list/exclude/{deptId}")
{ public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
List<SysDept> depts = deptService.selectDeptList(new SysDept()); {
Iterator<SysDept> it = depts.iterator(); List<SysDept> depts = deptService.selectDeptList(new SysDept());
while (it.hasNext()) Iterator<SysDept> it = depts.iterator();
{ while (it.hasNext())
SysDept d = (SysDept) it.next(); {
if (d.getDeptId().intValue() == deptId SysDept d = (SysDept) it.next();
|| ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) if (d.getDeptId().intValue() == deptId
{ || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""))
it.remove(); {
} it.remove();
} }
return AjaxResult.success(depts); }
} return AjaxResult.success(depts);
}
/**
* 根据部门编号获取详细信息 /**
*/ * 根据部门编号获取详细信息
@PreAuthorize("@ss.hasPermi('system:dept:query')") */
@GetMapping(value = "/{deptId}") @PreAuthorize("@ss.hasPermi('system:dept:query')")
public AjaxResult getInfo(@PathVariable Long deptId) @GetMapping(value = "/{deptId}")
{ public AjaxResult getInfo(@PathVariable Long deptId)
deptService.checkDeptDataScope(deptId); {
return AjaxResult.success(deptService.selectDeptById(deptId)); return AjaxResult.success(deptService.selectDeptById(deptId));
} }
/** /**
* 获取部门下拉树列表 * 获取部门下拉树列表
*/ */
@GetMapping("/treeselect") @GetMapping("/treeselect")
public AjaxResult treeselect(SysDept dept) public AjaxResult treeselect(SysDept dept)
{ {
List<SysDept> depts = deptService.selectDeptList(dept); List<SysDept> depts = deptService.selectDeptList(dept);
return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
} }
/** /**
* 加载对应角色部门列表树 * 加载对应角色部门列表树
*/ */
@GetMapping(value = "/roleDeptTreeselect/{roleId}") @GetMapping(value = "/roleDeptTreeselect/{roleId}")
public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
{ {
List<SysDept> depts = deptService.selectDeptList(new SysDept()); List<SysDept> depts = deptService.selectDeptList(new SysDept());
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
ajax.put("depts", deptService.buildDeptTreeSelect(depts)); ajax.put("depts", deptService.buildDeptTreeSelect(depts));
return ajax; return ajax;
} }
/** /**
* 新增部门 * 新增部门
*/ */
@PreAuthorize("@ss.hasPermi('system:dept:add')") @PreAuthorize("@ss.hasPermi('system:dept:add')")
@Log(title = "部门管理", businessType = BusinessType.INSERT) @Log(title = "部门管理", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysDept dept) public AjaxResult add(@Validated @RequestBody SysDept dept)
{ {
if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
{ {
return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
} }
dept.setCreateBy(getUsername()); dept.setCreateBy(SecurityUtils.getUsername());
return toAjax(deptService.insertDept(dept)); return toAjax(deptService.insertDept(dept));
} }
/** /**
* 修改部门 * 修改部门
*/ */
@PreAuthorize("@ss.hasPermi('system:dept:edit')") @PreAuthorize("@ss.hasPermi('system:dept:edit')")
@Log(title = "部门管理", businessType = BusinessType.UPDATE) @Log(title = "部门管理", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysDept dept) public AjaxResult edit(@Validated @RequestBody SysDept dept)
{ {
Long deptId = dept.getDeptId(); if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
deptService.checkDeptDataScope(deptId); {
if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
{ }
return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); else if (dept.getParentId().equals(dept.getDeptId()))
} {
else if (dept.getParentId().equals(deptId)) return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
{ }
return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
} && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0)
else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) {
{ return AjaxResult.error("该部门包含未停用的子部门!");
return AjaxResult.error("该部门包含未停用的子部门!"); }
} dept.setUpdateBy(SecurityUtils.getUsername());
dept.setUpdateBy(getUsername()); return toAjax(deptService.updateDept(dept));
return toAjax(deptService.updateDept(dept)); }
}
/**
/** * 删除部门
* 删除部门 */
*/ @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@PreAuthorize("@ss.hasPermi('system:dept:remove')") @Log(title = "部门管理", businessType = BusinessType.DELETE)
@Log(title = "部门管理", businessType = BusinessType.DELETE) @DeleteMapping("/{deptId}")
@DeleteMapping("/{deptId}") public AjaxResult remove(@PathVariable Long deptId)
public AjaxResult remove(@PathVariable Long deptId) {
{ if (deptService.hasChildByDeptId(deptId))
if (deptService.hasChildByDeptId(deptId)) {
{ return AjaxResult.error("存在下级部门,不允许删除");
return AjaxResult.error("存在下级部门,不允许删除"); }
} if (deptService.checkDeptExistUser(deptId))
if (deptService.checkDeptExistUser(deptId)) {
{ return AjaxResult.error("部门存在用户,不允许删除");
return AjaxResult.error("部门存在用户,不允许删除"); }
} return toAjax(deptService.deleteDeptById(deptId));
deptService.checkDeptDataScope(deptId); }
return toAjax(deptService.deleteDeptById(deptId)); }
}
}

View File

@ -1,121 +1,113 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.ArrayList; import java.util.List;
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping; import com.ruoyi.common.annotation.Log;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService; /**
* 数据字典信息
/** *
* 数据字典信息 * @author ruoyi
* */
* @author ruoyi @RestController
*/ @RequestMapping("/system/dict/data")
@RestController public class SysDictDataController extends BaseController
@RequestMapping("/system/dict/data") {
public class SysDictDataController extends BaseController @Autowired
{ private ISysDictDataService dictDataService;
@Autowired
private ISysDictDataService dictDataService; @Autowired
private ISysDictTypeService dictTypeService;
@Autowired
private ISysDictTypeService dictTypeService; @PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
@PreAuthorize("@ss.hasPermi('system:dict:list')") public TableDataInfo list(SysDictData dictData)
@GetMapping("/list") {
public TableDataInfo list(SysDictData dictData) startPage();
{ List<SysDictData> list = dictDataService.selectDictDataList(dictData);
startPage(); return getDataTable(list);
List<SysDictData> list = dictDataService.selectDictDataList(dictData); }
return getDataTable(list);
} @Log(title = "字典数据", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@Log(title = "字典数据", businessType = BusinessType.EXPORT) @GetMapping("/export")
@PreAuthorize("@ss.hasPermi('system:dict:export')") public AjaxResult export(SysDictData dictData)
@PostMapping("/export") {
public void export(HttpServletResponse response, SysDictData dictData) List<SysDictData> list = dictDataService.selectDictDataList(dictData);
{ ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
List<SysDictData> list = dictDataService.selectDictDataList(dictData); return util.exportExcel(list, "字典数据");
ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class); }
util.exportExcel(response, list, "字典数据");
} /**
* 查询字典数据详细
/** */
* 查询字典数据详细 @PreAuthorize("@ss.hasPermi('system:dict:query')")
*/ @GetMapping(value = "/{dictCode}")
@PreAuthorize("@ss.hasPermi('system:dict:query')") public AjaxResult getInfo(@PathVariable Long dictCode)
@GetMapping(value = "/{dictCode}") {
public AjaxResult getInfo(@PathVariable Long dictCode) return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
{ }
return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
} /**
* 根据字典类型查询字典数据信息
/** */
* 根据字典类型查询字典数据信息 @GetMapping(value = "/type/{dictType}")
*/ public AjaxResult dictType(@PathVariable String dictType)
@GetMapping(value = "/type/{dictType}") {
public AjaxResult dictType(@PathVariable String dictType) return AjaxResult.success(dictTypeService.selectDictDataByType(dictType));
{ }
List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
if (StringUtils.isNull(data)) /**
{ * 新增字典类型
data = new ArrayList<SysDictData>(); */
} @PreAuthorize("@ss.hasPermi('system:dict:add')")
return AjaxResult.success(data); @Log(title = "字典数据", businessType = BusinessType.INSERT)
} @PostMapping
public AjaxResult add(@Validated @RequestBody SysDictData dict)
/** {
* 新增字典类型 dict.setCreateBy(SecurityUtils.getUsername());
*/ return toAjax(dictDataService.insertDictData(dict));
@PreAuthorize("@ss.hasPermi('system:dict:add')") }
@Log(title = "字典数据", businessType = BusinessType.INSERT)
@PostMapping /**
public AjaxResult add(@Validated @RequestBody SysDictData dict) * 修改保存字典类型
{ */
dict.setCreateBy(getUsername()); @PreAuthorize("@ss.hasPermi('system:dict:edit')")
return toAjax(dictDataService.insertDictData(dict)); @Log(title = "字典数据", businessType = BusinessType.UPDATE)
} @PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictData dict)
/** {
* 修改保存字典类型 dict.setUpdateBy(SecurityUtils.getUsername());
*/ return toAjax(dictDataService.updateDictData(dict));
@PreAuthorize("@ss.hasPermi('system:dict:edit')") }
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
@PutMapping /**
public AjaxResult edit(@Validated @RequestBody SysDictData dict) * 删除字典类型
{ */
dict.setUpdateBy(getUsername()); @PreAuthorize("@ss.hasPermi('system:dict:remove')")
return toAjax(dictDataService.updateDictData(dict)); @Log(title = "字典类型", businessType = BusinessType.DELETE)
} @DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
/** {
* 删除字典类型 return toAjax(dictDataService.deleteDictDataByIds(dictCodes));
*/ }
@PreAuthorize("@ss.hasPermi('system:dict:remove')") }
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
{
dictDataService.deleteDictDataByIds(dictCodes);
return success();
}
}

View File

@ -1,132 +1,131 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated;
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysDictTypeService;
/** /**
* 数据字典信息 * 数据字典信息
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@RequestMapping("/system/dict/type") @RequestMapping("/system/dict/type")
public class SysDictTypeController extends BaseController public class SysDictTypeController extends BaseController
{ {
@Autowired @Autowired
private ISysDictTypeService dictTypeService; private ISysDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')") @PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(SysDictType dictType) public TableDataInfo list(SysDictType dictType)
{ {
startPage(); startPage();
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
return getDataTable(list); return getDataTable(list);
} }
@Log(title = "字典类型", businessType = BusinessType.EXPORT) @Log(title = "字典类型", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')") @PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export") @GetMapping("/export")
public void export(HttpServletResponse response, SysDictType dictType) public AjaxResult export(SysDictType dictType)
{ {
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class); ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
util.exportExcel(response, list, "字典类型"); return util.exportExcel(list, "字典类型");
} }
/** /**
* 查询字典类型详细 * 查询字典类型详细
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:query')") @PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictId}") @GetMapping(value = "/{dictId}")
public AjaxResult getInfo(@PathVariable Long dictId) public AjaxResult getInfo(@PathVariable Long dictId)
{ {
return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
} }
/** /**
* 新增字典类型 * 新增字典类型
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:add')") @PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典类型", businessType = BusinessType.INSERT) @Log(title = "字典类型", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysDictType dict) public AjaxResult add(@Validated @RequestBody SysDictType dict)
{ {
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
{ {
return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
} }
dict.setCreateBy(getUsername()); dict.setCreateBy(SecurityUtils.getUsername());
return toAjax(dictTypeService.insertDictType(dict)); return toAjax(dictTypeService.insertDictType(dict));
} }
/** /**
* 修改字典类型 * 修改字典类型
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:edit')") @PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典类型", businessType = BusinessType.UPDATE) @Log(title = "字典类型", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictType dict) public AjaxResult edit(@Validated @RequestBody SysDictType dict)
{ {
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
{ {
return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
} }
dict.setUpdateBy(getUsername()); dict.setUpdateBy(SecurityUtils.getUsername());
return toAjax(dictTypeService.updateDictType(dict)); return toAjax(dictTypeService.updateDictType(dict));
} }
/** /**
* 删除字典类型 * 删除字典类型
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:remove')") @PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE) @Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictIds}") @DeleteMapping("/{dictIds}")
public AjaxResult remove(@PathVariable Long[] dictIds) public AjaxResult remove(@PathVariable Long[] dictIds)
{ {
dictTypeService.deleteDictTypeByIds(dictIds); return toAjax(dictTypeService.deleteDictTypeByIds(dictIds));
return success(); }
}
/**
/** * 清空缓存
* 刷新字典缓存 */
*/ @PreAuthorize("@ss.hasPermi('system:dict:remove')")
@PreAuthorize("@ss.hasPermi('system:dict:remove')") @Log(title = "字典类型", businessType = BusinessType.CLEAN)
@Log(title = "字典类型", businessType = BusinessType.CLEAN) @DeleteMapping("/clearCache")
@DeleteMapping("/refreshCache") public AjaxResult clearCache()
public AjaxResult refreshCache() {
{ dictTypeService.clearCache();
dictTypeService.resetDictCache(); return AjaxResult.success();
return AjaxResult.success(); }
}
/**
/** * 获取字典选择框列表
* 获取字典选择框列表 */
*/ @GetMapping("/optionselect")
@GetMapping("/optionselect") public AjaxResult optionselect()
public AjaxResult optionselect() {
{ List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll(); return AjaxResult.success(dictTypes);
return AjaxResult.success(dictTypes); }
} }
}

View File

@ -1,29 +0,0 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils;
/**
* 首页
*
* @author ruoyi
*/
@RestController
public class SysIndexController
{
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
/**
* 访问首页提示语
*/
@RequestMapping("/")
public String index()
{
return StringUtils.format("欢迎使用{}后台管理框架当前版本v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
}
}

View File

@ -1,93 +1,94 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody; import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
/** /**
* 登录验证 * 登录验证
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
public class SysLoginController public class SysLoginController
{ {
@Autowired @Autowired
private SysLoginService loginService; private SysLoginService loginService;
@Autowired @Autowired
private ISysMenuService menuService; private ISysMenuService menuService;
@Autowired @Autowired
private SysPermissionService permissionService; private SysPermissionService permissionService;
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
/** /**
* 登录方法 * 登录方法
* *
* @param loginBody 登录信息 * @param loginBody 登录信息
* @return 结果 * @return 结果
*/ */
@PostMapping("/login") @PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) public AjaxResult login(@RequestBody LoginBody loginBody)
{ {
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
// 生成令牌 // 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode()); String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
ajax.put(Constants.TOKEN, token); loginBody.getUuid());
return ajax; ajax.put(Constants.TOKEN, token);
} return ajax;
}
/**
* 获取用户信息 /**
* * 获取用户信息
* @return 用户信息 *
*/ * @return 用户信息
@GetMapping("getInfo") */
public AjaxResult getInfo() @GetMapping("getInfo")
{ public AjaxResult getInfo()
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); {
SysUser user = loginUser.getUser(); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
// 角色集合 SysUser user = loginUser.getUser();
Set<String> roles = permissionService.getRolePermission(user); // 角色集合
// 权限集合 Set<String> roles = permissionService.getRolePermission(user);
Set<String> permissions = permissionService.getMenuPermission(user); // 权限集合
AjaxResult ajax = AjaxResult.success(); Set<String> permissions = permissionService.getMenuPermission(user);
ajax.put("user", user); AjaxResult ajax = AjaxResult.success();
ajax.put("roles", roles); ajax.put("user", user);
ajax.put("permissions", permissions); ajax.put("roles", roles);
return ajax; ajax.put("permissions", permissions);
} return ajax;
}
/**
* 获取路由信息 /**
* * 获取路由信息
* @return 路由信息 *
*/ * @return 路由信息
@GetMapping("getRouters") */
public AjaxResult getRouters() @GetMapping("getRouters")
{ public AjaxResult getRouters()
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); {
// 用户信息 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
SysUser user = loginUser.getUser(); // 用户信息
List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId()); SysUser user = loginUser.getUser();
return AjaxResult.success(menuService.buildMenus(menus)); List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
} return AjaxResult.success(menuService.buildMenus(menus));
} }
}

View File

@ -1,142 +1,157 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
/** import com.ruoyi.common.utils.ServletUtils;
* 菜单信息 import com.ruoyi.common.utils.StringUtils;
* import com.ruoyi.framework.web.service.TokenService;
* @author ruoyi import com.ruoyi.system.service.ISysMenuService;
*/
@RestController /**
@RequestMapping("/system/menu") * 菜单信息
public class SysMenuController extends BaseController *
{ * @author ruoyi
@Autowired */
private ISysMenuService menuService; @RestController
@RequestMapping("/system/menu")
/** public class SysMenuController extends BaseController
* 获取菜单列表 {
*/ @Autowired
@PreAuthorize("@ss.hasPermi('system:menu:list')") private ISysMenuService menuService;
@GetMapping("/list")
public AjaxResult list(SysMenu menu) @Autowired
{ private TokenService tokenService;
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return AjaxResult.success(menus); /**
} * 获取菜单列表
*/
/** @PreAuthorize("@ss.hasPermi('system:menu:list')")
* 根据菜单编号获取详细信息 @GetMapping("/list")
*/ public AjaxResult list(SysMenu menu)
@PreAuthorize("@ss.hasPermi('system:menu:query')") {
@GetMapping(value = "/{menuId}") LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
public AjaxResult getInfo(@PathVariable Long menuId) Long userId = loginUser.getUser().getUserId();
{ List<SysMenu> menus = menuService.selectMenuList(menu, userId);
return AjaxResult.success(menuService.selectMenuById(menuId)); return AjaxResult.success(menus);
} }
/** /**
* 获取菜单下拉树列表 * 根据菜单编号获取详细信息
*/ */
@GetMapping("/treeselect") @PreAuthorize("@ss.hasPermi('system:menu:query')")
public AjaxResult treeselect(SysMenu menu) @GetMapping(value = "/{menuId}")
{ public AjaxResult getInfo(@PathVariable Long menuId)
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId()); {
return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); return AjaxResult.success(menuService.selectMenuById(menuId));
} }
/** /**
* 加载对应角色菜单列表树 * 获取菜单下拉树列表
*/ */
@GetMapping(value = "/roleMenuTreeselect/{roleId}") @GetMapping("/treeselect")
public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) public AjaxResult treeselect(SysMenu menu)
{ {
List<SysMenu> menus = menuService.selectMenuList(getUserId()); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
AjaxResult ajax = AjaxResult.success(); Long userId = loginUser.getUser().getUserId();
ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); List<SysMenu> menus = menuService.selectMenuList(menu, userId);
ajax.put("menus", menuService.buildMenuTreeSelect(menus)); return AjaxResult.success(menuService.buildMenuTreeSelect(menus));
return ajax; }
}
/**
/** * 加载对应角色菜单列表树
* 新增菜单 */
*/ @GetMapping(value = "/roleMenuTreeselect/{roleId}")
@PreAuthorize("@ss.hasPermi('system:menu:add')") public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
@Log(title = "菜单管理", businessType = BusinessType.INSERT) {
@PostMapping LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
public AjaxResult add(@Validated @RequestBody SysMenu menu) List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId());
{ AjaxResult ajax = AjaxResult.success();
if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
{ ajax.put("menus", menuService.buildMenuTreeSelect(menus));
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); return ajax;
} }
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
{ /**
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头"); * 新增菜单
} */
menu.setCreateBy(getUsername()); @PreAuthorize("@ss.hasPermi('system:menu:add')")
return toAjax(menuService.insertMenu(menu)); @Log(title = "菜单管理", businessType = BusinessType.INSERT)
} @PostMapping
public AjaxResult add(@Validated @RequestBody SysMenu menu)
/** {
* 修改菜单 if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
*/ {
@PreAuthorize("@ss.hasPermi('system:menu:edit')") return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
@Log(title = "菜单管理", businessType = BusinessType.UPDATE) }
@PutMapping else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
public AjaxResult edit(@Validated @RequestBody SysMenu menu) && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
{ {
if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
{ }
return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); menu.setCreateBy(SecurityUtils.getUsername());
} return toAjax(menuService.insertMenu(menu));
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) }
{
return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头"); /**
} * 修改菜单
else if (menu.getMenuId().equals(menu.getParentId())) */
{ @PreAuthorize("@ss.hasPermi('system:menu:edit')")
return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
} @PutMapping
menu.setUpdateBy(getUsername()); public AjaxResult edit(@Validated @RequestBody SysMenu menu)
return toAjax(menuService.updateMenu(menu)); {
} if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
{
/** return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
* 删除菜单 }
*/ else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
@PreAuthorize("@ss.hasPermi('system:menu:remove')") && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
@Log(title = "菜单管理", businessType = BusinessType.DELETE) {
@DeleteMapping("/{menuId}") return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
public AjaxResult remove(@PathVariable("menuId") Long menuId) }
{ else if (menu.getMenuId().equals(menu.getParentId()))
if (menuService.hasChildByMenuId(menuId)) {
{ return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
return AjaxResult.error("存在子菜单,不允许删除"); }
} menu.setUpdateBy(SecurityUtils.getUsername());
if (menuService.checkMenuExistRole(menuId)) return toAjax(menuService.updateMenu(menu));
{ }
return AjaxResult.error("菜单已分配,不允许删除");
} /**
return toAjax(menuService.deleteMenuById(menuId)); * 删除菜单
} */
@PreAuthorize("@ss.hasPermi('system:menu:remove')")
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{menuId}")
public AjaxResult remove(@PathVariable("menuId") Long menuId)
{
if (menuService.hasChildByMenuId(menuId))
{
return AjaxResult.error("存在子菜单,不允许删除");
}
if (menuService.checkMenuExistRole(menuId))
{
return AjaxResult.error("菜单已分配,不允许删除");
}
return toAjax(menuService.deleteMenuById(menuId));
}
} }

View File

@ -1,91 +1,92 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SysNotice; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysNoticeService; import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService;
/**
* 公告 信息操作处理 /**
* * 公告 信息操作处理
* @author ruoyi *
*/ * @author ruoyi
@RestController */
@RequestMapping("/system/notice") @RestController
public class SysNoticeController extends BaseController @RequestMapping("/system/notice")
{ public class SysNoticeController extends BaseController
@Autowired {
private ISysNoticeService noticeService; @Autowired
private ISysNoticeService noticeService;
/**
* 获取通知公告列表 /**
*/ * 获取通知公告列表
@PreAuthorize("@ss.hasPermi('system:notice:list')") */
@GetMapping("/list") @PreAuthorize("@ss.hasPermi('system:notice:list')")
public TableDataInfo list(SysNotice notice) @GetMapping("/list")
{ public TableDataInfo list(SysNotice notice)
startPage(); {
List<SysNotice> list = noticeService.selectNoticeList(notice); startPage();
return getDataTable(list); List<SysNotice> list = noticeService.selectNoticeList(notice);
} return getDataTable(list);
}
/**
* 根据通知公告编号获取详细信息 /**
*/ * 根据通知公告编号获取详细信息
@PreAuthorize("@ss.hasPermi('system:notice:query')") */
@GetMapping(value = "/{noticeId}") @PreAuthorize("@ss.hasPermi('system:notice:query')")
public AjaxResult getInfo(@PathVariable Long noticeId) @GetMapping(value = "/{noticeId}")
{ public AjaxResult getInfo(@PathVariable Long noticeId)
return AjaxResult.success(noticeService.selectNoticeById(noticeId)); {
} return AjaxResult.success(noticeService.selectNoticeById(noticeId));
}
/**
* 新增通知公告 /**
*/ * 新增通知公告
@PreAuthorize("@ss.hasPermi('system:notice:add')") */
@Log(title = "通知公告", businessType = BusinessType.INSERT) @PreAuthorize("@ss.hasPermi('system:notice:add')")
@PostMapping @Log(title = "通知公告", businessType = BusinessType.INSERT)
public AjaxResult add(@Validated @RequestBody SysNotice notice) @PostMapping
{ public AjaxResult add(@Validated @RequestBody SysNotice notice)
notice.setCreateBy(getUsername()); {
return toAjax(noticeService.insertNotice(notice)); notice.setCreateBy(SecurityUtils.getUsername());
} return toAjax(noticeService.insertNotice(notice));
}
/**
* 修改通知公告 /**
*/ * 修改通知公告
@PreAuthorize("@ss.hasPermi('system:notice:edit')") */
@Log(title = "通知公告", businessType = BusinessType.UPDATE) @PreAuthorize("@ss.hasPermi('system:notice:edit')")
@PutMapping @Log(title = "通知公告", businessType = BusinessType.UPDATE)
public AjaxResult edit(@Validated @RequestBody SysNotice notice) @PutMapping
{ public AjaxResult edit(@Validated @RequestBody SysNotice notice)
notice.setUpdateBy(getUsername()); {
return toAjax(noticeService.updateNotice(notice)); notice.setUpdateBy(SecurityUtils.getUsername());
} return toAjax(noticeService.updateNotice(notice));
}
/**
* 删除通知公告 /**
*/ * 删除通知公告
@PreAuthorize("@ss.hasPermi('system:notice:remove')") */
@Log(title = "通知公告", businessType = BusinessType.DELETE) @PreAuthorize("@ss.hasPermi('system:notice:remove')")
@DeleteMapping("/{noticeIds}") @Log(title = "通知公告", businessType = BusinessType.DELETE)
public AjaxResult remove(@PathVariable Long[] noticeIds) @DeleteMapping("/{noticeIds}")
{ public AjaxResult remove(@PathVariable Long[] noticeIds)
return toAjax(noticeService.deleteNoticeByIds(noticeIds)); {
} return toAjax(noticeService.deleteNoticeByIds(noticeIds));
} }
}

View File

@ -1,130 +1,130 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated;
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysPostService;
/** /**
* 岗位信息操作处理 * 岗位信息操作处理
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@RequestMapping("/system/post") @RequestMapping("/system/post")
public class SysPostController extends BaseController public class SysPostController extends BaseController
{ {
@Autowired @Autowired
private ISysPostService postService; private ISysPostService postService;
/** /**
* 获取岗位列表 * 获取岗位列表
*/ */
@PreAuthorize("@ss.hasPermi('system:post:list')") @PreAuthorize("@ss.hasPermi('system:post:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(SysPost post) public TableDataInfo list(SysPost post)
{ {
startPage(); startPage();
List<SysPost> list = postService.selectPostList(post); List<SysPost> list = postService.selectPostList(post);
return getDataTable(list); return getDataTable(list);
} }
@Log(title = "岗位管理", businessType = BusinessType.EXPORT) @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:post:export')") @PreAuthorize("@ss.hasPermi('system:post:export')")
@PostMapping("/export") @GetMapping("/export")
public void export(HttpServletResponse response, SysPost post) public AjaxResult export(SysPost post)
{ {
List<SysPost> list = postService.selectPostList(post); List<SysPost> list = postService.selectPostList(post);
ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class); ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
util.exportExcel(response, list, "岗位数据"); return util.exportExcel(list, "岗位数据");
} }
/** /**
* 根据岗位编号获取详细信息 * 根据岗位编号获取详细信息
*/ */
@PreAuthorize("@ss.hasPermi('system:post:query')") @PreAuthorize("@ss.hasPermi('system:post:query')")
@GetMapping(value = "/{postId}") @GetMapping(value = "/{postId}")
public AjaxResult getInfo(@PathVariable Long postId) public AjaxResult getInfo(@PathVariable Long postId)
{ {
return AjaxResult.success(postService.selectPostById(postId)); return AjaxResult.success(postService.selectPostById(postId));
} }
/** /**
* 新增岗位 * 新增岗位
*/ */
@PreAuthorize("@ss.hasPermi('system:post:add')") @PreAuthorize("@ss.hasPermi('system:post:add')")
@Log(title = "岗位管理", businessType = BusinessType.INSERT) @Log(title = "岗位管理", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysPost post) public AjaxResult add(@Validated @RequestBody SysPost post)
{ {
if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
{ {
return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
} }
else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
{ {
return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
} }
post.setCreateBy(getUsername()); post.setCreateBy(SecurityUtils.getUsername());
return toAjax(postService.insertPost(post)); return toAjax(postService.insertPost(post));
} }
/** /**
* 修改岗位 * 修改岗位
*/ */
@PreAuthorize("@ss.hasPermi('system:post:edit')") @PreAuthorize("@ss.hasPermi('system:post:edit')")
@Log(title = "岗位管理", businessType = BusinessType.UPDATE) @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysPost post) public AjaxResult edit(@Validated @RequestBody SysPost post)
{ {
if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
{ {
return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
} }
else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
{ {
return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
} }
post.setUpdateBy(getUsername()); post.setUpdateBy(SecurityUtils.getUsername());
return toAjax(postService.updatePost(post)); return toAjax(postService.updatePost(post));
} }
/** /**
* 删除岗位 * 删除岗位
*/ */
@PreAuthorize("@ss.hasPermi('system:post:remove')") @PreAuthorize("@ss.hasPermi('system:post:remove')")
@Log(title = "岗位管理", businessType = BusinessType.DELETE) @Log(title = "岗位管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{postIds}") @DeleteMapping("/{postIds}")
public AjaxResult remove(@PathVariable Long[] postIds) public AjaxResult remove(@PathVariable Long[] postIds)
{ {
return toAjax(postService.deletePostByIds(postIds)); return toAjax(postService.deletePostByIds(postIds));
} }
/** /**
* 获取岗位选择框列表 * 获取岗位选择框列表
*/ */
@GetMapping("/optionselect") @GetMapping("/optionselect")
public AjaxResult optionselect() public AjaxResult optionselect()
{ {
List<SysPost> posts = postService.selectPostAll(); List<SysPost> posts = postService.selectPostAll();
return AjaxResult.success(posts); return AjaxResult.success(posts);
} }
} }

View File

@ -1,142 +1,127 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.io.IOException; import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.ISysUserService;
/**
/** * 个人信息 业务处理
* 个人信息 业务处理 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/system/user/profile")
@RequestMapping("/system/user/profile") public class SysProfileController extends BaseController
public class SysProfileController extends BaseController {
{ @Autowired
@Autowired private ISysUserService userService;
private ISysUserService userService;
@Autowired
@Autowired private TokenService tokenService;
private TokenService tokenService;
/**
/** * 个人信息
* 个人信息 */
*/ @GetMapping
@GetMapping public AjaxResult profile()
public AjaxResult profile() {
{ LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
LoginUser loginUser = getLoginUser(); SysUser user = loginUser.getUser();
SysUser user = loginUser.getUser(); AjaxResult ajax = AjaxResult.success(user);
AjaxResult ajax = AjaxResult.success(user); ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); return ajax;
return ajax; }
}
/**
/** * 修改用户
* 修改用户 */
*/ @Log(title = "个人信息", businessType = BusinessType.UPDATE)
@Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping
@PutMapping public AjaxResult updateProfile(@RequestBody SysUser user)
public AjaxResult updateProfile(@RequestBody SysUser user) {
{ if (userService.updateUserProfile(user) > 0)
LoginUser loginUser = getLoginUser(); {
SysUser sysUser = loginUser.getUser(); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
user.setUserName(sysUser.getUserName()); // 更新缓存用户信息
if (StringUtils.isNotEmpty(user.getPhonenumber()) loginUser.getUser().setNickName(user.getNickName());
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) loginUser.getUser().setPhonenumber(user.getPhonenumber());
{ loginUser.getUser().setEmail(user.getEmail());
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); loginUser.getUser().setSex(user.getSex());
} tokenService.setLoginUser(loginUser);
if (StringUtils.isNotEmpty(user.getEmail()) return AjaxResult.success();
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) }
{ return AjaxResult.error("修改个人信息异常,请联系管理员");
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); }
}
user.setUserId(sysUser.getUserId()); /**
user.setPassword(null); * 重置密码
if (userService.updateUserProfile(user) > 0) */
{ @Log(title = "个人信息", businessType = BusinessType.UPDATE)
// 更新缓存用户信息 @PutMapping("/updatePwd")
sysUser.setNickName(user.getNickName()); public AjaxResult updatePwd(String oldPassword, String newPassword)
sysUser.setPhonenumber(user.getPhonenumber()); {
sysUser.setEmail(user.getEmail()); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
sysUser.setSex(user.getSex()); String userName = loginUser.getUsername();
tokenService.setLoginUser(loginUser); String password = loginUser.getPassword();
return AjaxResult.success(); if (!SecurityUtils.matchesPassword(oldPassword, password))
} {
return AjaxResult.error("修改个人信息异常,请联系管理员"); return AjaxResult.error("修改密码失败,旧密码错误");
} }
if (SecurityUtils.matchesPassword(newPassword, password))
/** {
* 重置密码 return AjaxResult.error("新密码不能与旧密码相同");
*/ }
@Log(title = "个人信息", businessType = BusinessType.UPDATE) if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
@PutMapping("/updatePwd") {
public AjaxResult updatePwd(String oldPassword, String newPassword) // 更新缓存用户密码
{ loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
LoginUser loginUser = getLoginUser(); tokenService.setLoginUser(loginUser);
String userName = loginUser.getUsername(); return AjaxResult.success();
String password = loginUser.getPassword(); }
if (!SecurityUtils.matchesPassword(oldPassword, password)) return AjaxResult.error("修改密码异常,请联系管理员");
{ }
return AjaxResult.error("修改密码失败,旧密码错误");
} /**
if (SecurityUtils.matchesPassword(newPassword, password)) * 头像上传
{ */
return AjaxResult.error("新密码不能与旧密码相同"); @Log(title = "用户头像", businessType = BusinessType.UPDATE)
} @PostMapping("/avatar")
if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
{ {
// 更新缓存用户密码 if (!file.isEmpty())
loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); {
tokenService.setLoginUser(loginUser); LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
return AjaxResult.success(); String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
} if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
return AjaxResult.error("修改密码异常,请联系管理员"); {
} AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
/** // 更新缓存用户头像
* 头像上传 loginUser.getUser().setAvatar(avatar);
*/ tokenService.setLoginUser(loginUser);
@Log(title = "用户头像", businessType = BusinessType.UPDATE) return ajax;
@PostMapping("/avatar") }
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException }
{ return AjaxResult.error("上传图片异常,请联系管理员");
if (!file.isEmpty()) }
{ }
LoginUser loginUser = getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
// 更新缓存用户头像
loginUser.getUser().setAvatar(avatar);
tokenService.setLoginUser(loginUser);
return ajax;
}
}
return AjaxResult.error("上传图片异常,请联系管理员");
}
}

View File

@ -1,38 +0,0 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysRegisterService;
import com.ruoyi.system.service.ISysConfigService;
/**
* 注册验证
*
* @author ruoyi
*/
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private SysRegisterService registerService;
@Autowired
private ISysConfigService configService;
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
// if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
// {
// return error("当前系统没有开启注册功能!");
// }
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}

View File

@ -1,245 +1,182 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated;
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.ISysUserService;
/**
/** * 角色信息
* 角色信息 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/system/role")
@RequestMapping("/system/role") public class SysRoleController extends BaseController
public class SysRoleController extends BaseController {
{ @Autowired
@Autowired private ISysRoleService roleService;
private ISysRoleService roleService;
@Autowired
@Autowired private TokenService tokenService;
private TokenService tokenService;
@Autowired
@Autowired private SysPermissionService permissionService;
private SysPermissionService permissionService;
@Autowired
@Autowired private ISysUserService userService;
private ISysUserService userService;
@PreAuthorize("@ss.hasPermi('system:role:list')")
@PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/list")
@GetMapping("/list") public TableDataInfo list(SysRole role)
public TableDataInfo list(SysRole role) {
{ startPage();
startPage(); List<SysRole> list = roleService.selectRoleList(role);
List<SysRole> list = roleService.selectRoleList(role); return getDataTable(list);
return getDataTable(list); }
}
@Log(title = "角色管理", businessType = BusinessType.EXPORT)
@Log(title = "角色管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:role:export')")
@PreAuthorize("@ss.hasPermi('system:role:export')") @GetMapping("/export")
@PostMapping("/export") public AjaxResult export(SysRole role)
public void export(HttpServletResponse response, SysRole role) {
{ List<SysRole> list = roleService.selectRoleList(role);
List<SysRole> list = roleService.selectRoleList(role); ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class); return util.exportExcel(list, "角色数据");
util.exportExcel(response, list, "角色数据"); }
}
/**
/** * 根据角色编号获取详细信息
* 根据角色编号获取详细信息 */
*/ @PreAuthorize("@ss.hasPermi('system:role:query')")
@PreAuthorize("@ss.hasPermi('system:role:query')") @GetMapping(value = "/{roleId}")
@GetMapping(value = "/{roleId}") public AjaxResult getInfo(@PathVariable Long roleId)
public AjaxResult getInfo(@PathVariable Long roleId) {
{ return AjaxResult.success(roleService.selectRoleById(roleId));
roleService.checkRoleDataScope(roleId); }
return AjaxResult.success(roleService.selectRoleById(roleId));
} /**
* 新增角色
/** */
* 新增角色 @PreAuthorize("@ss.hasPermi('system:role:add')")
*/ @Log(title = "角色管理", businessType = BusinessType.INSERT)
@PreAuthorize("@ss.hasPermi('system:role:add')") @PostMapping
@Log(title = "角色管理", businessType = BusinessType.INSERT) public AjaxResult add(@Validated @RequestBody SysRole role)
@PostMapping {
public AjaxResult add(@Validated @RequestBody SysRole role) if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
{ {
if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
{ }
return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
} {
else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
{ }
return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); role.setCreateBy(SecurityUtils.getUsername());
} return toAjax(roleService.insertRole(role));
role.setCreateBy(getUsername());
return toAjax(roleService.insertRole(role)); }
} /**
* 修改保存角色
/** */
* 修改保存角色 @PreAuthorize("@ss.hasPermi('system:role:edit')")
*/ @Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PreAuthorize("@ss.hasPermi('system:role:edit')") @PutMapping
@Log(title = "角色管理", businessType = BusinessType.UPDATE) public AjaxResult edit(@Validated @RequestBody SysRole role)
@PutMapping {
public AjaxResult edit(@Validated @RequestBody SysRole role) roleService.checkRoleAllowed(role);
{ if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
roleService.checkRoleAllowed(role); {
roleService.checkRoleDataScope(role.getRoleId()); return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) }
{ else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); {
} return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) }
{ role.setUpdateBy(SecurityUtils.getUsername());
return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
} if (roleService.updateRole(role) > 0)
role.setUpdateBy(getUsername()); {
// 更新缓存用户权限
if (roleService.updateRole(role) > 0) LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
{ if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
// 更新缓存用户权限 {
LoginUser loginUser = getLoginUser(); loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
{ tokenService.setLoginUser(loginUser);
loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); }
loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); return AjaxResult.success();
tokenService.setLoginUser(loginUser); }
} return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
return AjaxResult.success(); }
}
return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); /**
} * 修改保存数据权限
*/
/** @PreAuthorize("@ss.hasPermi('system:role:edit')")
* 修改保存数据权限 @Log(title = "角色管理", businessType = BusinessType.UPDATE)
*/ @PutMapping("/dataScope")
@PreAuthorize("@ss.hasPermi('system:role:edit')") public AjaxResult dataScope(@RequestBody SysRole role)
@Log(title = "角色管理", businessType = BusinessType.UPDATE) {
@PutMapping("/dataScope") roleService.checkRoleAllowed(role);
public AjaxResult dataScope(@RequestBody SysRole role) return toAjax(roleService.authDataScope(role));
{ }
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId()); /**
return toAjax(roleService.authDataScope(role)); * 状态修改
} */
@PreAuthorize("@ss.hasPermi('system:role:edit')")
/** @Log(title = "角色管理", businessType = BusinessType.UPDATE)
* 状态修改 @PutMapping("/changeStatus")
*/ public AjaxResult changeStatus(@RequestBody SysRole role)
@PreAuthorize("@ss.hasPermi('system:role:edit')") {
@Log(title = "角色管理", businessType = BusinessType.UPDATE) roleService.checkRoleAllowed(role);
@PutMapping("/changeStatus") role.setUpdateBy(SecurityUtils.getUsername());
public AjaxResult changeStatus(@RequestBody SysRole role) return toAjax(roleService.updateRoleStatus(role));
{ }
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId()); /**
role.setUpdateBy(getUsername()); * 删除角色
return toAjax(roleService.updateRoleStatus(role)); */
} @PreAuthorize("@ss.hasPermi('system:role:remove')")
@Log(title = "角色管理", businessType = BusinessType.DELETE)
/** @DeleteMapping("/{roleIds}")
* 删除角色 public AjaxResult remove(@PathVariable Long[] roleIds)
*/ {
@PreAuthorize("@ss.hasPermi('system:role:remove')") return toAjax(roleService.deleteRoleByIds(roleIds));
@Log(title = "角色管理", businessType = BusinessType.DELETE) }
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable Long[] roleIds) /**
{ * 获取角色选择框列表
return toAjax(roleService.deleteRoleByIds(roleIds)); */
} @PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping("/optionselect")
/** public AjaxResult optionselect()
* 获取角色选择框列表 {
*/ return AjaxResult.success(roleService.selectRoleAll());
@PreAuthorize("@ss.hasPermi('system:role:query')") }
@GetMapping("/optionselect") }
public AjaxResult optionselect()
{
return AjaxResult.success(roleService.selectRoleAll());
}
/**
* 查询已分配用户角色列表
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/allocatedList")
public TableDataInfo allocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectAllocatedList(user);
return getDataTable(list);
}
/**
* 查询未分配用户角色列表
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/unallocatedList")
public TableDataInfo unallocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUnallocatedList(user);
return getDataTable(list);
}
/**
* 取消授权用户
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancel")
public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
{
return toAjax(roleService.deleteAuthUser(userRole));
}
/**
* 批量取消授权用户
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancelAll")
public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
{
return toAjax(roleService.deleteAuthUsers(roleId, userIds));
}
/**
* 批量选择用户授权
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/selectAll")
public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
{
roleService.checkRoleDataScope(roleId);
return toAjax(roleService.insertAuthUsers(roleId, userIds));
}
}

View File

@ -1,237 +1,201 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired;
import org.apache.commons.lang3.ArrayUtils; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log;
import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
/**
* 用户信息 /**
* * 用户信息
* @author ruoyi *
*/ * @author ruoyi
@RestController */
@RequestMapping("/system/user") @RestController
public class SysUserController extends BaseController @RequestMapping("/system/user")
{ public class SysUserController extends BaseController
@Autowired {
private ISysUserService userService; @Autowired
private ISysUserService userService;
@Autowired
private ISysRoleService roleService; @Autowired
private ISysRoleService roleService;
@Autowired
private ISysPostService postService; @Autowired
private ISysPostService postService;
/**
* 获取用户列表 @Autowired
*/ private TokenService tokenService;
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list") /**
public TableDataInfo list(SysUser user) * 获取用户列表
{ */
startPage(); @PreAuthorize("@ss.hasPermi('system:user:list')")
List<SysUser> list = userService.selectUserList(user); @GetMapping("/list")
return getDataTable(list); public TableDataInfo list(SysUser user)
} {
startPage();
@Log(title = "用户管理", businessType = BusinessType.EXPORT) List<SysUser> list = userService.selectUserList(user);
@PreAuthorize("@ss.hasPermi('system:user:export')") return getDataTable(list);
@PostMapping("/export") }
public void export(HttpServletResponse response, SysUser user)
{ @Log(title = "用户管理", businessType = BusinessType.EXPORT)
List<SysUser> list = userService.selectUserList(user); @PreAuthorize("@ss.hasPermi('system:user:export')")
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); @GetMapping("/export")
util.exportExcel(response, list, "用户数据"); public AjaxResult export(SysUser user)
} {
List<SysUser> list = userService.selectUserList(user);
@Log(title = "用户管理", businessType = BusinessType.IMPORT) ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
@PreAuthorize("@ss.hasPermi('system:user:import')") return util.exportExcel(list, "用户数据");
@PostMapping("/importData") }
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{ @Log(title = "用户管理", businessType = BusinessType.IMPORT)
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); @PreAuthorize("@ss.hasPermi('system:user:import')")
List<SysUser> userList = util.importExcel(file.getInputStream()); @PostMapping("/importData")
String operName = getUsername(); public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
String message = userService.importUser(userList, updateSupport, operName); {
return AjaxResult.success(message); ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
} List<SysUser> userList = util.importExcel(file.getInputStream());
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
@PostMapping("/importTemplate") String operName = loginUser.getUsername();
public void importTemplate(HttpServletResponse response) String message = userService.importUser(userList, updateSupport, operName);
{ return AjaxResult.success(message);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); }
util.importTemplateExcel(response, "用户数据");
} @GetMapping("/importTemplate")
public AjaxResult importTemplate()
/** {
* 根据用户编号获取详细信息 ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
*/ return util.importTemplateExcel("用户数据");
@PreAuthorize("@ss.hasPermi('system:user:query')") }
@GetMapping(value = { "/", "/{userId}" })
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) /**
{ * 根据用户编号获取详细信息
userService.checkUserDataScope(userId); */
AjaxResult ajax = AjaxResult.success(); @PreAuthorize("@ss.hasPermi('system:user:query')")
List<SysRole> roles = roleService.selectRoleAll(); @GetMapping(value = { "/", "/{userId}" })
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
ajax.put("posts", postService.selectPostAll()); {
if (StringUtils.isNotNull(userId)) AjaxResult ajax = AjaxResult.success();
{ List<SysRole> roles = roleService.selectRoleAll();
SysUser sysUser = userService.selectUserById(userId); ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put(AjaxResult.DATA_TAG, sysUser); ajax.put("posts", postService.selectPostAll());
ajax.put("postIds", postService.selectPostListByUserId(userId)); if (StringUtils.isNotNull(userId))
ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); {
} ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId));
return ajax; ajax.put("postIds", postService.selectPostListByUserId(userId));
} ajax.put("roleIds", roleService.selectRoleListByUserId(userId));
}
/** return ajax;
* 新增用户 }
*/
@PreAuthorize("@ss.hasPermi('system:user:add')") /**
@Log(title = "用户管理", businessType = BusinessType.INSERT) * 新增用户
@PostMapping */
public AjaxResult add(@Validated @RequestBody SysUser user) @PreAuthorize("@ss.hasPermi('system:user:add')")
{ @Log(title = "用户管理", businessType = BusinessType.INSERT)
if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) @PostMapping
{ public AjaxResult add(@Validated @RequestBody SysUser user)
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); {
} if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))
else if (StringUtils.isNotEmpty(user.getPhonenumber()) {
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
{ }
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); else if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
} {
else if (StringUtils.isNotEmpty(user.getEmail()) return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) }
{ else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); {
} return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
user.setCreateBy(getUsername()); }
user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); user.setCreateBy(SecurityUtils.getUsername());
return toAjax(userService.insertUser(user)); user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
} return toAjax(userService.insertUser(user));
}
/**
* 修改用户 /**
*/ * 修改用户
@PreAuthorize("@ss.hasPermi('system:user:edit')") */
@Log(title = "用户管理", businessType = BusinessType.UPDATE) @PreAuthorize("@ss.hasPermi('system:user:edit')")
@PutMapping @Log(title = "用户管理", businessType = BusinessType.UPDATE)
public AjaxResult edit(@Validated @RequestBody SysUser user) @PutMapping
{ public AjaxResult edit(@Validated @RequestBody SysUser user)
userService.checkUserAllowed(user); {
userService.checkUserDataScope(user.getUserId()); userService.checkUserAllowed(user);
if (StringUtils.isNotEmpty(user.getPhonenumber()) if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
{ return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); }
} else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
else if (StringUtils.isNotEmpty(user.getEmail()) {
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
{ }
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); user.setUpdateBy(SecurityUtils.getUsername());
} return toAjax(userService.updateUser(user));
user.setUpdateBy(getUsername()); }
return toAjax(userService.updateUser(user));
} /**
* 删除用户
/** */
* 删除用户 @PreAuthorize("@ss.hasPermi('system:user:remove')")
*/ @Log(title = "用户管理", businessType = BusinessType.DELETE)
@PreAuthorize("@ss.hasPermi('system:user:remove')") @DeleteMapping("/{userIds}")
@Log(title = "用户管理", businessType = BusinessType.DELETE) public AjaxResult remove(@PathVariable Long[] userIds)
@DeleteMapping("/{userIds}") {
public AjaxResult remove(@PathVariable Long[] userIds) return toAjax(userService.deleteUserByIds(userIds));
{ }
if (ArrayUtils.contains(userIds, getUserId()))
{ /**
return error("当前用户不能删除"); * 重置密码
} */
return toAjax(userService.deleteUserByIds(userIds)); @PreAuthorize("@ss.hasPermi('system:user:edit')")
} @Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/resetPwd")
/** public AjaxResult resetPwd(@RequestBody SysUser user)
* 重置密码 {
*/ userService.checkUserAllowed(user);
@PreAuthorize("@ss.hasPermi('system:user:resetPwd')") user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@Log(title = "用户管理", businessType = BusinessType.UPDATE) user.setUpdateBy(SecurityUtils.getUsername());
@PutMapping("/resetPwd") return toAjax(userService.resetPwd(user));
public AjaxResult resetPwd(@RequestBody SysUser user) }
{
userService.checkUserAllowed(user); /**
userService.checkUserDataScope(user.getUserId()); * 状态修改
user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); */
user.setUpdateBy(getUsername()); @PreAuthorize("@ss.hasPermi('system:user:edit')")
return toAjax(userService.resetPwd(user)); @Log(title = "用户管理", businessType = BusinessType.UPDATE)
} @PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysUser user)
/** {
* 状态修改 userService.checkUserAllowed(user);
*/ user.setUpdateBy(SecurityUtils.getUsername());
@PreAuthorize("@ss.hasPermi('system:user:edit')") return toAjax(userService.updateUserStatus(user));
@Log(title = "用户管理", businessType = BusinessType.UPDATE) }
@PutMapping("/changeStatus") }
public AjaxResult changeStatus(@RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setUpdateBy(getUsername());
return toAjax(userService.updateUserStatus(user));
}
/**
* 根据用户编号获取授权角色
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping("/authRole/{userId}")
public AjaxResult authRole(@PathVariable("userId") Long userId)
{
AjaxResult ajax = AjaxResult.success();
SysUser user = userService.selectUserById(userId);
List<SysRole> roles = roleService.selectRolesByUserId(userId);
ajax.put("user", user);
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
return ajax;
}
/**
* 用户授权角色
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
{
userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds);
return success();
}
}

View File

@ -1,24 +1,24 @@
package com.ruoyi.web.controller.tool; package com.ruoyi.web.controller.tool;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
/** /**
* swagger 接口 * swagger 接口
* *
* @author ruoyi * @author ruoyi
*/ */
@Controller @Controller
@RequestMapping("/tool/swagger") @RequestMapping("/tool/swagger")
public class SwaggerController extends BaseController public class SwaggerController extends BaseController
{ {
@PreAuthorize("@ss.hasPermi('tool:swagger:view')") @PreAuthorize("@ss.hasPermi('tool:swagger:view')")
@GetMapping() @GetMapping()
public String index() public String index()
{ {
return redirect("/swagger-ui.html"); return redirect("/swagger-ui.html");
} }
} }

View File

@ -1,181 +1,175 @@
package com.ruoyi.web.controller.tool; package com.ruoyi.web.controller.tool;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api;
import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation; /**
* swagger 用户测试方法
/** *
* swagger 用户测试方法 * @author ruoyi
* */
* @author ruoyi @Api("用户信息管理")
*/ @RestController
@Api("用户信息管理") @RequestMapping("/test/user")
@RestController public class TestController extends BaseController
@RequestMapping("/test/user") {
public class TestController extends BaseController private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
{ {
private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>(); users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
{ users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); }
users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
} @ApiOperation("获取用户列表")
@GetMapping("/list")
@ApiOperation("获取用户列表") public AjaxResult userList()
@GetMapping("/list") {
public AjaxResult userList() List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
{ return AjaxResult.success(userList);
List<UserEntity> userList = new ArrayList<UserEntity>(users.values()); }
return AjaxResult.success(userList);
} @ApiOperation("获取用户详细")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
@ApiOperation("获取用户详细") @GetMapping("/{userId}")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) public AjaxResult getUser(@PathVariable Integer userId)
@GetMapping("/{userId}") {
public AjaxResult getUser(@PathVariable Integer userId) if (!users.isEmpty() && users.containsKey(userId))
{ {
if (!users.isEmpty() && users.containsKey(userId)) return AjaxResult.success(users.get(userId));
{ }
return AjaxResult.success(users.get(userId)); else
} {
else return AjaxResult.error("用户不存在");
{ }
return error("用户不存在"); }
}
} @ApiOperation("新增用户")
@ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity")
@ApiOperation("新增用户") @PostMapping("/save")
@ApiImplicitParams({ public AjaxResult save(UserEntity user)
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), {
@ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
@ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), {
@ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) return AjaxResult.error("用户ID不能为空");
}) }
@PostMapping("/save") return AjaxResult.success(users.put(user.getUserId(), user));
public AjaxResult save(UserEntity user) }
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) @ApiOperation("更新用户")
{ @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity")
return error("用户ID不能为空"); @PutMapping("/update")
} public AjaxResult update(UserEntity user)
return AjaxResult.success(users.put(user.getUserId(), user)); {
} if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
@ApiOperation("更新用户") return AjaxResult.error("用户ID不能为空");
@PutMapping("/update") }
public AjaxResult update(@RequestBody UserEntity user) if (users.isEmpty() || !users.containsKey(user.getUserId()))
{ {
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) return AjaxResult.error("用户不存在");
{ }
return error("用户ID不能为空"); users.remove(user.getUserId());
} return AjaxResult.success(users.put(user.getUserId(), user));
if (users.isEmpty() || !users.containsKey(user.getUserId())) }
{
return error("用户不存在"); @ApiOperation("删除用户信息")
} @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
users.remove(user.getUserId()); @DeleteMapping("/{userId}")
return AjaxResult.success(users.put(user.getUserId(), user)); public AjaxResult delete(@PathVariable Integer userId)
} {
if (!users.isEmpty() && users.containsKey(userId))
@ApiOperation("删除用户信息") {
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) users.remove(userId);
@DeleteMapping("/{userId}") return AjaxResult.success();
public AjaxResult delete(@PathVariable Integer userId) }
{ else
if (!users.isEmpty() && users.containsKey(userId)) {
{ return AjaxResult.error("用户不存在");
users.remove(userId); }
return success(); }
} }
else
{ @ApiModel("用户实体")
return error("用户不存在"); class UserEntity
} {
} @ApiModelProperty("用户ID")
} private Integer userId;
@ApiModel(value = "UserEntity", description = "用户实体") @ApiModelProperty("用户名称")
class UserEntity private String username;
{
@ApiModelProperty("用户ID") @ApiModelProperty("用户密码")
private Integer userId; private String password;
@ApiModelProperty("用户名称") @ApiModelProperty("用户手机")
private String username; private String mobile;
@ApiModelProperty("用户密码") public UserEntity()
private String password; {
@ApiModelProperty("用户手机") }
private String mobile;
public UserEntity(Integer userId, String username, String password, String mobile)
public UserEntity() {
{ this.userId = userId;
this.username = username;
} this.password = password;
this.mobile = mobile;
public UserEntity(Integer userId, String username, String password, String mobile) }
{
this.userId = userId; public Integer getUserId()
this.username = username; {
this.password = password; return userId;
this.mobile = mobile; }
}
public void setUserId(Integer userId)
public Integer getUserId() {
{ this.userId = userId;
return userId; }
}
public String getUsername()
public void setUserId(Integer userId) {
{ return username;
this.userId = userId; }
}
public void setUsername(String username)
public String getUsername() {
{ this.username = username;
return username; }
}
public String getPassword()
public void setUsername(String username) {
{ return password;
this.username = username; }
}
public void setPassword(String password)
public String getPassword() {
{ this.password = password;
return password; }
}
public String getMobile()
public void setPassword(String password) {
{ return mobile;
this.password = password; }
}
public void setMobile(String mobile)
public String getMobile() {
{ this.mobile = mobile;
return mobile; }
} }
public void setMobile(String mobile)
{
this.mobile = mobile;
}
}

View File

@ -1,172 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain_yada.*;
import com.ruoyi.system.service_yada.IAorestCoverageService;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.ThematicMapService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.InputStream;
import java.security.Guard;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.List;
/**
* 森林覆盖率
*/
@RestController
@RequestMapping(value = "/business-service/api/Aorest", produces = "application/json;charset=UTF-8")
@Api(tags = "森林覆盖率")
public class AorestCoverageController {
@Resource
private IAorestCoverageService service;
@Resource
private ThematicMapService thematicMapService;
/**
* 查询方法
* 需要查询的字段参数
* @return 参数类
*/
@RequestMapping(value = "/selectAorestCoverage",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectAorestCoverage()
{
List<AorestCoverageVO> eastVOSList= service.selectAorestCoverage();
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelAorestCoverage",method = {RequestMethod.DELETE})
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
public AjaxResult DelAorestCoverage(@Param("ID") String ID)
{
int NUM = service.DelAorestCoverage(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@RequestMapping(value = "/IntoAorestCoverage",method = {RequestMethod.POST})
@ApiOperation(value = "新增方法",httpMethod = "POST")
public AjaxResult IntoAorestCoverage(@RequestBody AorestCoverageVO eastVOS)
{
try {
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = service.IntoAorestCoverage(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error();
}
}
/**
* 上传文件
* @return 状态码
*/
@RequestMapping(value = "/IntoUpLoad",method = {RequestMethod.POST})
@ApiOperation(value = "上传文件",httpMethod = "POST")
public AjaxResult IntoUpload(@RequestBody MultipartFile file)
{
UploadFile upload=new UploadFile();
ThematicMapDomain domain=new ThematicMapDomain();
UploadFile value= null;
try {
value = uploadFile(file,upload);
} catch (Exception e) {
e.printStackTrace();
}
int NUM = service.IntoUpload(value);
domain.setPictureCode(value.getFileId());
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 文件查询
* @param response
* @param request 客户端请求
* @return
*/
@RequestMapping(value = "/selectUpload",method = {RequestMethod.GET})
@ApiOperation(value = "文件查询",httpMethod = "GET")
public AjaxResult selectUpload(HttpServletResponse response, HttpServletRequest request,@RequestBody UploadFile upload)
{
List<UploadFile> eastVOSList= service.selectUpload(upload.getFileId(),upload.getFileName());
return AjaxResult.success(eastVOSList);
}
public UploadFile uploadFile(MultipartFile file,UploadFile upload) throws Exception
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
upload.setFileId(String.valueOf(System.currentTimeMillis()));
upload.setFileName(file.getOriginalFilename());
upload.setFilePath(fileName);
upload.setFileSize(String.valueOf(file.getSize()));
upload.setCreateTime(LocalDateTime.now());
return upload;
}
@RequestMapping(value = "/Dictionary")
@ApiOperation(value = "字典查询",httpMethod = "POST")
public AjaxResult Dictionary(@RequestBody Dictionary dic)
{
List<Dictionary> diclist=service.selectDic(dic.getCodingType(),dic.getCodingType1(), dic.getCodingType2());
return AjaxResult.success(diclist);
}
}

View File

@ -1,81 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 澳大利亚中东部地区
*/
@RestController
@RequestMapping(value = "/business-service/api/Australia", produces = "application/json;charset=UTF-8")
@Api(tags = "澳大利亚中东部地区")
public class AustraliaMiddleEastController
{
@Resource
private IAustraliaMiddleEastService australiaMiddleEastService;
/**
* 查询方法
* @return 实体类
*/
@ApiOperation(value = "查询方法",httpMethod = "GET")
@RequestMapping(value = "/SelectAustralia",method = {RequestMethod.GET})
public AjaxResult SelectAustralia(@RequestBody AustraliaMiddleEastVO eastVO )
{
List<AustraliaMiddleEastVO> eastVOSList= australiaMiddleEastService.selectAustralia(eastVO.getYearMonth(),eastVO.getMonth());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelAustralia",method = {RequestMethod.DELETE})
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
public AjaxResult DelAustralia(@Param("ID") String ID)
{
int NUM = australiaMiddleEastService.DelAustralia(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@RequestMapping(value = "/IntoAustralia",method = {RequestMethod.POST})
@ApiOperation(value = "新增方法",httpMethod = "POST")
public AjaxResult IntoAustralia(@RequestBody AustraliaMiddleEastVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = australiaMiddleEastService.IntoAustralia(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,85 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.GlobalTypeVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IGlobalTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
*全球各类型占比
*/
@RestController
@RequestMapping("/monitor/clobal")
@Api(tags = "全球各类型占比")
public class GlobalTypeController {
@Resource
private IGlobalTypeService typeService;
/**
* 查询方法
* @param response 响应头
* @param request 客户端请求
* @return 参数类
*/
@RequestMapping(value = "/selectGlobalType",method = {RequestMethod.POST})
@ApiOperation(value = "查询方法",httpMethod = "POST")
public AjaxResult selectGlobalType(HttpServletResponse response, HttpServletRequest request,@RequestBody GlobalTypeVO TypeVO)
{
List<GlobalTypeVO> eastVOSList= typeService.selectGlobalType(TypeVO.getTypeName(),TypeVO.getParticularYear());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelGlobalType",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelGlobalType(@Param("ID") String ID)
{
int NUM = typeService.DelGlobalType(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoGlobalType",method = {RequestMethod.POST})
public AjaxResult IntoGlobalType(@RequestBody GlobalTypeVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = typeService.IntoGlobalType(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,83 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.OceanTemperatureVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IOceanTemperatureService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 海洋表面温度监测
*/
@Api(tags = "海洋表面温度监测")
@RestController
@RequestMapping(value = "/business-service/api/Ocean", produces = "application/json;charset=UTF-8")
public class OceanTemperatureController {
@Resource
private IOceanTemperatureService temperatureService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/selectOcean",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectOcean(@RequestBody OceanTemperatureVO temperatureVO)
{
List<OceanTemperatureVO> eastVOSList= temperatureService.selectOcean(temperatureVO.getStartDate());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelOcean",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelOcean(@Param("ID") String ID)
{
int NUM = temperatureService.DelOcean(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoAustralia",method = {RequestMethod.POST})
public AjaxResult IntoOcean(@RequestBody OceanTemperatureVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = temperatureService.IntoOcean(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,81 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.service_yada.IRegionVGIService;
import com.ruoyi.system.domain_yada.RegionVGIVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 各区域VGI
*/
@Api(tags = "各区域VGI")
@RestController
@RequestMapping(value = "/business-service/api/orderMng", produces = "application/json;charset=UTF-8")
public class RegionVGIController
{
@Resource
private IRegionVGIService regionVGIService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/SelectRegion",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult SelectRegion()
{
List<RegionVGIVO> vgivost= regionVGIService.selectRegion();
return AjaxResult.success(vgivost);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelRegion",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelRegion(@Param("ID") String ID)
{
int NUM = regionVGIService.DelRegion(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param vgivo 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoRegion",method = {RequestMethod.POST})
public AjaxResult IntoRegion(@RequestBody RegionVGIVO vgivo)
{
vgivo.setCreatedTime(LocalDateTime.now());
int NUM = regionVGIService.IntoRegion(vgivo);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,76 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.RegionVGIVO;
import com.ruoyi.system.domain_yada.RegionalSystemVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IRegionalSystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
* 区域生态系统
*/
@Api(tags = "区域生态系统")
@RestController
@RequestMapping(value = "/business-service/api/Regional", produces = "application/json;charset=UTF-8")
public class RegionalSystemController {
@Resource
private IRegionalSystemService systemService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/selectRegional",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectRegional(@RequestParam("region") String region)
{
List<RegionalSystemVO> eastVOSList= systemService.selectRegional(region);
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelRegional",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelRegional(@RequestParam("ID") String ID)
{
int NUM = systemService.DelRegional(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoRegional",method = {RequestMethod.POST})
public AjaxResult IntoRegional(@RequestBody RegionalSystemVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = systemService.IntoRegional(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,330 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.WeatherUtils;
import com.ruoyi.system.domain_yada.*;
import com.ruoyi.system.service_yada.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jdk.jfr.Frequency;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.spring.web.json.Json;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.http.HttpRequest;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "/Special")
@Api(tags = "模板导入")
public class SpecialController {
@Resource
private IRegionVGIService regionVGIService;
@Resource
private IAustraliaMiddleEastService australiaMiddleEastService;
@Resource
private IAorestCoverageService service;
@Resource
private IVegetationCoverageService coverageService;
@Resource
private IRegionalSystemService systemService;
/**
*/
@RequestMapping(value = "/helpSaveExcel")
private AjaxResult helpSaveExcel(@RequestBody MultipartFile file) {
List<RegionVGIVO> value = saveExcel(file);
return IntoRegion(value);
}
@RequestMapping(value = "/helpWeatherClass",method = {RequestMethod.GET})
public AjaxResult helpWeatherClass(String city,String type)
{
String url="https://restapi.amap.com/v3/weather/weatherInfo";
Map<String,String> map=new HashMap<>();
map.put("key","37087f0a3007dc67d37859553cd02d33");
map.put("city",city);
if (type!=null){ map.put("extensions",type);}
map.put("output","json");
String value= WeatherUtils.httpRequest(url,map);
WeatherUtilsVO vo = JSON.parseObject(value,WeatherUtilsVO.class);
// String value2=vo.getForecasts().substring(1,vo.getForecasts().length()-1);
// System.out.println(value2);
// vo.setForecast(JSON.parseObject(value2,ForecastVo.class));
// JSONObject userJson=JSONObject.parseObject(value);
// WeatherUtilsVO utilsValue= JSON.toJavaObject(userJson,WeatherUtilsVO.class);
return AjaxResult.success(vo);
} /**
* 森林覆盖率模板导入
*/
@RequestMapping(value = "/helpExcelAorest")
private AjaxResult helpExcelAorest(@RequestBody MultipartFile file) {
List<AorestCoverageVO> value = saveExcelAorest(file);
return IntoAorestCoverage(value);
}
/**
*平均植被覆盖度和净初级生产力
*/
@RequestMapping(value = "/helpExcelnpp")
private AjaxResult helpExcelnpp(@RequestBody MultipartFile file) {
List<VegetationCoverageVO> value = saveExcelnpp(file);
return IntoVegetation(value);
}
/**
* 澳大利亚中部地区模板导入
*/
@RequestMapping(value = "/helpExcelAus")
private AjaxResult helpExcelAus(@RequestBody MultipartFile file) {
List<AustraliaMiddleEastVO> value = saveExcelAus(file);
return IntoAustralia(value);
}
/**
* 区域生态系统类型转移
*/
@RequestMapping(value = "/helpExcelRegion")
private AjaxResult helpExcelRegion(@RequestBody MultipartFile file) {
List<RegionalSystemVO> value = saveExcelRegion(file);
return IntoRegional(value);
}
public AjaxResult IntoRegional(List<RegionalSystemVO> eastVOS)
{
try {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
systemService.IntoRegional(eastVOS.get(i));
}
return AjaxResult.success();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error(E.getMessage());
}
}
public AjaxResult IntoAustralia(List<AustraliaMiddleEastVO> eastVOS) {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
australiaMiddleEastService.IntoAustralia(eastVOS.get(i));
}
return AjaxResult.success();
}
public AjaxResult IntoRegion(List<RegionVGIVO> vgivo) {
for (int i = 0; i < vgivo.size(); i++) {
vgivo.get(i).setCreatedTime(LocalDateTime.now());
regionVGIService.IntoRegion(vgivo.get(i));
}
return AjaxResult.success();
}
public AjaxResult IntoAorestCoverage(List<AorestCoverageVO> eastVOS)
{
try {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
service.IntoAorestCoverage(eastVOS.get(i));
}
return AjaxResult.success();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error(E.getMessage());
}
}
public AjaxResult IntoVegetation(List<VegetationCoverageVO> eastVOS)
{
try {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
coverageService.IntoVegetation(eastVOS.get(i));
}
return AjaxResult.success();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error(E.getMessage());
}
}
private List<RegionVGIVO> saveExcel(MultipartFile file) {
try {
List<RegionVGIVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
RegionVGIVO value = new RegionVGIVO();
Row row = sheet.getRow(i);
value.setCreatedTime(LocalDateTime.now());
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setForest(Double.parseDouble(row.getCell(2).toString()));
value.setGrassland(Double.parseDouble(row.getCell(3).toString()));
value.setParticularYear(row.getCell(4).toString());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<AustraliaMiddleEastVO> saveExcelAus(MultipartFile file) {
try {
List<AustraliaMiddleEastVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
AustraliaMiddleEastVO value = new AustraliaMiddleEastVO();
Row row = sheet.getRow(i);
value.setYearMonth(row.getCell(0).toString());
value.setMonth(row.getCell(1).toString());
value.setSstAnomalyIndex(Double.parseDouble(row.getCell(2).toString()));
value.setTemperatureAnomolies(Double.parseDouble(row.getCell(3).toString()));
value.setPrecipitationAnomolies(Double.parseDouble(row.getCell(4).toString()));
value.setVaiAnomolies(Double.parseDouble(row.getCell(5).toString()));
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<AorestCoverageVO> saveExcelAorest(MultipartFile file) {
try {
List<AorestCoverageVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
AorestCoverageVO value = new AorestCoverageVO();
Row row = sheet.getRow(i);
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setProtectedLands(Double.parseDouble(row.getCell(2).toString()));
value.setNonProtectedLands(Double.parseDouble(row.getCell(3).toString()));
value.setMountain(Double.parseDouble(row.getCell(4).toString()));
value.setNonMountain(Double.parseDouble(row.getCell(5).toString()));
value.setCreateTime(LocalDateTime.now());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<VegetationCoverageVO> saveExcelnpp(MultipartFile file) {
try {
List<VegetationCoverageVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
VegetationCoverageVO value = new VegetationCoverageVO();
Row row = sheet.getRow(i);
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setProtectedLands(Double.parseDouble(row.getCell(4).toString()));
value.setNonProtectedLands(Double.parseDouble(row.getCell(5).toString()));
value.setMountain(Double.parseDouble(row.getCell(2).toString()));
value.setNonMountain(Double.parseDouble(row.getCell(3).toString()));
value.setCreateTime(LocalDateTime.now());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<RegionalSystemVO> saveExcelRegion(MultipartFile file) {
try {
List<RegionalSystemVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
RegionalSystemVO value = new RegionalSystemVO();
Row row = sheet.getRow(i);
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setTypeConversion(row.getCell(2).toString());
value.setTypeconversionEn(row.getCell(3).toString());
value.setProportionOfChangedAreas(Double.parseDouble(row.getCell(4).toString()));
value.setCreateTime(LocalDateTime.now());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}

View File

@ -1,92 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain_yada.ThematicMapDomain;
import com.ruoyi.system.service_yada.ThematicMapService;
import io.swagger.annotations.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 专题图模块
* @author taco chen
*/
@RestController
@RequestMapping(value = "/thematic-map")
@Api(tags = "专题图模块")
public class ThematicMapController {
@Resource
private ThematicMapService thematicMapService;
/**
* 查询方法
* @param response 响应头
* @return 参数类
*/
@ApiOperation("获取所有专题图")
@ApiImplicitParams({})
@ApiResponses({
@ApiResponse(code =200,message = "请求成功"),
@ApiResponse(code =401,message = "没有认证"),
@ApiResponse(code =403,message = "权限不足"),
@ApiResponse(code =404,message = "未找到")
})
@RequestMapping(value = "/get/all",method = {RequestMethod.POST})
public AjaxResult selectAllThematicMap(HttpServletResponse response,@RequestBody ThematicMapDomain thematicMapDomain)
{
List<ThematicMapDomain> res= thematicMapService.selectAll(thematicMapDomain.getPictureType(),
thematicMapDomain.getPictureTypeOne(),thematicMapDomain.getPictureTypeTwo());
return AjaxResult.success(res);
}
/**
* 删除方法
* @param id id
* @return 状态码
*/
@RequestMapping(value = "/delete",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "long", paramType = "path", dataTypeClass = long.class)
public AjaxResult deleteThematicMap(@Param("id") Long id)
{
int num = thematicMapService.deleteById(id);
if (num>0) {
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param thematicMapDomain 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/add",method = {RequestMethod.POST})
public AjaxResult saveThematicMap(@RequestBody ThematicMapDomain thematicMapDomain)
{
thematicMapDomain.setCreatedTime(LocalDateTime.now());
int num = thematicMapService.save(thematicMapDomain);
if (num>0) {
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,84 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.UrbanVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IUrbanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 中国城市监测
*/
@Api(tags = "中国城市监测")
@RestController
@RequestMapping(value = "/business-service/api/Urban", produces = "application/json;charset=UTF-8")
public class UrbanController {
@Resource
private IUrbanService urbanService;
/**
* 查询方法
* @param response 响应头
* @param request 客户端请求
* @return 参数类
*/
@RequestMapping(value = "/selectUrban",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectUrban(HttpServletResponse response, HttpServletRequest request,@RequestBody UrbanVO urbanVO)
{
List<UrbanVO> eastVOSList= urbanService.selectUrban(urbanVO.getName(),urbanVO.getParticularYear());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelUrban",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
public AjaxResult DelUrban(@Param("ID") String ID)
{
int NUM = urbanService.DelUrban(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoUrban",method = {RequestMethod.POST})
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "long", paramType = "path", dataTypeClass = long.class)
public AjaxResult IntoUrban(@RequestBody UrbanVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = urbanService.IntoUrban(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,82 +0,0 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.VegetationCoverageVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IVegetationCoverageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 平均植被覆盖度和净初级生产力
*/
@Api(tags = "平均植被覆盖度和净初级生产力")
@RestController
@RequestMapping(value = "/business-service/api/Vegetation", produces = "application/json;charset=UTF-8")
public class VegetationCoverageController {
@Resource
private IVegetationCoverageService coverageService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/selectVegetation",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectVegetation()
{
List<VegetationCoverageVO> eastVOSList= coverageService.selectVegetation();
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelVegetation",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "long", paramType = "path", dataTypeClass = long.class)
public AjaxResult DelVegetation(@Param("ID") String ID)
{
int NUM = coverageService.DelVegetation(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoVegetation",method = {RequestMethod.POST})
public AjaxResult IntoVegetation(@RequestBody VegetationCoverageVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = coverageService.IntoVegetation(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,125 +1,125 @@
package com.ruoyi.web.core.config; package com.ruoyi.web.core.config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiKey;
import springfox.documentation.service.ApiKey; import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.Contact;
import springfox.documentation.service.Contact; import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityReference; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.service.SecurityScheme; import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.swagger2.annotations.EnableSwagger2;
import springfox.documentation.spring.web.plugins.Docket;
/**
/** * Swagger2的接口配置
* Swagger2的接口配置 *
* * @author ruoyi
* @author ruoyi */
*/ @Configuration
@Configuration @EnableSwagger2
public class SwaggerConfig public class SwaggerConfig
{ {
/** 系统基础配置 */ /** 系统基础配置 */
@Autowired @Autowired
private RuoYiConfig ruoyiConfig; private RuoYiConfig ruoyiConfig;
/** 是否开启swagger */ /** 是否开启swagger */
@Value("${swagger.enabled}") @Value("${swagger.enabled}")
private boolean enabled; private boolean enabled;
/** 设置请求的统一前缀 */ /** 设置请求的统一前缀 */
@Value("${swagger.pathMapping}") @Value("${swagger.pathMapping}")
private String pathMapping; private String pathMapping;
/** /**
* 创建API * 创建API
*/ */
@Bean @Bean
public Docket createRestApi() public Docket createRestApi()
{ {
return new Docket(DocumentationType.OAS_30) return new Docket(DocumentationType.SWAGGER_2)
// 是否启用Swagger // 是否启用Swagger
.enable(enabled) .enable(enabled)
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息 // 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo()) .apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示 // 设置哪些接口暴露给Swagger展示
.select() .select()
// 扫描所有有注解的api用这种方式更灵活 // 扫描所有有注解的api用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解 // 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
// 扫描所有 .apis(RequestHandlerSelectors.any()) // 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()) .paths(PathSelectors.any())
.build() .build()
/* 设置安全模式swagger可以设置访问token */ /* 设置安全模式swagger可以设置访问token */
.securitySchemes(securitySchemes()) .securitySchemes(securitySchemes())
.securityContexts(securityContexts()) .securityContexts(securityContexts())
.pathMapping(pathMapping); .pathMapping(pathMapping);
} }
/** /**
* 安全模式这里指定token通过Authorization头请求头传递 * 安全模式这里指定token通过Authorization头请求头传递
*/ */
private List<SecurityScheme> securitySchemes() private List<ApiKey> securitySchemes()
{ {
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); List<ApiKey> apiKeyList = new ArrayList<ApiKey>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeyList; return apiKeyList;
} }
/** /**
* 安全上下文 * 安全上下文
*/ */
private List<SecurityContext> securityContexts() private List<SecurityContext> securityContexts()
{ {
List<SecurityContext> securityContexts = new ArrayList<>(); List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add( securityContexts.add(
SecurityContext.builder() SecurityContext.builder()
.securityReferences(defaultAuth()) .securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern().matches("/.*")) .forPaths(PathSelectors.regex("^(?!auth).*$"))
.build()); .build());
return securityContexts; return securityContexts;
} }
/** /**
* 默认的安全上引用 * 默认的安全上引用
*/ */
private List<SecurityReference> defaultAuth() private List<SecurityReference> defaultAuth()
{ {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope; authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>(); List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences; return securityReferences;
} }
/** /**
* 添加摘要信息 * 添加摘要信息
*/ */
private ApiInfo apiInfo() private ApiInfo apiInfo()
{ {
// 用ApiInfoBuilder进行定制 // 用ApiInfoBuilder进行定制
return new ApiInfoBuilder() return new ApiInfoBuilder()
// 设置标题 // 设置标题
.title("标题若依管理系统_接口文档") .title("标题若依管理系统_接口文档")
// 描述 // 描述
.description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
// 作者信息 // 作者信息
.contact(new Contact(ruoyiConfig.getName(), null, null)) .contact(new Contact(ruoyiConfig.getName(), null, null))
// 版本 // 版本
.version("版本号:" + ruoyiConfig.getVersion()) .version("版本号:" + ruoyiConfig.getVersion())
.build(); .build();
} }
} }

View File

@ -1 +0,0 @@
com.ruoyi.framework.web.service.CaptchaRedisService

View File

@ -1,62 +1,57 @@
# 数据源配置 # 数据源配置
spring: spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
# driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
driver-class-name: org.postgresql.Driver druid:
druid: # 主库数据源
master: master:
#url: jdbc:postgresql://47.243.79.66:5432/yada?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#url: jdbc:postgresql://192.168.2.9:5432/yada?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai username: root
# username: postgres password: password
# password: postgres # 从库数据源
url: jdbc:postgresql://118.195.242.28:5432/yada?AllowPublicKeyRetrieval=True&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai slave:
username: gty # 从数据源开关/默认关闭
password: 308525 enabled: false
# 从库数据源 url:
slave: username:
# 从数据源开关/默认关闭 password:
enabled: false # 初始连接数
url: initialSize: 5
username: # 最小连接池数量
password: minIdle: 10
# 初始连接数 # 最大连接池数量
initialSize: 5 maxActive: 20
# 最小连接池数量 # 配置获取连接等待超时的时间
minIdle: 10 maxWait: 60000
# 最大连接池数量 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
maxActive: 20 timeBetweenEvictionRunsMillis: 60000
# 配置获取连接等待超时的时间 # 配置一个连接在池中最小生存的时间,单位是毫秒
maxWait: 60000 minEvictableIdleTimeMillis: 300000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 # 配置一个连接在池中最大生存的时间,单位是毫秒
timeBetweenEvictionRunsMillis: 60000 maxEvictableIdleTimeMillis: 900000
# 配置一个连接在池中最小生存的时间,单位是毫秒 # 配置检测连接是否有效
minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL
# 配置一个连接在池中最大生存的时间,单位是毫秒 testWhileIdle: true
maxEvictableIdleTimeMillis: 900000 testOnBorrow: false
# 配置检测连接是否有效select * from pg_stat_activity testOnReturn: false
# validationQuery: SELECT 1 FROM DUAL webStatFilter:
validationQuery: SELECT version() enabled: true
testWhileIdle: true statViewServlet:
testOnBorrow: false enabled: true
testOnReturn: false # 设置白名单,不填则允许所有访问
webStatFilter: allow:
enabled: true url-pattern: /druid/*
statViewServlet: # 控制台管理用户名和密码
enabled: true login-username:
# 设置白名单,不填则允许所有访问 login-password:
allow: filter:
url-pattern: /druid/* stat:
# 控制台管理用户名和密码 enabled: true
login-username: ruoyi # 慢SQL记录
login-password: 123456 log-slow-sql: true
filter: slow-sql-millis: 1000
stat: merge-sql: true
enabled: true wall:
# 慢SQL记录 config:
log-slow-sql: true multi-statement-allow: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true

View File

@ -1,138 +1,119 @@
# 项目相关配置 # 项目相关配置
ruoyi: ruoyi:
# 名称 # 名称
name: RuoYi name: RuoYi
# 版本 # 版本
version: 3.4.0 version: 3.1.0
# 版权年份 # 版权年份
copyrightYear: 2021 copyrightYear: 2019
# 实例演示开关 # 实例演示开关
demoEnabled: true demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath # 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: /home/gty/ruoyi/uploadPath profile: D:/ruoyi/uploadPath
# 获取ip地址开关 # 获取ip地址开关
addressEnabled: false addressEnabled: false
# 验证码类型 math 数组计算 char 字符验证 # 验证码类型 math 数组计算 char 字符验证
captchaType: math captchaType: math
# 开发环境配置 # 开发环境配置
server: server:
# 服务器的HTTP端口默认为8080 # 服务器的HTTP端口默认为8080
port: 8080 port: 8080
#port: 6061 servlet:
servlet: # 应用的访问路径
# 应用的访问路径 context-path: /
context-path: / tomcat:
tomcat: # tomcat的URI编码
# tomcat的URI编码 uri-encoding: UTF-8
uri-encoding: UTF-8 # tomcat最大线程数默认为200
# tomcat最大线程数默认为200 max-threads: 800
max-threads: 800 # Tomcat启动初始化的线程数默认值25
# Tomcat启动初始化的线程数默认值25 min-spare-threads: 30
min-spare-threads: 30
# 日志配置
# 日志配置 logging:
logging: level:
level: com.ruoyi: debug
com.ruoyi: debug org.springframework: warn
org.springframework: warn
# Spring配置
# Spring配置 spring:
spring: # 资源信息
# 资源信息 messages:
messages: # 国际化资源文件路径
# 国际化资源文件路径 basename: i18n/messages
basename: i18n/messages profiles:
profiles: active: druid
active: druid # 文件上传
# 文件上传 servlet:
servlet: multipart:
multipart: # 单个文件大小
# 单个文件大小 max-file-size: 10MB
max-file-size: 10MB # 设置总上传的文件大小
# 设置总上传的文件大小 max-request-size: 20MB
max-request-size: 20MB # 服务模块
# 服务模块 devtools:
devtools: restart:
restart: # 热部署开关
# 热部署开关 enabled: true
enabled: true # redis 配置
# redis 配置 redis:
redis: # 地址
# 地址 host: localhost
host: localhost # 端口默认为6379
# 端口默认为6379 port: 6379
port: 6379 # 密码
# 数据库索引 password:
database: 0 # 连接超时时间
# 密码 timeout: 10s
password: '*&jkjusWETO(^ses%i' lettuce:
# 连接超时时间 pool:
timeout: 10s # 连接池中的最小空闲连接
lettuce: min-idle: 0
pool: # 连接池中的最大空闲连接
# 连接池中的最小空闲连接 max-idle: 8
min-idle: 0 # 连接池的最大数据库连接数
# 连接池中的最大空闲连接 max-active: 8
max-idle: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制)
# 连接池的最大数据库连接数 max-wait: -1ms
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制) # token配置
max-wait: -1ms token:
# 令牌自定义标识
# token配置 header: Authorization
token: # 令牌密钥
# 令牌自定义标识 secret: abcdefghijklmnopqrstuvwxyz
header: Authorization # 令牌有效期默认30分钟
# 令牌密钥 expireTime: 30
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期默认30分钟 # MyBatis配置
expireTime: 300 mybatis:
# 搜索指定包别名
# MyBatis配置 typeAliasesPackage: com.ruoyi.**.domain
mybatis: # 配置mapper的扫描找到所有的mapper.xml映射文件
# 搜索指定包别名 mapperLocations: classpath*:mapper/**/*Mapper.xml
typeAliasesPackage: com.ruoyi.**.domain # 加载全局的配置文件
# 配置mapper的扫描找到所有的mapper.xml映射文件 configLocation: classpath:mybatis/mybatis-config.xml
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件 # PageHelper分页插件
configLocation: classpath:mybatis/mybatis-config.xml pagehelper:
helperDialect: mysql
# PageHelper分页插件 reasonable: true
pagehelper: supportMethodsArguments: true
helperDialect: mysql params: count=countSql
reasonable: true
supportMethodsArguments: true # Swagger配置
params: count=countSql swagger:
# 是否开启swagger
# Swagger配置 enabled: true
swagger: # 请求前缀
# 是否开启swagger pathMapping: /dev-api
enabled: true
# 请求前缀 # 防止XSS攻击
pathMapping: /dev-api xss:
# 过滤开关
# 滑块验证码 enabled: true
aj: # 排除链接(多个用逗号分隔)
captcha: excludes: /system/notice/*
cache-type: redis # 匹配链接
# blockPuzzle 滑块 clickWord 文字点选 default默认两者都实例化 urlPatterns: /system/*,/monitor/*,/tool/*
type: blockPuzzle
# 右下角显示字
water-mark: ruoyi.vip
# 校验滑动拼图允许误差偏移量(默认5像素)
slip-offset: 5
# aes加密坐标开启或者禁用(true|false)
aes-status: true
# 滑动干扰项(0/1/2)
interference-options: 2
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice/*
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*

View File

@ -1,6 +1,24 @@
_ Application Version: ${ruoyi.version}
( ) Spring Boot Version: ${spring-boot.version}
| |/') _ __ ___ ////////////////////////////////////////////////////////////////////
(`\/')| , < ( '__)/',__) // _ooOoo_ //
> < | |\`\ | | \__, \ // o8888888o //
(_/\_)(_) (_)(_) (____/ // 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////

View File

@ -1,37 +1,36 @@
#错误消息 #错误消息
not.null=* 必须填写 not.null=* 必须填写
user.jcaptcha.error=验证码错误 user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效 user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误 user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误 user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次 user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次帐户锁定10分钟 user.password.retry.limit.exceed=密码输入错误{0}次帐户锁定10分钟
user.password.delete=对不起,您的账号已被删除 user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员 user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员 role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功 user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间 length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成且必须以非数字开头 user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成且必须以非数字开头
user.password.not.valid=* 5-50个字符 user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误 user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误 user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功 user.login.success=登录成功
user.register.success=注册成功 user.notfound=请重新登录
user.notfound=请重新登录 user.forcelogout=管理员强制退出,请重新登录
user.forcelogout=管理员强制退出,请重新登录 user.unknown.error=未知错误,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
##文件上传消息 upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB upload.filename.exceed.length=上传的文件名最长{0}个字符
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
##权限 no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]

View File

@ -1,93 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration> <configuration>
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="/home/ruoyi/logs" /> <property name="log.path" value="/home/ruoyi/logs" />
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 --> <!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
</appender> </appender>
<!-- 系统日志输出 --> <!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file> <file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 --> <!-- 过滤的级别 -->
<level>INFO</level> <level>INFO</level>
<!-- 匹配时的操作:接收(记录) --> <!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch> <onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) --> <!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch> <onMismatch>DENY</onMismatch>
</filter> </filter>
</appender> </appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file> <file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 --> <!-- 过滤的级别 -->
<level>ERROR</level> <level>ERROR</level>
<!-- 匹配时的操作:接收(记录) --> <!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch> <onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) --> <!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch> <onMismatch>DENY</onMismatch>
</filter> </filter>
</appender> </appender>
<!-- 用户访问日志输出 --> <!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file> <file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily --> <!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
</appender> </appender>
<!-- 系统模块日志级别控制 --> <!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" /> <logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 --> <!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" /> <logger name="org.springframework" level="warn" />
<root level="info"> <root level="info">
<appender-ref ref="console" /> <appender-ref ref="console" />
</root> </root>
<!--系统操作日志--> <!--系统操作日志-->
<root level="info"> <root level="info">
<appender-ref ref="file_info" /> <appender-ref ref="file_info" />
<appender-ref ref="file_error" /> <appender-ref ref="file_error" />
</root> </root>
<!--系统用户操作日志--> <!--系统用户操作日志-->
<logger name="sys-user" level="info"> <logger name="sys-user" level="info">
<appender-ref ref="sys-user"/> <appender-ref ref="sys-user"/>
</logger> </logger>
</configuration> </configuration>

View File

@ -1,20 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration <!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <configuration>
<!-- 全局参数 -->
<settings> <settings>
<!-- 使全局的映射器启用或禁用缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 全局映射器启用缓存 -->
<setting name="cacheEnabled" value="true" /> <setting name="useGeneratedKeys" value="true" /> <!-- 允许 JDBC 支持自动生成主键 -->
<!-- 允许JDBC 支持自动生成主键 --> <setting name="defaultExecutorType" value="REUSE" /> <!-- 配置默认的执行器 -->
<setting name="useGeneratedKeys" value="true" /> <setting name="logImpl" value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 -->
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 --> <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> 驼峰式命名 -->
<setting name="defaultExecutorType" value="SIMPLE" /> </settings>
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" /> </configuration>
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>3.8.2</version> <version>3.1.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -43,8 +43,8 @@
<!-- 自定义验证注解 --> <!-- 自定义验证注解 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>javax.validation</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>validation-api</artifactId>
</dependency> </dependency>
<!--常用工具类 --> <!--常用工具类 -->
@ -89,18 +89,12 @@
<artifactId>snakeyaml</artifactId> <artifactId>snakeyaml</artifactId>
</dependency> </dependency>
<!-- Token生成与解析--> <!--Token生成与解析-->
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
</dependency> </dependency>
<!-- Jaxb -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<!-- redis 缓存操作 --> <!-- redis 缓存操作 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -4,10 +4,6 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
/** /**
* 自定义导出Excel数据注解 * 自定义导出Excel数据注解
@ -34,7 +30,7 @@ public @interface Excel
public String dateFormat() default ""; public String dateFormat() default "";
/** /**
* 如果是字典类型请设置字典的type值 (: sys_user_sex) * 如果是字典类型请设置字典的type值
*/ */
public String dictType() default ""; public String dictType() default "";
@ -49,14 +45,9 @@ public @interface Excel
public String separator() default ","; public String separator() default ",";
/** /**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) * 导出类型0数字 1字符串
*/ */
public int scale() default -1; public ColumnType cellType() default ColumnType.STRING;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/** /**
* 导出时在excel中每个列的高度 单位为字符 * 导出时在excel中每个列的高度 单位为字符
@ -98,52 +89,6 @@ public @interface Excel
*/ */
public String targetAttr() default ""; public String targetAttr() default "";
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
public boolean isStatistics() default false;
/**
* 导出类型0数字 1字符串
*/
public ColumnType cellType() default ColumnType.STRING;
/**
* 导出字体颜色
*/
public IndexedColors color() default IndexedColors.BLACK;
/**
* 导出字段对齐方式
*/
public HorizontalAlignment align() default HorizontalAlignment.CENTER;
/**
* 自定义数据处理器
*/
public Class<?> handler() default ExcelHandlerAdapter.class;
/**
* 自定义数据处理器参数
*/
public String[] args() default {};
public enum Align
{
AUTO(0), LEFT(1), CENTER(2), RIGHT(3);
private final int value;
Align(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
/** /**
* 字段类型0导出导入1仅导出2仅导入 * 字段类型0导出导入1仅导出2仅导入
*/ */
@ -167,7 +112,7 @@ public @interface Excel
public enum ColumnType public enum ColumnType
{ {
NUMERIC(0), STRING(1), IMAGE(2); NUMERIC(0), STRING(1);
private final int value; private final int value;
ColumnType(int value) ColumnType(int value)

View File

@ -14,5 +14,5 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface Excels public @interface Excels
{ {
public Excel[] value(); Excel[] value();
} }

View File

@ -38,9 +38,4 @@ public @interface Log
* 是否保存请求的参数 * 是否保存请求的参数
*/ */
public boolean isSaveRequestData() default true; public boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
public boolean isSaveResponseData() default true;
} }

View File

@ -1,40 +0,0 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.enums.LimitType;
/**
* 限流注解
*
* @author ruoyi
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
/**
* 限流key
*/
public String key() default Constants.RATE_LIMIT_KEY;
/**
* 限流时间,单位秒
*/
public int time() default 60;
/**
* 限流次数
*/
public int count() default 100;
/**
* 限流类型
*/
public LimitType limitType() default LimitType.DEFAULT;
}

View File

@ -19,13 +19,5 @@ import java.lang.annotation.Target;
@Documented @Documented
public @interface RepeatSubmit public @interface RepeatSubmit
{ {
/**
* 间隔时间(ms)小于此时间视为重复提交
*/
public int interval() default 5000;
/**
* 提示消息
*/
public String message() default "不允许重复提交,请稍候再试";
} }

View File

@ -30,9 +30,6 @@ public class RuoYiConfig
/** 获取地址开关 */ /** 获取地址开关 */
private static boolean addressEnabled; private static boolean addressEnabled;
/** 验证码类型 */
private static String captchaType;
public String getName() public String getName()
{ {
return name; return name;
@ -93,22 +90,6 @@ public class RuoYiConfig
RuoYiConfig.addressEnabled = addressEnabled; RuoYiConfig.addressEnabled = addressEnabled;
} }
public static String getCaptchaType() {
return captchaType;
}
public void setCaptchaType(String captchaType) {
RuoYiConfig.captchaType = captchaType;
}
/**
* 获取导入上传路径
*/
public static String getImportPath()
{
return getProfile() + "/import";
}
/** /**
* 获取头像上传路径 * 获取头像上传路径
*/ */

View File

@ -1,7 +1,5 @@
package com.ruoyi.common.constant; package com.ruoyi.common.constant;
import io.jsonwebtoken.Claims;
/** /**
* 通用常量信息 * 通用常量信息
* *
@ -49,11 +47,6 @@ public class Constants
*/ */
public static final String LOGOUT = "Logout"; public static final String LOGOUT = "Logout";
/**
* 注册
*/
public static final String REGISTER = "Register";
/** /**
* 登录失败 * 登录失败
*/ */
@ -68,17 +61,12 @@ public class Constants
* 登录用户 redis key * 登录用户 redis key
*/ */
public static final String LOGIN_TOKEN_KEY = "login_tokens:"; public static final String LOGIN_TOKEN_KEY = "login_tokens:";
/** /**
* 防重提交 redis key * 防重提交 redis key
*/ */
public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
/**
* 限流 redis key
*/
public static final String RATE_LIMIT_KEY = "rate_limit:";
/** /**
* 验证码有效期分钟 * 验证码有效期分钟
*/ */
@ -107,7 +95,7 @@ public class Constants
/** /**
* 用户名称 * 用户名称
*/ */
public static final String JWT_USERNAME = Claims.SUBJECT; public static final String JWT_USERNAME = "sub";
/** /**
* 用户头像 * 用户头像
@ -138,30 +126,4 @@ public class Constants
* 资源映射路径 前缀 * 资源映射路径 前缀
*/ */
public static final String RESOURCE_PREFIX = "/profile"; public static final String RESOURCE_PREFIX = "/profile";
/**
* RMI 远程方法调用
*/
public static final String LOOKUP_RMI = "rmi:";
/**
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap:";
/**
* LDAPS 远程方法调用
*/
public static final String LOOKUP_LDAPS = "ldaps:";
/**
* 定时任务白名单配置仅允许访问的包名如其他需要可以自行添加
*/
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
/**
* 定时任务违规的字符
*/
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "com.ruoyi.common.utils.file" };
} }

View File

@ -13,9 +13,6 @@ public class GenConstants
/** 树表(增删改查) */ /** 树表(增删改查) */
public static final String TPL_TREE = "tree"; public static final String TPL_TREE = "tree";
/** 主子表(增删改查) */
public static final String TPL_SUB = "sub";
/** 树编码字段 */ /** 树编码字段 */
public static final String TREE_CODE = "treeCode"; public static final String TREE_CODE = "treeCode";
@ -32,17 +29,15 @@ public class GenConstants
public static final String PARENT_MENU_NAME = "parentMenuName"; public static final String PARENT_MENU_NAME = "parentMenuName";
/** 数据库字符串类型 */ /** 数据库字符串类型 */
public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; public static final String[] COLUMNTYPE_STR = { "char", "varchar", "narchar", "varchar2", "tinytext", "text",
"mediumtext", "longtext" };
/** 数据库文本类型 */
public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
/** 数据库时间类型 */ /** 数据库时间类型 */
public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
/** 数据库数字类型 */ /** 数据库数字类型 */
public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
"bit", "bigint", "float", "double", "decimal" }; "bigint", "float", "float", "double", "decimal" };
/** 页面不需要编辑字段 */ /** 页面不需要编辑字段 */
public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
@ -79,15 +74,6 @@ public class GenConstants
/** 日期控件 */ /** 日期控件 */
public static final String HTML_DATETIME = "datetime"; public static final String HTML_DATETIME = "datetime";
/** 图片上传控件 */
public static final String HTML_IMAGE_UPLOAD = "imageUpload";
/** 文件上传控件 */
public static final String HTML_FILE_UPLOAD = "fileUpload";
/** 富文本控件 */
public static final String HTML_EDITOR = "editor";
/** 字符串类型 */ /** 字符串类型 */
public static final String TYPE_STRING = "String"; public static final String TYPE_STRING = "String";
@ -109,9 +95,6 @@ public class GenConstants
/** 模糊查询 */ /** 模糊查询 */
public static final String QUERY_LIKE = "LIKE"; public static final String QUERY_LIKE = "LIKE";
/** 相等查询 */
public static final String QUERY_EQ = "EQ";
/** 需要 */ /** 需要 */
public static final String REQUIRE = "1"; public static final String REQUIRE = "1";
} }

View File

@ -53,26 +53,8 @@ public class UserConstants
/** Layout组件标识 */ /** Layout组件标识 */
public final static String LAYOUT = "Layout"; public final static String LAYOUT = "Layout";
/** ParentView组件标识 */
public final static String PARENT_VIEW = "ParentView";
/** InnerLink组件标识 */
public final static String INNER_LINK = "InnerLink";
/** 校验返回结果码 */ /** 校验返回结果码 */
public final static String UNIQUE = "0"; public final static String UNIQUE = "0";
public final static String NOT_UNIQUE = "1"; public final static String NOT_UNIQUE = "1";
/**
* 用户名长度限制
*/
public static final int USERNAME_MIN_LENGTH = 2;
public static final int USERNAME_MAX_LENGTH = 20;
/**
* 密码长度限制
*/
public static final int PASSWORD_MIN_LENGTH = 5;
public static final int PASSWORD_MAX_LENGTH = 20;
} }

View File

@ -11,13 +11,10 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.PageDomain; import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport; import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil; import com.ruoyi.common.utils.sql.SqlUtil;
@ -28,7 +25,7 @@ import com.ruoyi.common.utils.sql.SqlUtil;
*/ */
public class BaseController public class BaseController
{ {
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
/** /**
* 将前台传递过来的日期格式的字符串自动转化为Date类型 * 将前台传递过来的日期格式的字符串自动转化为Date类型
@ -51,31 +48,17 @@ public class BaseController
* 设置请求分页数据 * 设置请求分页数据
*/ */
protected void startPage() protected void startPage()
{
PageUtils.startPage();
}
/**
* 设置请求排序数据
*/
protected void startOrderBy()
{ {
PageDomain pageDomain = TableSupport.buildPageRequest(); PageDomain pageDomain = TableSupport.buildPageRequest();
if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
{ {
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.orderBy(orderBy); PageHelper.startPage(pageNum, pageSize, orderBy);
} }
} }
/**
* 清理分页的线程变量
*/
protected void clearPage()
{
PageUtils.clearPage();
}
/** /**
* 响应请求分页数据 * 响应请求分页数据
*/ */
@ -90,38 +73,6 @@ public class BaseController
return rspData; return rspData;
} }
/**
* 返回成功
*/
public AjaxResult success()
{
return AjaxResult.success();
}
/**
* 返回失败消息
*/
public AjaxResult error()
{
return AjaxResult.error();
}
/**
* 返回成功消息
*/
public AjaxResult success(String message)
{
return AjaxResult.success(message);
}
/**
* 返回失败消息
*/
public AjaxResult error(String message)
{
return AjaxResult.error(message);
}
/** /**
* 响应返回结果 * 响应返回结果
* *
@ -133,17 +84,6 @@ public class BaseController
return rows > 0 ? AjaxResult.success() : AjaxResult.error(); return rows > 0 ? AjaxResult.success() : AjaxResult.error();
} }
/**
* 响应返回结果
*
* @param result 结果
* @return 操作结果
*/
protected AjaxResult toAjax(boolean result)
{
return result ? success() : error();
}
/** /**
* 页面跳转 * 页面跳转
*/ */
@ -151,36 +91,4 @@ public class BaseController
{ {
return StringUtils.format("redirect:{}", url); return StringUtils.format("redirect:{}", url);
} }
/**
* 获取用户缓存信息
*/
public LoginUser getLoginUser()
{
return SecurityUtils.getLoginUser();
}
/**
* 获取登录用户id
*/
public Long getUserId()
{
return getLoginUser().getUserId();
}
/**
* 获取登录部门id
*/
public Long getDeptId()
{
return getLoginUser().getDeptId();
}
/**
* 获取登录用户名
*/
public String getUsername()
{
return getLoginUser().getUsername();
}
} }

View File

@ -145,18 +145,4 @@ public class AjaxResult extends HashMap<String, Object>
{ {
return new AjaxResult(code, msg, null); return new AjaxResult(code, msg, null);
} }
/**
* 方便链式调用
*
* @param key
* @param value
* @return 数据对象
*/
@Override
public AjaxResult put(String key, Object value)
{
super.put(key, value);
return this;
}
} }

View File

@ -5,6 +5,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
/** /**
* Entity基类 * Entity基类
@ -35,6 +36,14 @@ public class BaseEntity implements Serializable
/** 备注 */ /** 备注 */
private String remark; private String remark;
/** 开始时间 */
@JsonIgnore
private String beginTime;
/** 结束时间 */
@JsonIgnore
private String endTime;
/** 请求参数 */ /** 请求参数 */
private Map<String, Object> params; private Map<String, Object> params;
@ -98,6 +107,26 @@ public class BaseEntity implements Serializable
this.remark = remark; this.remark = remark;
} }
public String getBeginTime()
{
return beginTime;
}
public void setBeginTime(String beginTime)
{
this.beginTime = beginTime;
}
public String getEndTime()
{
return endTime;
}
public void setEndTime(String endTime)
{
this.endTime = endTime;
}
public Map<String, Object> getParams() public Map<String, Object> getParams()
{ {
if (params == null) if (params == null)

View File

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.validation.constraints.Email; import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
@ -32,7 +31,7 @@ public class SysDept extends BaseEntity
private String deptName; private String deptName;
/** 显示顺序 */ /** 显示顺序 */
private Integer orderNum; private String orderNum;
/** 负责人 */ /** 负责人 */
private String leader; private String leader;
@ -97,13 +96,13 @@ public class SysDept extends BaseEntity
this.deptName = deptName; this.deptName = deptName;
} }
@NotNull(message = "显示顺序不能为空") @NotBlank(message = "显示顺序不能为空")
public Integer getOrderNum() public String getOrderNum()
{ {
return orderNum; return orderNum;
} }
public void setOrderNum(Integer orderNum) public void setOrderNum(String orderNum)
{ {
this.orderNum = orderNum; this.orderNum = orderNum;
} }

View File

@ -1,7 +1,6 @@
package com.ruoyi.common.core.domain.entity; package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
@ -58,7 +57,6 @@ public class SysDictType extends BaseEntity
@NotBlank(message = "字典类型不能为空") @NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
public String getDictType() public String getDictType()
{ {
return dictType; return dictType;

View File

@ -3,7 +3,6 @@ package com.ruoyi.common.core.domain.entity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
@ -31,7 +30,7 @@ public class SysMenu extends BaseEntity
private Long parentId; private Long parentId;
/** 显示顺序 */ /** 显示顺序 */
private Integer orderNum; private String orderNum;
/** 路由地址 */ /** 路由地址 */
private String path; private String path;
@ -39,15 +38,9 @@ public class SysMenu extends BaseEntity
/** 组件路径 */ /** 组件路径 */
private String component; private String component;
/** 路由参数 */
private String query;
/** 是否为外链0是 1否 */ /** 是否为外链0是 1否 */
private String isFrame; private String isFrame;
/** 是否缓存0缓存 1不缓存 */
private String isCache;
/** 类型M目录 C菜单 F按钮 */ /** 类型M目录 C菜单 F按钮 */
private String menuType; private String menuType;
@ -108,13 +101,13 @@ public class SysMenu extends BaseEntity
this.parentId = parentId; this.parentId = parentId;
} }
@NotNull(message = "显示顺序不能为空") @NotBlank(message = "显示顺序不能为空")
public Integer getOrderNum() public String getOrderNum()
{ {
return orderNum; return orderNum;
} }
public void setOrderNum(Integer orderNum) public void setOrderNum(String orderNum)
{ {
this.orderNum = orderNum; this.orderNum = orderNum;
} }
@ -141,16 +134,6 @@ public class SysMenu extends BaseEntity
this.component = component; this.component = component;
} }
public String getQuery()
{
return query;
}
public void setQuery(String query)
{
this.query = query;
}
public String getIsFrame() public String getIsFrame()
{ {
return isFrame; return isFrame;
@ -161,16 +144,6 @@ public class SysMenu extends BaseEntity
this.isFrame = isFrame; this.isFrame = isFrame;
} }
public String getIsCache()
{
return isCache;
}
public void setIsCache(String isCache)
{
this.isCache = isCache;
}
@NotBlank(message = "菜单类型不能为空") @NotBlank(message = "菜单类型不能为空")
public String getMenuType() public String getMenuType()
{ {
@ -243,7 +216,6 @@ public class SysMenu extends BaseEntity
.append("path", getPath()) .append("path", getPath())
.append("component", getComponent()) .append("component", getComponent())
.append("isFrame", getIsFrame()) .append("isFrame", getIsFrame())
.append("IsCache", getIsCache())
.append("menuType", getMenuType()) .append("menuType", getMenuType())
.append("visible", getVisible()) .append("visible", getVisible())
.append("status ", getStatus()) .append("status ", getStatus())

View File

@ -33,16 +33,10 @@ public class SysRole extends BaseEntity
@Excel(name = "角色排序") @Excel(name = "角色排序")
private String roleSort; private String roleSort;
/** 数据范围1所有数据权限2自定义数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限 */ /** 数据范围1所有数据权限2自定义数据权限3本部门数据权限4本部门及以下数据权限 */
@Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限")
private String dataScope; private String dataScope;
/** 菜单树选择项是否关联显示( 0父子不互相关联显示 1父子互相关联显示 */
private boolean menuCheckStrictly;
/** 部门树选择项是否关联显示0父子不互相关联显示 1父子互相关联显示 */
private boolean deptCheckStrictly;
/** 角色状态0正常 1停用 */ /** 角色状态0正常 1停用 */
@Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
private String status; private String status;
@ -134,26 +128,6 @@ public class SysRole extends BaseEntity
this.dataScope = dataScope; this.dataScope = dataScope;
} }
public boolean isMenuCheckStrictly()
{
return menuCheckStrictly;
}
public void setMenuCheckStrictly(boolean menuCheckStrictly)
{
this.menuCheckStrictly = menuCheckStrictly;
}
public boolean isDeptCheckStrictly()
{
return deptCheckStrictly;
}
public void setDeptCheckStrictly(boolean deptCheckStrictly)
{
this.deptCheckStrictly = deptCheckStrictly;
}
public String getStatus() public String getStatus()
{ {
return status; return status;
@ -212,8 +186,6 @@ public class SysRole extends BaseEntity
.append("roleKey", getRoleKey()) .append("roleKey", getRoleKey())
.append("roleSort", getRoleSort()) .append("roleSort", getRoleSort())
.append("dataScope", getDataScope()) .append("dataScope", getDataScope())
.append("menuCheckStrictly", isMenuCheckStrictly())
.append("deptCheckStrictly", isDeptCheckStrictly())
.append("status", getStatus()) .append("status", getStatus())
.append("delFlag", getDelFlag()) .append("delFlag", getDelFlag())
.append("createBy", getCreateBy()) .append("createBy", getCreateBy())

View File

@ -2,7 +2,9 @@ package com.ruoyi.common.core.domain.entity;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.validation.constraints.*; import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
@ -12,7 +14,6 @@ import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type; import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.common.annotation.Excels; import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
/** /**
* 用户对象 sys_user * 用户对象 sys_user
@ -67,12 +68,12 @@ public class SysUser extends BaseEntity
/** 删除标志0代表存在 2代表删除 */ /** 删除标志0代表存在 2代表删除 */
private String delFlag; private String delFlag;
/** 最后登IP */ /** 最后登IP */
@Excel(name = "最后登IP", type = Type.EXPORT) @Excel(name = "最后登IP", type = Type.EXPORT)
private String loginIp; private String loginIp;
/** 最后登时间 */ /** 最后登时间 */
@Excel(name = "最后登时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) @Excel(name = "最后登时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
private Date loginDate; private Date loginDate;
/** 部门对象 */ /** 部门对象 */
@ -91,9 +92,6 @@ public class SysUser extends BaseEntity
/** 岗位组 */ /** 岗位组 */
private Long[] postIds; private Long[] postIds;
/** 角色ID */
private Long roleId;
public SysUser() public SysUser()
{ {
@ -134,7 +132,6 @@ public class SysUser extends BaseEntity
this.deptId = deptId; this.deptId = deptId;
} }
@Xss(message = "用户昵称不能包含脚本字符")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
public String getNickName() public String getNickName()
{ {
@ -146,7 +143,6 @@ public class SysUser extends BaseEntity
this.nickName = nickName; this.nickName = nickName;
} }
@Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空") @NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName() public String getUserName()
@ -202,7 +198,7 @@ public class SysUser extends BaseEntity
this.avatar = avatar; this.avatar = avatar;
} }
@JsonIgnore @JsonIgnore
@JsonProperty @JsonProperty
public String getPassword() public String getPassword()
{ {
@ -304,16 +300,6 @@ public class SysUser extends BaseEntity
this.postIds = postIds; this.postIds = postIds;
} }
public Long getRoleId()
{
return roleId;
}
public void setRoleId(Long roleId)
{
this.roleId = roleId;
}
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@ -25,7 +25,7 @@ public class LoginBody
/** /**
* 唯一标识 * 唯一标识
*/ */
private String uuid; private String uuid = "";
public String getUsername() public String getUsername()
{ {

View File

@ -4,7 +4,7 @@ import java.util.Collection;
import java.util.Set; import java.util.Set;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
/** /**
@ -16,23 +16,13 @@ public class LoginUser implements UserDetails
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 部门ID
*/
private Long deptId;
/** /**
* 用户唯一标识 * 用户唯一标识
*/ */
private String token; private String token;
/** /**
* 时间 * 登陆时间
*/ */
private Long loginTime; private Long loginTime;
@ -71,26 +61,6 @@ public class LoginUser implements UserDetails
*/ */
private SysUser user; private SysUser user;
public Long getUserId()
{
return userId;
}
public void setUserId(Long userId)
{
this.userId = userId;
}
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
public String getToken() public String getToken()
{ {
return token; return token;
@ -111,15 +81,7 @@ public class LoginUser implements UserDetails
this.permissions = permissions; this.permissions = permissions;
} }
public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions) @JsonIgnore
{
this.userId = userId;
this.deptId = deptId;
this.user = user;
this.permissions = permissions;
}
@JSONField(serialize = false)
@Override @Override
public String getPassword() public String getPassword()
{ {
@ -135,7 +97,7 @@ public class LoginUser implements UserDetails
/** /**
* 账户是否未过期,过期无法验证 * 账户是否未过期,过期无法验证
*/ */
@JSONField(serialize = false) @JsonIgnore
@Override @Override
public boolean isAccountNonExpired() public boolean isAccountNonExpired()
{ {
@ -147,7 +109,7 @@ public class LoginUser implements UserDetails
* *
* @return * @return
*/ */
@JSONField(serialize = false) @JsonIgnore
@Override @Override
public boolean isAccountNonLocked() public boolean isAccountNonLocked()
{ {
@ -159,7 +121,7 @@ public class LoginUser implements UserDetails
* *
* @return * @return
*/ */
@JSONField(serialize = false) @JsonIgnore
@Override @Override
public boolean isCredentialsNonExpired() public boolean isCredentialsNonExpired()
{ {
@ -171,7 +133,7 @@ public class LoginUser implements UserDetails
* *
* @return * @return
*/ */
@JSONField(serialize = false) @JsonIgnore
@Override @Override
public boolean isEnabled() public boolean isEnabled()
{ {

View File

@ -1,11 +0,0 @@
package com.ruoyi.common.core.domain.model;
/**
* 用户注册对象
*
* @author ruoyi
*/
public class RegisterBody extends LoginBody
{
}

View File

@ -1,101 +1,72 @@
package com.ruoyi.common.core.page; package com.ruoyi.common.core.page;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
/** /**
* 分页数据 * 分页数据
* *
* @author ruoyi * @author ruoyi
*/ */
public class PageDomain public class PageDomain
{ {
/** 当前记录起始索引 */ /** 当前记录起始索引 */
private Integer pageNum; private Integer pageNum;
/** 每页显示记录数 */ /** 每页显示记录数 */
private Integer pageSize; private Integer pageSize;
/** 排序列 */ /** 排序列 */
private String orderByColumn; private String orderByColumn;
/** 排序的方向desc或者asc */ /** 排序的方向 "desc" 或者 "asc". */
private String isAsc = "asc"; private String isAsc;
/** 分页参数合理化 */ public String getOrderBy()
private Boolean reasonable = true; {
if (StringUtils.isEmpty(orderByColumn))
public String getOrderBy() {
{ return "";
if (StringUtils.isEmpty(orderByColumn)) }
{ return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
return ""; }
}
return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; public Integer getPageNum()
} {
return pageNum;
public Integer getPageNum() }
{
return pageNum; public void setPageNum(Integer pageNum)
} {
this.pageNum = pageNum;
public void setPageNum(Integer pageNum) }
{
this.pageNum = pageNum; public Integer getPageSize()
} {
return pageSize;
public Integer getPageSize() }
{
return pageSize; public void setPageSize(Integer pageSize)
} {
this.pageSize = pageSize;
public void setPageSize(Integer pageSize) }
{
this.pageSize = pageSize; public String getOrderByColumn()
} {
return orderByColumn;
public String getOrderByColumn() }
{
return orderByColumn; public void setOrderByColumn(String orderByColumn)
} {
this.orderByColumn = orderByColumn;
public void setOrderByColumn(String orderByColumn) }
{
this.orderByColumn = orderByColumn; public String getIsAsc()
} {
return isAsc;
public String getIsAsc() }
{
return isAsc; public void setIsAsc(String isAsc)
} {
this.isAsc = isAsc;
public void setIsAsc(String isAsc) }
{ }
if (StringUtils.isNotEmpty(isAsc))
{
// 兼容前端排序类型
if ("ascending".equals(isAsc))
{
isAsc = "asc";
}
else if ("descending".equals(isAsc))
{
isAsc = "desc";
}
this.isAsc = isAsc;
}
}
public Boolean getReasonable()
{
if (StringUtils.isNull(reasonable))
{
return Boolean.TRUE;
}
return reasonable;
}
public void setReasonable(Boolean reasonable)
{
this.reasonable = reasonable;
}
}

View File

@ -1,6 +1,5 @@
package com.ruoyi.common.core.page; package com.ruoyi.common.core.page;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
/** /**
@ -30,22 +29,16 @@ public class TableSupport
*/ */
public static final String IS_ASC = "isAsc"; public static final String IS_ASC = "isAsc";
/**
* 分页参数合理化
*/
public static final String REASONABLE = "reasonable";
/** /**
* 封装分页对象 * 封装分页对象
*/ */
public static PageDomain getPageDomain() public static PageDomain getPageDomain()
{ {
PageDomain pageDomain = new PageDomain(); PageDomain pageDomain = new PageDomain();
pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
return pageDomain; return pageDomain;
} }

View File

@ -1,13 +1,11 @@
package com.ruoyi.common.core.redis; package com.ruoyi.common.core.redis;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ValueOperations;
@ -138,15 +136,10 @@ public class RedisCache
* @param dataSet 缓存的数据 * @param dataSet 缓存的数据
* @return 缓存数据的对象 * @return 缓存数据的对象
*/ */
public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) public <T> long setCacheSet(final String key, final Set<T> dataSet)
{ {
BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); Long count = redisTemplate.opsForSet().add(key, dataSet);
Iterator<T> it = dataSet.iterator(); return count == null ? 0 : count;
while (it.hasNext())
{
setOperation.add(it.next());
}
return setOperation;
} }
/** /**
@ -209,18 +202,6 @@ public class RedisCache
return opsForHash.get(key, hKey); return opsForHash.get(key, hKey);
} }
/**
* 删除Hash中的数据
*
* @param key
* @param hKey
*/
public void delCacheMapValue(final String key, final String hKey)
{
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.delete(key, hKey);
}
/** /**
* 获取多个Hash中的数据 * 获取多个Hash中的数据
* *

View File

@ -66,7 +66,7 @@ public class CharsetKit
if (null == destCharset) if (null == destCharset)
{ {
destCharset = StandardCharsets.UTF_8; srcCharset = StandardCharsets.UTF_8;
} }
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))

View File

@ -7,11 +7,10 @@ import java.nio.charset.Charset;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.Set; import java.util.Set;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
/** /**
* 类型转换器 * 类型转换器
* *
* @author ruoyi * @author ruoyi
*/ */
public class Convert public class Convert
@ -20,7 +19,7 @@ public class Convert
* 转换为字符串<br> * 转换为字符串<br>
* 如果给定的值为null或者转换失败返回默认值<br> * 如果给定的值为null或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -42,7 +41,7 @@ public class Convert
* 转换为字符串<br> * 转换为字符串<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -55,7 +54,7 @@ public class Convert
* 转换为字符<br> * 转换为字符<br>
* 如果给定的值为null或者转换失败返回默认值<br> * 如果给定的值为null或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -79,7 +78,7 @@ public class Convert
* 转换为字符<br> * 转换为字符<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -92,7 +91,7 @@ public class Convert
* 转换为byte<br> * 转换为byte<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -130,7 +129,7 @@ public class Convert
* 转换为byte<br> * 转换为byte<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -143,7 +142,7 @@ public class Convert
* 转换为Short<br> * 转换为Short<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -181,7 +180,7 @@ public class Convert
* 转换为Short<br> * 转换为Short<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -194,7 +193,7 @@ public class Convert
* 转换为Number<br> * 转换为Number<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -228,7 +227,7 @@ public class Convert
* 转换为Number<br> * 转换为Number<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -241,7 +240,7 @@ public class Convert
* 转换为int<br> * 转换为int<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -279,7 +278,7 @@ public class Convert
* 转换为int<br> * 转换为int<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -290,7 +289,7 @@ public class Convert
/** /**
* 转换为Integer数组<br> * 转换为Integer数组<br>
* *
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
*/ */
@ -301,7 +300,7 @@ public class Convert
/** /**
* 转换为Long数组<br> * 转换为Long数组<br>
* *
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
*/ */
@ -312,7 +311,7 @@ public class Convert
/** /**
* 转换为Integer数组<br> * 转换为Integer数组<br>
* *
* @param split 分隔符 * @param split 分隔符
* @param split 被转换的值 * @param split 被转换的值
* @return 结果 * @return 结果
@ -335,7 +334,7 @@ public class Convert
/** /**
* 转换为Long数组<br> * 转换为Long数组<br>
* *
* @param split 分隔符 * @param split 分隔符
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
@ -358,7 +357,7 @@ public class Convert
/** /**
* 转换为String数组<br> * 转换为String数组<br>
* *
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
*/ */
@ -369,7 +368,7 @@ public class Convert
/** /**
* 转换为String数组<br> * 转换为String数组<br>
* *
* @param split 分隔符 * @param split 分隔符
* @param split 被转换的值 * @param split 被转换的值
* @return 结果 * @return 结果
@ -383,7 +382,7 @@ public class Convert
* 转换为long<br> * 转换为long<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -422,7 +421,7 @@ public class Convert
* 转换为long<br> * 转换为long<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -435,7 +434,7 @@ public class Convert
* 转换为double<br> * 转换为double<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -474,7 +473,7 @@ public class Convert
* 转换为double<br> * 转换为double<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -487,7 +486,7 @@ public class Convert
* 转换为Float<br> * 转换为Float<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -525,7 +524,7 @@ public class Convert
* 转换为Float<br> * 转换为Float<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -538,7 +537,7 @@ public class Convert
* 转换为boolean<br> * 转换为boolean<br>
* String支持的值为truefalseyesokno1,0 如果给定的值为空或者转换失败返回默认值<br> * String支持的值为truefalseyesokno1,0 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -584,7 +583,7 @@ public class Convert
* 转换为boolean<br> * 转换为boolean<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -596,7 +595,7 @@ public class Convert
/** /**
* 转换为Enum对象<br> * 转换为Enum对象<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* *
* @param clazz Enum的Class * @param clazz Enum的Class
* @param value * @param value
* @param defaultValue 默认值 * @param defaultValue 默认值
@ -632,7 +631,7 @@ public class Convert
/** /**
* 转换为Enum对象<br> * 转换为Enum对象<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* *
* @param clazz Enum的Class * @param clazz Enum的Class
* @param value * @param value
* @return Enum * @return Enum
@ -646,7 +645,7 @@ public class Convert
* 转换为BigInteger<br> * 转换为BigInteger<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -684,7 +683,7 @@ public class Convert
* 转换为BigInteger<br> * 转换为BigInteger<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -697,7 +696,7 @@ public class Convert
* 转换为BigDecimal<br> * 转换为BigDecimal<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -743,7 +742,7 @@ public class Convert
* 转换为BigDecimal<br> * 转换为BigDecimal<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -755,7 +754,7 @@ public class Convert
/** /**
* 将对象转为字符串<br> * 将对象转为字符串<br>
* 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法 * 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法
* *
* @param obj 对象 * @param obj 对象
* @return 字符串 * @return 字符串
*/ */
@ -767,7 +766,7 @@ public class Convert
/** /**
* 将对象转为字符串<br> * 将对象转为字符串<br>
* 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法 * 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法
* *
* @param obj 对象 * @param obj 对象
* @param charsetName 字符集 * @param charsetName 字符集
* @return 字符串 * @return 字符串
@ -780,7 +779,7 @@ public class Convert
/** /**
* 将对象转为字符串<br> * 将对象转为字符串<br>
* 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法 * 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法
* *
* @param obj 对象 * @param obj 对象
* @param charset 字符集 * @param charset 字符集
* @return 字符串 * @return 字符串
@ -796,14 +795,9 @@ public class Convert
{ {
return (String) obj; return (String) obj;
} }
else if (obj instanceof byte[]) else if (obj instanceof byte[] || obj instanceof Byte[])
{ {
return str((byte[]) obj, charset); return str((Byte[]) obj, charset);
}
else if (obj instanceof Byte[])
{
byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);
return str(bytes, charset);
} }
else if (obj instanceof ByteBuffer) else if (obj instanceof ByteBuffer)
{ {
@ -814,7 +808,7 @@ public class Convert
/** /**
* 将byte数组转为字符串 * 将byte数组转为字符串
* *
* @param bytes byte数组 * @param bytes byte数组
* @param charset 字符集 * @param charset 字符集
* @return 字符串 * @return 字符串
@ -826,7 +820,7 @@ public class Convert
/** /**
* 解码字节码 * 解码字节码
* *
* @param data 字符串 * @param data 字符串
* @param charset 字符集如果此字段为空则解码的结果取决于平台 * @param charset 字符集如果此字段为空则解码的结果取决于平台
* @return 解码后的字符串 * @return 解码后的字符串
@ -847,7 +841,7 @@ public class Convert
/** /**
* 将编码的byteBuffer数据转换为字符串 * 将编码的byteBuffer数据转换为字符串
* *
* @param data 数据 * @param data 数据
* @param charset 字符集如果为空使用当前系统字符集 * @param charset 字符集如果为空使用当前系统字符集
* @return 字符串 * @return 字符串
@ -864,7 +858,7 @@ public class Convert
/** /**
* 将编码的byteBuffer数据转换为字符串 * 将编码的byteBuffer数据转换为字符串
* *
* @param data 数据 * @param data 数据
* @param charset 字符集如果为空使用当前系统字符集 * @param charset 字符集如果为空使用当前系统字符集
* @return 字符串 * @return 字符串
@ -881,7 +875,7 @@ public class Convert
// ----------------------------------------------------------------------- 全角半角转换 // ----------------------------------------------------------------------- 全角半角转换
/** /**
* 半角转全角 * 半角转全角
* *
* @param input String. * @param input String.
* @return 全角字符串. * @return 全角字符串.
*/ */
@ -892,7 +886,7 @@ public class Convert
/** /**
* 半角转全角 * 半角转全角
* *
* @param input String * @param input String
* @param notConvertSet 不替换的字符集合 * @param notConvertSet 不替换的字符集合
* @return 全角字符串. * @return 全角字符串.
@ -923,7 +917,7 @@ public class Convert
/** /**
* 全角转半角 * 全角转半角
* *
* @param input String. * @param input String.
* @return 半角字符串 * @return 半角字符串
*/ */
@ -934,7 +928,7 @@ public class Convert
/** /**
* 替换全角为半角 * 替换全角为半角
* *
* @param text 文本 * @param text 文本
* @param notConvertSet 不替换的字符集合 * @param notConvertSet 不替换的字符集合
* @return 替换后的字符 * @return 替换后的字符
@ -966,7 +960,7 @@ public class Convert
/** /**
* 数字金额大写转换 先写个完整的然后将如零拾替换成零 * 数字金额大写转换 先写个完整的然后将如零拾替换成零
* *
* @param n 数字 * @param n 数字
* @return 中文大写数字 * @return 中文大写数字
*/ */

View File

@ -1,20 +0,0 @@
package com.ruoyi.common.enums;
/**
* 限流类型
*
* @author ruoyi
*/
public enum LimitType
{
/**
* 默认策略全局限流
*/
DEFAULT,
/**
* 根据请求者IP进行限流
*/
IP
}

View File

@ -1,4 +1,4 @@
package com.ruoyi.common.exception.base; package com.ruoyi.common.exception;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;

View File

@ -0,0 +1,43 @@
package com.ruoyi.common.exception;
/**
* 自定义异常
*
* @author ruoyi
*/
public class CustomException extends RuntimeException
{
private static final long serialVersionUID = 1L;
private Integer code;
private String message;
public CustomException(String message)
{
this.message = message;
}
public CustomException(String message, Integer code)
{
this.message = message;
this.code = code;
}
public CustomException(String message, Throwable e)
{
super(message, e);
this.message = message;
}
@Override
public String getMessage()
{
return message;
}
public Integer getCode()
{
return code;
}
}

View File

@ -1,58 +0,0 @@
package com.ruoyi.common.exception;
/**
* 全局异常
*
* @author ruoyi
*/
public class GlobalException extends RuntimeException
{
private static final long serialVersionUID = 1L;
/**
* 错误提示
*/
private String message;
/**
* 错误明细内部调试错误
*
* {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
/**
* 空构造方法避免反序列化问题
*/
public GlobalException()
{
}
public GlobalException(String message)
{
this.message = message;
}
public String getDetailMessage()
{
return detailMessage;
}
public GlobalException setDetailMessage(String detailMessage)
{
this.detailMessage = detailMessage;
return this;
}
public String getMessage()
{
return message;
}
public GlobalException setMessage(String message)
{
this.message = message;
return this;
}
}

View File

@ -1,73 +0,0 @@
package com.ruoyi.common.exception;
/**
* 业务异常
*
* @author ruoyi
*/
public final class ServiceException extends RuntimeException
{
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
private Integer code;
/**
* 错误提示
*/
private String message;
/**
* 错误明细内部调试错误
*
* {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
/**
* 空构造方法避免反序列化问题
*/
public ServiceException()
{
}
public ServiceException(String message)
{
this.message = message;
}
public ServiceException(String message, Integer code)
{
this.message = message;
this.code = code;
}
public String getDetailMessage()
{
return detailMessage;
}
public String getMessage()
{
return message;
}
public Integer getCode()
{
return code;
}
public ServiceException setMessage(String message)
{
this.message = message;
return this;
}
public ServiceException setDetailMessage(String detailMessage)
{
this.detailMessage = detailMessage;
return this;
}
}

View File

@ -1,6 +1,6 @@
package com.ruoyi.common.exception.file; package com.ruoyi.common.exception.file;
import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.exception.BaseException;
/** /**
* 文件信息异常类 * 文件信息异常类

View File

@ -68,14 +68,4 @@ public class InvalidExtensionException extends FileUploadException
super(allowedExtension, extension, filename); super(allowedExtension, extension, filename);
} }
} }
public static class InvalidVideoExtensionException extends InvalidExtensionException
{
private static final long serialVersionUID = 1L;
public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename)
{
super(allowedExtension, extension, filename);
}
}
} }

View File

@ -1,6 +1,6 @@
package com.ruoyi.common.exception.user; package com.ruoyi.common.exception.user;
import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.exception.BaseException;
/** /**
* 用户信息异常类 * 用户信息异常类

View File

@ -29,8 +29,8 @@ public class RepeatableFilter implements Filter
throws IOException, ServletException throws IOException, ServletException
{ {
ServletRequest requestWrapper = null; ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest if (request instanceof HttpServletRequest && StringUtils.equalsAnyIgnoreCase(request.getContentType(),
&& StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE))
{ {
requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
} }

View File

@ -38,21 +38,18 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
@Override @Override
public ServletInputStream getInputStream() throws IOException public ServletInputStream getInputStream() throws IOException
{ {
final ByteArrayInputStream bais = new ByteArrayInputStream(body); final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() return new ServletInputStream()
{ {
@Override @Override
public int read() throws IOException public int read() throws IOException
{ {
return bais.read(); return bais.read();
} }
@Override
public int available() throws IOException
{
return body.length;
}
@Override @Override
public boolean isFinished() public boolean isFinished()
{ {

View File

@ -3,6 +3,8 @@ package com.ruoyi.common.filter;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; import javax.servlet.FilterConfig;
@ -25,10 +27,16 @@ public class XssFilter implements Filter
*/ */
public List<String> excludes = new ArrayList<>(); public List<String> excludes = new ArrayList<>();
/**
* xss过滤开关
*/
public boolean enabled = false;
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException public void init(FilterConfig filterConfig) throws ServletException
{ {
String tempExcludes = filterConfig.getInitParameter("excludes"); String tempExcludes = filterConfig.getInitParameter("excludes");
String tempEnabled = filterConfig.getInitParameter("enabled");
if (StringUtils.isNotEmpty(tempExcludes)) if (StringUtils.isNotEmpty(tempExcludes))
{ {
String[] url = tempExcludes.split(","); String[] url = tempExcludes.split(",");
@ -37,6 +45,10 @@ public class XssFilter implements Filter
excludes.add(url[i]); excludes.add(url[i]);
} }
} }
if (StringUtils.isNotEmpty(tempEnabled))
{
enabled = Boolean.valueOf(tempEnabled);
}
} }
@Override @Override
@ -56,14 +68,25 @@ public class XssFilter implements Filter
private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
{ {
String url = request.getServletPath(); if (!enabled)
String method = request.getMethod();
// GET DELETE 不过滤
if (method == null || method.matches("GET") || method.matches("DELETE"))
{ {
return true; return true;
} }
return StringUtils.matches(url, excludes); if (excludes == null || excludes.isEmpty())
{
return false;
}
String url = request.getServletPath();
for (String pattern : excludes)
{
Pattern p = Pattern.compile("^" + pattern);
Matcher m = p.matcher(url);
if (m.find())
{
return true;
}
}
return false;
} }
@Override @Override

View File

@ -63,8 +63,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
// xss过滤 // xss过滤
json = EscapeUtil.clean(json).trim(); json = EscapeUtil.clean(json).trim();
byte[] jsonBytes = json.getBytes("utf-8"); final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8"));
final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes);
return new ServletInputStream() return new ServletInputStream()
{ {
@Override @Override
@ -79,12 +78,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
return true; return true;
} }
@Override
public int available() throws IOException
{
return jsonBytes.length;
}
@Override @Override
public void setReadListener(ReadListener readListener) public void setReadListener(ReadListener readListener)
{ {
@ -106,6 +99,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
public boolean isJsonRequest() public boolean isJsonRequest()
{ {
String header = super.getHeader(HttpHeaders.CONTENT_TYPE); String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header)
|| MediaType.APPLICATION_JSON_UTF8_VALUE.equalsIgnoreCase(header);
} }
} }

View File

@ -1,114 +1,114 @@
package com.ruoyi.common.utils; package com.ruoyi.common.utils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
/** /**
* 精确的浮点数运算 * 精确的浮点数运算
* *
* @author ruoyi * @author ruoyi
*/ */
public class Arith public class Arith
{ {
/** 默认除法运算精度 */ /** 默认除法运算精度 */
private static final int DEF_DIV_SCALE = 10; private static final int DEF_DIV_SCALE = 10;
/** 这个类不能实例化 */ /** 这个类不能实例化 */
private Arith() private Arith()
{ {
} }
/** /**
* 提供精确的加法运算 * 提供精确的加法运算
* @param v1 被加数 * @param v1 被加数
* @param v2 加数 * @param v2 加数
* @return 两个参数的和 * @return 两个参数的和
*/ */
public static double add(double v1, double v2) public static double add(double v1, double v2)
{ {
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue(); return b1.add(b2).doubleValue();
} }
/** /**
* 提供精确的减法运算 * 提供精确的减法运算
* @param v1 被减数 * @param v1 被减数
* @param v2 减数 * @param v2 减数
* @return 两个参数的差 * @return 两个参数的差
*/ */
public static double sub(double v1, double v2) public static double sub(double v1, double v2)
{ {
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue(); return b1.subtract(b2).doubleValue();
} }
/** /**
* 提供精确的乘法运算 * 提供精确的乘法运算
* @param v1 被乘数 * @param v1 被乘数
* @param v2 乘数 * @param v2 乘数
* @return 两个参数的积 * @return 两个参数的积
*/ */
public static double mul(double v1, double v2) public static double mul(double v1, double v2)
{ {
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue(); return b1.multiply(b2).doubleValue();
} }
/** /**
* 提供相对精确的除法运算当发生除不尽的情况时精确到 * 提供相对精确的除法运算当发生除不尽的情况时精确到
* 小数点以后10位以后的数字四舍五入 * 小数点以后10位以后的数字四舍五入
* @param v1 被除数 * @param v1 被除数
* @param v2 除数 * @param v2 除数
* @return 两个参数的商 * @return 两个参数的商
*/ */
public static double div(double v1, double v2) public static double div(double v1, double v2)
{ {
return div(v1, v2, DEF_DIV_SCALE); return div(v1, v2, DEF_DIV_SCALE);
} }
/** /**
* 提供相对精确的除法运算当发生除不尽的情况时由scale参数指 * 提供相对精确的除法运算当发生除不尽的情况时由scale参数指
* 定精度以后的数字四舍五入 * 定精度以后的数字四舍五入
* @param v1 被除数 * @param v1 被除数
* @param v2 除数 * @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位 * @param scale 表示表示需要精确到小数点以后几位
* @return 两个参数的商 * @return 两个参数的商
*/ */
public static double div(double v1, double v2, int scale) public static double div(double v1, double v2, int scale)
{ {
if (scale < 0) if (scale < 0)
{ {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"The scale must be a positive integer or zero"); "The scale must be a positive integer or zero");
} }
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
if (b1.compareTo(BigDecimal.ZERO) == 0) if (b1.compareTo(BigDecimal.ZERO) == 0)
{ {
return BigDecimal.ZERO.doubleValue(); return BigDecimal.ZERO.doubleValue();
} }
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
} }
/** /**
* 提供精确的小数位四舍五入处理 * 提供精确的小数位四舍五入处理
* @param v 需要四舍五入的数字 * @param v 需要四舍五入的数字
* @param scale 小数点后保留几位 * @param scale 小数点后保留几位
* @return 四舍五入后的结果 * @return 四舍五入后的结果
*/ */
public static double round(double v, int scale) public static double round(double v, int scale)
{ {
if (scale < 0) if (scale < 0)
{ {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"The scale must be a positive integer or zero"); "The scale must be a positive integer or zero");
} }
BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = BigDecimal.ONE; BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
} }
} }

View File

@ -3,11 +3,6 @@ package com.ruoyi.common.utils;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date; import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateFormatUtils;
@ -27,7 +22,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static String[] parsePatterns = { private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
@ -126,7 +121,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return null; return null;
} }
} }
/** /**
* 获取服务器启动时间 * 获取服务器启动时间
*/ */
@ -136,14 +131,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return new Date(time); return new Date(time);
} }
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/** /**
* 计算两个时间差 * 计算两个时间差
*/ */
@ -165,23 +152,4 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
// long sec = diff % nd % nh % nm / ns; // long sec = diff % nd % nh % nm / ns;
return day + "" + hour + "小时" + min + "分钟"; return day + "" + hour + "小时" + min + "分钟";
} }
/**
* 增加 LocalDateTime ==> Date
*/
public static Date toDate(LocalDateTime temporalAccessor)
{
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 增加 LocalDate ==> Date
*/
public static Date toDate(LocalDate temporalAccessor)
{
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
} }

View File

@ -41,7 +41,8 @@ public class DictUtils
Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(cacheObj)) if (StringUtils.isNotNull(cacheObj))
{ {
return StringUtils.cast(cacheObj); List<SysDictData> dictDatas = StringUtils.cast(cacheObj);
return dictDatas;
} }
return null; return null;
} }
@ -91,7 +92,7 @@ public class DictUtils
{ {
if (value.equals(dict.getDictValue())) if (value.equals(dict.getDictValue()))
{ {
propertyString.append(dict.getDictLabel()).append(separator); propertyString.append(dict.getDictLabel() + separator);
break; break;
} }
} }
@ -131,7 +132,7 @@ public class DictUtils
{ {
if (label.equals(dict.getDictLabel())) if (label.equals(dict.getDictLabel()))
{ {
propertyString.append(dict.getDictValue()).append(separator); propertyString.append(dict.getDictValue() + separator);
break; break;
} }
} }
@ -150,16 +151,6 @@ public class DictUtils
return StringUtils.stripEnd(propertyString.toString(), separator); return StringUtils.stripEnd(propertyString.toString(), separator);
} }
/**
* 删除指定字典缓存
*
* @param key 字典键
*/
public static void removeDictCache(String key)
{
SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key));
}
/** /**
* 清空字典缓存 * 清空字典缓存
*/ */

View File

@ -18,10 +18,11 @@ public class ExceptionUtil
{ {
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw, true)); e.printStackTrace(new PrintWriter(sw, true));
return sw.toString(); String str = sw.toString();
return str;
} }
public static String getRootErrorMessage(Exception e) public static String getRootErrorMseeage(Exception e)
{ {
Throwable root = ExceptionUtils.getRootCause(e); Throwable root = ExceptionUtils.getRootCause(e);
root = (root == null ? e : root); root = (root == null ? e : root);

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