若依3.2

master
RuoYi 6 years ago committed by Limy
parent 5974a99e6b
commit a01f80752b

@ -6,10 +6,17 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.config.Global;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.framework.util.FileUploadUtils;
/**
*
@ -21,7 +28,21 @@ public class CommonController
{
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@RequestMapping("common/download")
/**
*
*/
public static final String UPLOAD_PATH = "/profile/upload/";
@Autowired
private ServerConfig serverConfig;
/**
*
*
* @param fileName
* @param delete
*/
@GetMapping("common/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
{
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
@ -31,7 +52,8 @@ public class CommonController
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + setFileDownloadHeader(request, realFileName));
response.setHeader("Content-Disposition",
"attachment;fileName=" + setFileDownloadHeader(request, realFileName));
FileUtils.writeBytes(filePath, response.getOutputStream());
if (delete)
{
@ -44,6 +66,31 @@ public class CommonController
}
}
/**
*
*/
@PostMapping("/common/upload")
@ResponseBody
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try
{
// 上传文件路径
String filePath = Global.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + UPLOAD_PATH + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", fileName);
ajax.put("url", url);
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
public String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
{
final String agent = request.getHeader("USER-AGENT");

@ -181,4 +181,16 @@ public class SysRoleController extends BaseController
{
return prefix + "/tree";
}
/**
*
*/
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:role:edit")
@PostMapping("/changeStatus")
@ResponseBody
public AjaxResult changeStatus(SysRole role)
{
return toAjax(roleService.changeStatus(role));
}
}

@ -45,7 +45,7 @@ public class SysUserController extends BaseController
@Autowired
private ISysPostService postService;
@Autowired
private SysPasswordService passwordService;
@ -225,4 +225,16 @@ public class SysUserController extends BaseController
{
return userService.checkEmailUnique(user);
}
/**
*
*/
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:user:edit")
@PostMapping("/changeStatus")
@ResponseBody
public AjaxResult changeStatus(SysUser user)
{
return toAjax(userService.changeStatus(user));
}
}

@ -17,32 +17,33 @@ spring:
username:
password:
# 初始连接数
initial-size: 10
# 最大连接池数量
max-active: 100
initialSize: 5
# 最小连接池数量
min-idle: 10
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 打开PSCache并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
statViewServlet:
enabled: true
url-pattern: /monitor/druid/*
filter:
stat:
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
merge-sql: true
wall:
config:
multi-statement-allow: true

@ -3,9 +3,9 @@ ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.1.0
version: 3.2.0
# 版权年份
copyrightYear: 2018
copyrightYear: 2019
# 文件上传路径
profile: D:/profile/
# 获取ip地址开关

@ -1,44 +1,35 @@
/**
* @author: Dennis Hernández
* @webSite: http://djhvscf.github.io/Blog
* @version: v1.1.0
* 基于bootstrap-table-mobile修改
* 修正部分iPhone手机不显示卡片视图
* Copyright (c) 2019 ruoyi
*/
!function ($) {
'use strict';
var showHideColumns = function (that, checked) {
if (that.options.columnsHidden.length > 0 ) {
$.each(that.columns, function (i, column) {
if (that.options.columnsHidden.indexOf(column.field) !== -1) {
if (column.visible !== checked) {
that.toggleColumn($.fn.bootstrapTable.utils.getFieldIndex(that.columns, column.field), checked, true);
}
}
});
}
};
var resetView = function (that) {
if (that.options.height || that.options.showFooter) {
setTimeout(function(){
that.resetView.call(that);
}, 1);
setTimeout(that.resetView(), 1);
}
};
// 判断是否 iphone
var isIPhone = function () {
let browserName = navigator.userAgent.toLowerCase();
return /(iphone)/i.test(browserName);
};
var changeView = function (that, width, height) {
if (that.options.minHeight) {
if ((width <= that.options.minWidth) && (height <= that.options.minHeight)) {
if (checkValuesLessEqual(width, that.options.minWidth) && checkValuesLessEqual(height, that.options.minHeight)) {
conditionCardView(that);
} else if ((width > that.options.minWidth) && (height > that.options.minHeight)) {
} else if (checkValuesGreater(width, that.options.minWidth) && checkValuesGreater(height, that.options.minHeight)) {
conditionFullView(that);
}
} else {
if (width <= that.options.minWidth) {
if (checkValuesLessEqual(width, that.options.minWidth) || isIPhone()) {
conditionCardView(that);
} else if (width > that.options.minWidth) {
} else if (checkValuesGreater(width, that.options.minWidth)) {
conditionFullView(that);
}
}
@ -46,14 +37,20 @@
resetView(that);
};
var checkValuesLessEqual = function (currentValue, targetValue) {
return currentValue <= targetValue;
};
var checkValuesGreater = function (currentValue, targetValue) {
return currentValue > targetValue;
};
var conditionCardView = function (that) {
changeTableView(that, false);
showHideColumns(that, false);
};
var conditionFullView = function (that) {
changeTableView(that, true);
showHideColumns(that, true);
};
var changeTableView = function (that, cardViewState) {
@ -61,27 +58,12 @@
that.toggleView();
};
var debounce = function(func,wait) {
var timeout;
return function() {
var context = this,
args = arguments;
var later = function() {
timeout = null;
func.apply(context,args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
$.extend($.fn.bootstrapTable.defaults, {
mobileResponsive: false,
minWidth: 562,
minHeight: undefined,
heightThreshold: 100, // just slightly larger than mobile chrome's auto-hiding toolbar
checkOnInit: true,
columnsHidden: []
toggled: false
});
var BootstrapTable = $.fn.bootstrapTable.Constructor,
@ -98,39 +80,13 @@
return;
}
if (this.options.minWidth < 100 && this.options.resizable) {
console.log("The minWidth when the resizable extension is active should be greater or equal than 100");
this.options.minWidth = 100;
}
var that = this,
old = {
width: $(window).width(),
height: $(window).height()
};
$(window).on('resize orientationchange',debounce(function (evt) {
// reset view if height has only changed by at least the threshold.
var height = $(this).height(),
width = $(this).width();
if (Math.abs(old.height - height) > that.options.heightThreshold || old.width != width) {
changeView(that, width, height);
old = {
width: width,
height: height
};
}
},200));
var that = this;
$(window).resize(function () {
changeView(that, $(this).width(), $(this).height())
});
if (this.options.checkOnInit) {
var height = $(window).height(),
width = $(window).width();
changeView(this, width, height);
old = {
width: width,
height: height
};
changeView(this, $(window).width(), $(window).height());
}
};
}(jQuery);

@ -1,7 +0,0 @@
/*
* bootstrap-table - v1.11.0 - 2016-07-02
* https://github.com/wenzhixin/bootstrap-table
* Copyright (c) 2016 zhixin wen
* Licensed MIT License
*/
!function(a){"use strict";var b=function(b,c){b.options.columnsHidden.length>0&&a.each(b.columns,function(d,e){-1!==b.options.columnsHidden.indexOf(e.field)&&e.visible!==c&&b.toggleColumn(a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e.field),c,!0)})},c=function(a){(a.options.height||a.options.showFooter)&&setTimeout(function(){a.resetView.call(a)},1)},d=function(a,b,d){a.options.minHeight?b<=a.options.minWidth&&d<=a.options.minHeight?e(a):b>a.options.minWidth&&d>a.options.minHeight&&f(a):b<=a.options.minWidth?e(a):b>a.options.minWidth&&f(a),c(a)},e=function(a){g(a,!1),b(a,!1)},f=function(a){g(a,!0),b(a,!0)},g=function(a,b){a.options.cardView=b,a.toggleView()},h=function(a,b){var c;return function(){var d=this,e=arguments,f=function(){c=null,a.apply(d,e)};clearTimeout(c),c=setTimeout(f,b)}};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,heightThreshold:100,checkOnInit:!0,columnsHidden:[]});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){this.options.minWidth<100&&this.options.resizable&&(console.log("The minWidth when the resizable extension is active should be greater or equal than 100"),this.options.minWidth=100);var b=this,c={width:a(window).width(),height:a(window).height()};if(a(window).on("resize orientationchange",h(function(){var e=a(this).height(),f=a(this).width();(Math.abs(c.height-e)>b.options.heightThreshold||c.width!=f)&&(d(b,f,e),c={width:f,height:e})},200)),this.options.checkOnInit){var e=a(window).height(),f=a(window).width();d(this,f,e),c={width:f,height:e}}}}}(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

@ -0,0 +1,138 @@
/**
* layer
* Copyright (c) 2019 ruoyi
*/
html #layui_layer_skinmoonstylecss {
display: none;
position: absolute;
width: 1989px;
}
body .layer-ext-moon[type="dialog"] {
min-width: 320px;
}
body .layer-ext-moon-msg[type="dialog"]{min-width:200px;}
body .layer-ext-moon .layui-layer-title {
background: #F8F8F8;
color: #333;
font-size: 14px;
height: 42px;
line-height: 42px;
border-bottom: 1px solid #eee;
}
body .layer-ext-moon .layui-layer-content .layui-layer-ico {
height: 32px;
width: 32px;
top:18.5px;
}
body .layer-ext-moon .layui-layer-ico0 {
background: url(default.png) no-repeat -96px 0;
;
}
body .layer-ext-moon .layui-layer-ico1 {
background: url(default.png) no-repeat -224px 0;
;
}
body .layer-ext-moon .layui-layer-ico2 {
background: url(default.png) no-repeat -192px 0;
}
body .layer-ext-moon .layui-layer-ico3 {
background: url(default.png) no-repeat -160px 0;
}
body .layer-ext-moon .layui-layer-ico4 {
background: url(default.png) no-repeat -320px 0;
}
body .layer-ext-moon .layui-layer-ico5 {
background: url(default.png) no-repeat -288px 0;
}
body .layer-ext-moon .layui-layer-ico6 {
background: url(default.png) -256px 0;
}
body .layer-ext-moon .layui-layer-ico7 {
background: url(default.png) no-repeat -128px 0;
}
body .layer-ext-moon .layui-layer-setwin {
top: 15px;
right: 15px;
}
body .layer-ext-moon .layui-layer-setwin a {
width: 16px;
height: 16px;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover {
background-color: #56abe4;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-max {
background: url(default.png) no-repeat -80px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover {
background: url(default.png) no-repeat -64px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin {
background: url(default.png) no-repeat -32px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover {
background: url(default.png) no-repeat -16px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2 {
background: url(default.png) 0 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover {
background: url(default.png) -48px 0;
}
body .layer-ext-moon .layui-layer-padding{padding-top: 24px;}
body .layer-ext-moon .layui-layer-btn {
text-align: right;
padding: 10px 15px 12px;
background: #f0f4f7;
border-top: 1px #c7c7c7 solid;
}
body .layer-ext-moon .layui-layer-btn a {
font-size: 12px;
font-weight: normal;
margin: 0 3px;
margin-right: 7px;
margin-left: 7px;
padding: 0 15px;
color: #fff;
border: 1px solid #0064b6;
background: #0071ce;
border-radius: 3px;
display: inline-block;
height: 30px;
line-height: 30px;
text-align: center;
vertical-align: middle;
background-repeat: no-repeat;
text-decoration: none;
outline: none;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn0 {
background: #0071ce;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn1 {
background: #fff;
color: #404a58;
border: 1px solid #c0c4cd;
border-radius: 3px;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn2 {
background: #f60;
color: #fff;
border: 1px solid #f60;
border-radius: 3px;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn3 {
background: #f00;
color: #fff;
border: 1px solid #f00;
border-radius: 3px;
}
body .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{
height:47px;
}

@ -0,0 +1,822 @@
/*
*
* SKIN blue
* NAME - blue/green/purple/red/yellow
*
*/
/** 蓝色主题 skin-blue **/
.skin-blue .navbar {
background-color: #3c8dbc
}
.skin-blue .navbar .nav>li>a {
color: #fff
}
.skin-blue .navbar .nav>li>a:hover,
.skin-blue .navbar .nav>li>a:active,
.skin-blue .navbar .nav>li>a:focus,
.skin-blue .navbar .nav .open>a,
.skin-blue .navbar .nav .open>a:hover,
.skin-blue .navbar .nav .open>a:focus,
.skin-blue .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-blue .navbar .sidebar-toggle {
color: #fff
}
.skin-blue .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-blue .navbar .sidebar-toggle {
color: #fff
}
.skin-blue .navbar .sidebar-toggle:hover {
background-color: #367fa9
}
@media ( max-width :767px) {
.skin-blue .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-blue .navbar .dropdown-menu li a {
color: #fff
}
.skin-blue .navbar .dropdown-menu li a:hover {
background: #367fa9
}
}
.skin-blue .logo {
background-color: #367fa9;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-blue .logo:hover {
background-color: #357ca5
}
.skin-blue li.user-header {
background-color: #3c8dbc
}
.skin-blue .content-header {
background: transparent
}
.skin-blue .wrapper,
.skin-blue .main-sidebar,
.skin-blue .left-side {
background-color: #222d32
}
.skin-blue .user-panel>.info,
.skin-blue .user-panel>.info>a {
color: #fff
}
.skin-blue .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-blue .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #3c8dbc;
}
.skin-blue .nav>li.active:last-child {
border-left: none;
}
.skin-blue .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-blue .sidebar a {
color: #b8c7ce
}
.skin-blue .sidebar a:hover {
text-decoration: none
}
.skin-blue .treeview-menu>li>a {
color: #8aa4af
}
.skin-blue .treeview-menu>li.active>a,
.skin-blue .treeview-menu>li>a:hover {
color: #fff
}
.skin-blue .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-blue .sidebar-form input[type="text"],
.skin-blue .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-blue .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-blue .sidebar-form input[type="text"]:focus,
.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-blue .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
.skin-blue.layout-top-nav>.logo {
background-color: #3c8dbc;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-blue.layout-top-nav>.logo:hover {
background-color: #3b8ab8
}
.skin-blue .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-blue.layout-top-nav>.logo {
background-color: #3c8dbc;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-blue.layout-top-nav>.logo:hover {
background-color: #3b8ab8
}
/** 绿色主题 skin-green **/
.skin-green .navbar {
background-color: #00a65a;
}
.skin-green .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-green .navbar .nav>li>a {
color: #fff
}
.skin-green .navbar .nav>li>a:hover,
.skin-green .navbar .nav>li>a:active,
.skin-green .navbar .nav>li>a:focus,
.skin-green .navbar .nav .open>a,
.skin-green .navbar .nav .open>a:hover,
.skin-green .navbar .nav .open>a:focus,
.skin-green .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-green .navbar .sidebar-toggle {
color: #fff
}
.skin-green .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-green .navbar .sidebar-toggle {
color: #fff
}
.skin-green .navbar .sidebar-toggle:hover {
background-color: #008d4c
}
@media ( max-width :767px) {
.skin-green .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-green .navbar .dropdown-menu li a {
color: #fff
}
.skin-green .navbar .dropdown-menu li a:hover {
background: #008d4c
}
}
.skin-green .logo {
background-color: #008d4c;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-green .logo:hover {
background-color: #008749
}
.skin-green li.user-header {
background-color: #00a65a
}
.skin-green .content-header {
background: transparent
}
.skin-green .wrapper,
.skin-green .main-sidebar,
.skin-green .left-side {
background-color: #222d32
}
.skin-green .user-panel>.info,
.skin-green .user-panel>.info>a {
color: #fff
}
.skin-green .nav>li.header {
color: #4b646f;
background: #1a2226;
}
.skin-green .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #00a65a;
}
.skin-green .nav>li.active:last-child {
border-left: none;
}
.skin-green .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-green .sidebar a {
color: #b8c7ce
}
.skin-green .sidebar a:hover {
text-decoration: none
}
.skin-green .treeview-menu>li>a {
color: #8aa4af
}
.skin-green .treeview-menu>li.active>a,
.skin-green .treeview-menu>li>a:hover {
color: #fff
}
.skin-green .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-green .sidebar-form input[type="text"],
.skin-green .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-green .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-green .sidebar-form input[type="text"]:focus,
.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-green .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
/** 红色主题 skin-red **/
.skin-red .navbar {
background-color: #dd4b39
}
.skin-red .navbar .nav>li>a {
color: #fff
}
.skin-red .navbar .nav>li>a:hover,
.skin-red .navbar .nav>li>a:active,
.skin-red .navbar .nav>li>a:focus,
.skin-red .navbar .nav .open>a,
.skin-red .navbar .nav .open>a:hover,
.skin-red .navbar .nav .open>a:focus,
.skin-red .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-red .navbar .sidebar-toggle {
color: #fff
}
.skin-red .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-red .navbar .sidebar-toggle {
color: #fff
}
.skin-red .navbar .sidebar-toggle:hover {
background-color: #d73925
}
@media ( max-width :767px) {
.skin-red .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-red .navbar .dropdown-menu li a {
color: #fff
}
.skin-red .navbar .dropdown-menu li a:hover {
background: #d73925
}
}
.skin-red .logo {
background-color: #d73925;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-red .logo:hover {
background-color: #d33724
}
.skin-red li.user-header {
background-color: #dd4b39
}
.skin-red .content-header {
background: transparent
}
.skin-red .wrapper,
.skin-red .main-sidebar,
.skin-red .left-side {
background-color: #222d32
}
.skin-red .user-panel>.info,
.skin-red .user-panel>.info>a {
color: #fff
}
.skin-red .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-red .nav>li.active {
color: #fff;
border-left: 3px solid #dd4b39;
background: #293846;
}
.skin-red .nav>li.active:last-child {
border-left: none;
}
.skin-red .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-red .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-red .sidebar a {
color: #b8c7ce
}
.skin-red .sidebar a:hover {
text-decoration: none
}
.skin-red .treeview-menu>li>a {
color: #8aa4af
}
.skin-red .treeview-menu>li.active>a,
.skin-red .treeview-menu>li>a:hover {
color: #fff
}
.skin-red .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-red .sidebar-form input[type="text"],
.skin-red .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-red .sidebar-form input[type="text"] {
color: #fff;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-red .sidebar-form input[type="text"]:focus,
.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-red .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
/** 黄色主题 skin-red **/
.skin-yellow .navbar {
background-color: #f39c12
}
.skin-yellow .navbar .nav>li>a {
color: #fff
}
.skin-yellow .navbar .nav>li>a:hover,
.skin-yellow .navbar .nav>li>a:active,
.skin-yellow .navbar .nav>li>a:focus,
.skin-yellow .navbar .nav .open>a,
.skin-yellow .navbar .nav .open>a:hover,
.skin-yellow .navbar .nav .open>a:focus,
.skin-yellow .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-yellow .navbar .sidebar-toggle {
color: #fff
}
.skin-yellow .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-yellow .navbar .sidebar-toggle {
color: #fff
}
.skin-yellow .navbar .sidebar-toggle:hover {
background-color: #e08e0b
}
@media ( max-width :767px) {
.skin-yellow .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-yellow .navbar .dropdown-menu li a {
color: #fff
}
.skin-yellow .navbar .dropdown-menu li a:hover {
background: #e08e0b
}
}
.skin-yellow .logo {
background-color: #e08e0b;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-yellow .logo:hover {
background-color: #db8b0b
}
.skin-yellow li.user-header {
background-color: #f39c12
}
.skin-yellow .content-header {
background: transparent
}
.skin-yellow .wrapper,
.skin-yellow .main-sidebar,
.skin-yellow .left-side {
background-color: #222d32
}
.skin-yellow .user-panel>.info,
.skin-yellow .user-panel>.info>a {
color: #fff
}
.skin-yellow .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-yellow .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #f39c12;
}
.skin-yellow .nav>li.active:last-child {
border-left: none;
}
.skin-yellow .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-yellow .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-yellow .sidebar a {
color: #b8c7ce
}
.skin-yellow .sidebar a:hover {
text-decoration: none
}
.skin-yellow .treeview-menu>li>a {
color: #8aa4af
}
.skin-yellow .treeview-menu>li.active>a,
.skin-yellow .treeview-menu>li>a:hover {
color: #fff
}
.skin-yellow .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-yellow .sidebar-form input[type="text"],
.skin-yellow .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-yellow .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-yellow .sidebar-form input[type="text"]:focus,
.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-yellow .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
/** 紫色主题 skin-purple **/
.skin-purple .navbar {
background-color: #605ca8
}
.skin-purple .navbar .nav>li>a {
color: #fff
}
.skin-purple .navbar .nav>li>a:hover,
.skin-purple .navbar .nav>li>a:active,
.skin-purple .navbar .nav>li>a:focus,
.skin-purple .navbar .nav .open>a,
.skin-purple .navbar .nav .open>a:hover,
.skin-purple .navbar .nav .open>a:focus,
.skin-purple .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-purple .navbar .sidebar-toggle {
color: #fff
}
.skin-purple .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-purple .navbar .sidebar-toggle {
color: #fff
}
.skin-purple .navbar .sidebar-toggle:hover {
background-color: #555299
}
@media ( max-width :767px) {
.skin-purple .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-purple .navbar .dropdown-menu li a {
color: #fff
}
.skin-purple .navbar .dropdown-menu li a:hover {
background: #555299
}
}
.skin-purple .logo {
background-color: #555299;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-purple .logo:hover {
background-color: #545096
}
.skin-purple li.user-header {
background-color: #605ca8
}
.skin-purple .content-header {
background: transparent
}
.skin-purple .wrapper,
.skin-purple .main-sidebar,
.skin-purple .left-side {
background-color: #222d32
}
.skin-purple .user-panel>.info,
.skin-purple .user-panel>.info>a {
color: #fff
}
.skin-purple .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-purple .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #605ca8;
}
.skin-purple .nav>li.active:last-child {
border-left: none;
}
.skin-purple .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-purple .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-purple .sidebar a {
color: #b8c7ce
}
.skin-purple .sidebar a:hover {
text-decoration: none
}
.skin-purple .treeview-menu>li>a {
color: #8aa4af
}
.skin-purple .treeview-menu>li.active>a,
.skin-purple .treeview-menu>li>a:hover {
color: #fff
}
.skin-purple .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-purple .sidebar-form input[type="text"],
.skin-purple .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-purple .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-purple .sidebar-form input[type="text"]:focus,
.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-purple .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}

@ -47,28 +47,44 @@ a:focus {
}
.nav.navbar-right>li>a {
color: #999c9e;
color: #fff;
font-size: 14px;
height: 50px;
padding: 18px 15px;
}
.nav>li.active>a {
color: #ffffff;
}
.navbar-default .nav>li>a:hover, .navbar-default .nav>li>a:focus {
background-color: #293846;
color: white;
.nav.navbar-right>li>a>.label {
position: absolute;
top: 9px;
right: 5px;
text-align: center;
font-size: 9px;
padding: 2px 4px;
line-height: .9;
}
.nav.navbar-right>li>a:hover {
background-color: #367fa9;
color: #fff;
}
.nav .open>a, .nav .open>a:hover, .nav .open>a:focus {
background: #fff;
.navbar-default .nav>li>a:hover,
.navbar-default .nav>li>a:focus {
background-color: #293846;
color: white;
}
.nav>li>a i {
margin-right: 6px;
.nav .open>a,
.nav .open>a:hover,
.nav .open>a:focus {
background: #fff;
}
.navbar {
border: 0;
border: 0;
}
.navbar-default {
@ -77,12 +93,12 @@ a:focus {
position: relative;
}
.navbar-top-links li {
display: inline-block;
.nav.navbar-top-links li {
display: inline-block;
}
.navbar-top-links li:last-child {
margin-right: 30px;
margin-right: 16px;
}
body.body-small .navbar-top-links li:last-child {
@ -179,7 +195,7 @@ body.body-small .navbar-top-links li:last-child {
}
.nav-header {
padding: 33px 25px;
padding: 34px 25px 20px 25px;
background: url("patterns/header-profile.png") no-repeat;
}
@ -211,7 +227,7 @@ body.body-small .navbar-top-links li:last-child {
.minimalize-styl-2 {
padding: 4px 12px;
margin: 14px 5px 5px 20px;
margin: 12px 5px 5px 15px;
font-size: 14px;
float: left;
}
@ -368,10 +384,6 @@ body.mini-navbar .navbar-default .nav>li>.nav-second-level li a {
z-index: 2030;
}
.navbar-fixed-top, .navbar-static-top {
background: #f3f3f4;
}
.fixed-nav #wrapper {
padding-top: 60px;
box-sizing: border-box;
@ -460,18 +472,6 @@ body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
.fixed-sidebar.mini-navbar .nav li.active {
border-left-width: 0;
}
/*.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level, .canvas-menu.mini-navbar .nav li:hover>.nav-second-level*/
/*{*/
/*position: absolute;*/
/*left: 70px;*/
/*top: 40px;*/
/*background-color: #2f4050;*/
/*padding: 10px 10px 0 10px;*/
/*font-size: 12px;*/
/*display: block;*/
/*min-width: 140px;*/
/*border-radius: 2px;*/
/*}*/
/*伸缩菜单*/
.fixed-sidebar.mini-navbar .nav li:hover>a> span.nav-label {
@ -485,7 +485,6 @@ body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level {
top: 40px;
font-size: 12px;
/*padding: 10px 10px 0 10px;*/
background-color: #2f4050;
}
@ -6567,391 +6566,24 @@ body.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed
.rtls .ltr-support {
direction: ltr;
}
/*
*
* This is style for skin config
* Use only in demo theme
*
*/
.skin-setttings .title {
background: #efefef;
text-align: center;
text-transform: uppercase;
font-weight: 600;
display: block;
padding: 10px 15px;
font-size: 12px;
}
.setings-item {
padding: 10px 30px;
}
.setings-item.nb {
border: none;
}
.setings-item.skin {
text-align: center;
}
.setings-item .switch {
float: right;
}
.skin-name a {
text-transform: uppercase;
}
.setings-item a {
color: #fff;
}
.default-skin, .blue-skin, .ultra-skin, .yellow-skin {
text-align: center;
}
.default-skin {
font-weight: 600;
background: #1ab394;
}
.default-skin:hover {
background: #199d82;
}
.blue-skin {
font-weight: 600;
background: url("patterns/header-profile-skin-blue.png") repeat scroll 0 0;
}
.blue-skin:hover {
background: #0d8ddb;
}
.yellow-skin {
font-weight: 600;
background: url("patterns/header-profile-skin-yellow.png") repeat scroll 0 100%;
}
.yellow-skin:hover {
background: #ce8735;
}
.content-tabs {
border-bottom: solid 2px #2f4050;
}
.page-tabs a {
color: #999;
}
.page-tabs a i {
color: #ccc;
margin-left: 2px;
font-size: 13px;
}
.page-tabs a.active {
background: #2f4050;
color: #a7b1c2;
}
.page-tabs a.active:hover, .page-tabs a.active i:hover {
background: #293846;
color: #fff;
}
/*
*
* SKIN blue
* NAME - blue/purple
*
*/
.skin-blue .minimalize-styl-2 {
margin: 14px 5px 5px 30px;
}
.skin-blue .navbar-top-links li:last-child {
margin-right: 30px;
}
.skin-blue.fixed-nav .minimalize-styl-2 {
margin: 14px 5px 5px 15px;
}
.skin-blue .spin-icon {
background: #0e9aef !important;
}
.skin-blue .nav-header {
background: #0e9aef;
background: url('patterns/header-profile-skin-blue.png');
}
.skin-blue.mini-navbar .nav-second-level {
background: #3e495f;
}
.skin-blue .breadcrumb {
background: transparent;
}
.skin-blue .page-heading {
border: none;
}
.skin-blue .nav>li.active {
background: #3a4459;
}
.skin-blue .nav>li>a {
color: #9ea6b9;
}
.skin-blue .nav>li.active>a {
color: #fff;
}
.skin-blue .navbar-minimalize {
background: #0e9aef;
border-color: #0e9aef;
}
body.skin-blue {
background: #3e495f;
}
.skin-blue .navbar-static-top {
background: #ffffff;
}
.skin-blue .dashboard-header {
background: transparent;
border-bottom: none !important;
border-top: none;
padding: 20px 30px 10px 30px;
}
.fixed-nav.skin-blue .navbar-fixed-top {
background: #fff;
}
.skin-blue .wrapper-content {
padding: 30px 15px;
}
.skin-blue #page-wrapper {
background: #f4f6fa;
}
.skin-blue .ibox-title, .skin-blue .ibox-content {
border-width: 1px;
}
.skin-blue .ibox-content:last-child {
border-style: solid solid solid solid;
}
.skin-blue .nav>li.active {
border: none;
}
.skin-blue .nav-header {
padding: 35px 25px 25px 25px;
}
.skin-blue .nav-header a.dropdown-toggle {
color: #fff;
margin-top: 10px;
}
.skin-blue .nav-header a.dropdown-toggle .text-muted {
color: #fff;
opacity: 0.8;
}
.skin-blue .profile-element {
text-align: center;
background: #eaedf1;
color: #23508e;
}
.skin-blue .img-circle {
border-radius: 5px;
}
.skin-blue .navbar-default .nav>li>a:hover, .skin-blue .navbar-default .nav>li>a:focus {
background: #39aef5;
color: #fff;
}
.skin-blue .nav.nav-tabs>li.active>a {
color: #555;
}
.skin-blue .content-tabs {
border-bottom: solid 2px #39aef5;
}
.skin-blue .nav.nav-tabs>li.active {
background: transparent;
}
.skin-blue .page-tabs a.active {
background: #39aef5;
color: #fff;
}
.skin-blue .page-tabs a.active:hover, .skin-blue .page-tabs a.active i:hover {
background: #0e9aef;
color: #fff;
}
/*
*
* SKIN Yellow
* NAME - Yellow/purple
*
*/
.skin-yellow .minimalize-styl-2 {
margin: 14px 5px 5px 30px;
}
.skin-yellow .navbar-top-links li:last-child {
margin-right: 30px;
}
.skin-yellow.fixed-nav .minimalize-styl-2 {
margin: 14px 5px 5px 15px;
}
.skin-yellow .spin-icon {
background: #ecba52 !important;
}
body.boxed-layout.skin-yellow #wrapper {
background: #3e2c42;
}
.skin-yellow .nav-header {
background: #ecba52;
background: url('patterns/header-profile-skin-yellow.png');
}
.skin-yellow.mini-navbar .nav-second-level {
background: #3e2c42;
}
.skin-yellow .breadcrumb {
background: transparent;
}
.skin-yellow .page-heading {
border: none;
}
.skin-yellow .nav>li.active {
background: #38283c;
}
.fixed-nav.skin-yellow .navbar-fixed-top {
background: #fff;
}
.skin-yellow .nav>li>a {
color: #948b96;
}
.skin-yellow .nav>li.active>a {
color: #fff;
}
.skin-yellow .navbar-minimalize {
background: #ecba52;
border-color: #ecba52;
}
body.skin-yellow {
background: #3e2c42;
}
.skin-yellow .navbar-static-top {
background: #ffffff;
}
.skin-yellow .dashboard-header {
background: transparent;
border-bottom: none !important;
border-top: none;
padding: 20px 30px 10px 30px;
}
.skin-yellow .wrapper-content {
padding: 30px 15px;
}
.skin-yellow #page-wrapper {
background: #f4f6fa;
}
.skin-yellow .ibox-title, .skin-yellow .ibox-content {
border-width: 1px;
}
.skin-yellow .ibox-content:last-child {
border-style: solid solid solid solid;
}
.skin-yellow .nav>li.active {
border: none;
}
.skin-yellow .nav-header {
padding: 35px 25px 25px 25px;
}
.skin-yellow .nav-header a.dropdown-toggle {
color: #fff;
margin-top: 10px;
}
.skin-yellow .nav-header a.dropdown-toggle .text-muted {
color: #fff;
opacity: 0.8;
}
.skin-yellow .profile-element {
text-align: center;
}
.skin-yellow .img-circle {
border-radius: 5px;
}
.skin-yellow .navbar-default .nav>li>a:hover, .skin-yellow .navbar-default .nav>li>a:focus {
background: #38283c;
color: #fff;
}
.skin-yellow .nav.nav-tabs>li.active>a {
color: #555;
}
.skin-yellow .nav.nav-tabs>li.active {
background: transparent;
}
.skin-yellow .content-tabs {
border-bottom: solid 2px #3e2c42;
}
.skin-yellow .nav.nav-tabs>li.active {
background: transparent;
}
.skin-yellow .page-tabs a.active {
background: #3e2c42;
color: #fff;
}
.skin-yellow .page-tabs a.active:hover, .skin-yellow .page-tabs a.active i:hover {
background: #38283c;
color: #fff;
.page-tabs a.active:hover,
.page-tabs a.active i:hover {
background: #eaedf1;
color: #23508e;
}
@media ( min-width : 768px) {
@ -7279,7 +6911,8 @@ body.skin-yellow {
}
.navbar-header {
width: 60%;
width: 10%;
height: 50px;
}
.bs-glyphicons {
@ -7347,3 +6980,99 @@ body.skin-yellow {
border-color: #cccccc!important;
}
.folder-list li.active a {
color: #2791df;
background: #f5f5f5;
}
.nav .logo {
background-color: #367fa9;
color: #fff;
border-bottom: 0 solid transparent;
-webkit-transition: width .3s ease-in-out;
-o-transition: width .3s ease-in-out;
transition: width .3s ease-in-out;
display: block;
height: 50px;
font-size: 20px;
line-height: 50px;
text-align: center;
width: 220px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
padding: 0 15px;
font-weight: 300;
overflow: hidden
}
.logo-mini {
display: none;
}
.logo-lg {
display: block;
}
.roleList {
color: #d5d5d5;
margin-right: 10px;
padding-top: 10px;
line-height: 1;
white-space: nowrap;
overflow: hidden;
width: 110px;
}
.sidebar-collapse .user-panel {
white-space: nowrap;
position: relative;
width: 100%;
padding: 15px;
overflow: hidden;
}
.sidebar-collapse .user-panel .image>img {
width: 100%;
max-width: 45px;
height: auto;
}
.sidebar-collapse .user-panel>.info {
padding: 5px 5px 5px 15px;
line-height: 1;
position: absolute;
left: 55px;
}
.sidebar-collapse .user-panel>.info a {
color: #fff;
font-size: 12px;
}
.sidebar-collapse .user-panel>.info>p {
font-weight: 600;
margin-bottom: 9px;
color: #fff;
font-size: 12px;
}
.user-panel>.info>a>.fa,
.user-panel>.info>a>.ion,
.user-panel>.info>a>.glyphicon {
margin-right: 3px;
}
.nav>li:hover .dropdown-menu {
display: block;
}
#content-main.max {
height: calc(100% - 110px);
overflow: hidden;
width: 100%;
height: 100%;
left: 0px;
position: absolute;
top: 0px;
z-index: 9998;
margin: 0;
}

@ -1,6 +1,6 @@
/**
* css
* Copyright (c) 2018 ruoyi
* Copyright (c) 2019 ruoyi
*/
/** 基础通用 **/
@ -13,6 +13,18 @@
.pb5 {
padding-bottom: 5px;
}
.mt5 {
margin-top: 5px;
}
.mr5 {
margin-right: 5px;
}
.mb5 {
margin-bottom: 5px;
}
.ml5 {
margin-left: 5px;
}
.mt10 {
margin-top: 10px;
}
@ -38,6 +50,14 @@
margin-left: 20px;
}
/** 弹层组件 禁用样式 **/
.layer-disabled {
border: 1px #dedede solid !important;
background-color: #f1f1f1 !important;
color: #333 !important;
pointer-events: none;
}
/** 用户管理 样式布局 **/
.box {
position: relative;
@ -481,3 +501,35 @@ label {
display: none;
color: #ccc;
}
.navbar-right > .user-menu > .dropdown-menu {
border-top-right-radius:0;
border-top-left-radius:0;
padding:1px 0 0 0;
border-top-width:0;
width:138px;
}
.navbar-right > .user-menu .user-image {
float:left;
width:27px;
height:27px;
border-radius:50%;
margin-right:8px;
margin-top:-3px;
}
@media (max-width:767px) {
.navbar-right > .user-menu .user-image {
float:none;
margin-right:0;
margin-top:-8px;
line-height:10px;
}
}.dropdown-menu > li > a > .glyphicon,.dropdown-menu > li > a > .fa,.dropdown-menu > li > a > .ion {
margin-right:10px;
}
.dropdown-menu > li > a:hover {
background-color:#e1e3e9;
color:#333;
}
.dropdown-menu > .divider {
background-color:#eee;
}

@ -1,6 +1,12 @@
/**
* 菜单处理
* 首页方法封装处理
* Copyright (c) 2019 ruoyi
*/
layer.config({
extend: 'moon/style.css',
skin: 'layer-ext-moon'
});
$(function() {
// MetsiMenu
$('#side-menu').metisMenu();
@ -45,6 +51,7 @@ function() {
if ($(this).width() < 769) {
$('body').addClass('mini-navbar');
$('.navbar-static-side').fadeIn();
$(".sidebar-collapse .logo").addClass("hide");
}
});
@ -55,12 +62,14 @@ function NavToggle() {
function SmoothlyMenu() {
if (!$('body').hasClass('mini-navbar')) {
$('#side-menu').hide();
$(".sidebar-collapse .logo").removeClass("hide");
setTimeout(function() {
$('#side-menu').fadeIn(500);
},
100);
} else if ($('body').hasClass('fixed-sidebar')) {
$('#side-menu').hide();
$(".sidebar-collapse .logo").addClass("hide");
setTimeout(function() {
$('#side-menu').fadeIn(500);
},

@ -1,8 +1,7 @@
/**
* 通用方法封装处理
* Copyright (c) 2018 ruoyi
* Copyright (c) 2019 ruoyi
*/
$(function() {
// select2复选框事件绑定
if ($.fn.select2 !== undefined) {
@ -191,3 +190,7 @@ $.ajaxSetup({
}
}
});
layer.config({
extend: 'moon/style.css',
skin: 'layer-ext-moon'
});

@ -1,6 +1,6 @@
/**
* 通用js方法封装处理
* Copyright (c) 2018 ruoyi
* Copyright (c) 2019 ruoyi
*/
(function ($) {
$.extend({
@ -18,6 +18,7 @@
_sortName = $.common.isEmpty(options.sortName) ? "" : options.sortName;
_striped = $.common.isEmpty(options.striped) ? false : options.striped;
_escape = $.common.isEmpty(options.escape) ? false : options.escape;
_showFooter = $.common.isEmpty(options.showFooter) ? false : options.showFooter;
$('#bootstrap-table').bootstrapTable({
url: options.url, // 请求后台的URL*
contentType: "application/x-www-form-urlencoded", // 编码类型
@ -33,6 +34,7 @@
pageSize: 10, // 每页的记录行数(*
pageList: [10, 25, 50], // 可供选择的每页的行数(*
escape: _escape, // 转义HTML字符串
showFooter: _showFooter, // 是否显示表尾
iconSize: 'outline', // 图标大小undefined默认的按钮尺寸 xs超小按钮sm小按钮lg大按钮
toolbar: '#toolbar', // 指定工作栏
sidePagination: "server", // 启用服务端分页
@ -121,7 +123,7 @@
$.form.reset(currentId);
layer.open({
type: 1,
area: ['400px'],
area: ['400px', '230px'],
fix: false,
//不固定
maxmin: true,
@ -138,12 +140,11 @@
return false;
}
var index = layer.load(2, {shade: false});
var url = prefix + "/importData";
var formData = new FormData();
formData.append("file", $('#file')[0].files[0]);
formData.append("updateSupport", $("input[name='updateSupport']").is(':checked'));
$.ajax({
url: url,
url: $.table._option.importUrl,
data: formData,
cache: false,
contentType: false,
@ -466,6 +467,14 @@
});
layer.full(index);
},
// 禁用按钮
disable: function() {
$("a[class*=layui-layer-btn]", window.parent.document).addClass("layer-disabled");
},
// 启用按钮
enable: function() {
$("a[class*=layui-layer-btn]", window.parent.document).removeClass("layer-disabled");
},
// 打开遮罩层
loading: function (message) {
$.blockUI({ message: '<div class="loaderbox"><div class="loading-activity"></div> ' + message + '</div>' });
@ -485,12 +494,14 @@
operate: {
// 提交数据
submit: function(url, type, dataType, data) {
$.modal.loading("正在处理中,请稍后...");
var config = {
url: url,
type: type,
dataType: dataType,
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍后...");
},
success: function(result) {
$.operate.ajaxSuccess(result);
}
@ -608,12 +619,15 @@
},
// 保存信息
save: function(url, data) {
$.modal.loading("正在处理中,请稍后...");
var config = {
url: url,
type: "post",
dataType: "json",
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍后...");
$.modal.disable();
},
success: function(result) {
$.operate.successCallback(result);
}
@ -657,6 +671,7 @@
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
$.modal.enable();
}
},
// 校验封装处理

@ -22,7 +22,7 @@
<!-- bootstrap-table 表格插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/toolbar/bootstrap-table-toolbar.min.js}"></script>
<!-- jquery-validate 表单验证插件 -->
<script th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script>
@ -38,8 +38,8 @@
<script th:src="@{/ajax/libs/iCheck/icheck.min.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ajax/libs/layui/layui.js}"></script>
<script th:src="@{/ruoyi/js/common.js?v=3.1.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.1.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=3.2.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.2.0}"></script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script>
<script th:inline="javascript"> var ctx = [[@{/}]]; </script>
</div>

@ -15,7 +15,8 @@
<link th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
<link th:href="@{/css/animate.css}" rel="stylesheet"/>
<link th:href="@{/css/style.css}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=3.1.0}" rel="stylesheet"/>
<link th:href="@{/css/skins.css}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=3.2.0}" rel="stylesheet"/>
<style type="text/css">
.nav > li:hover .dropdown-menu {display: block;}
#content-main.max { height: calc(100% - 110px); overflow: hidden; width: 100%; height: 100%; left: 0px; position: absolute; top: 0px; z-index: 9998; margin: 0; }
@ -31,19 +32,24 @@
</div>
<div class="sidebar-collapse">
<ul class="nav" id="side-menu">
<li class="nav-header">
<div class="dropdown profile-element"> <span>
<img th:src="(${user.avatar} == '') ? @{/img/profile.jpg} : @{/profile/avatar/} + ${user.avatar}" alt="image" class="img-circle" height="60" width="60"/></span>
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="clear"><span class="block m-t-xs"><strong class="font-bold" th:text="${user.userName}">用户</strong></span>
<span class="text-muted text-xs block"><span th:text="${user.dept?.deptName}">部门</span> <b class="caret"></b></span> </span> </a>
<ul class="dropdown-menu animated fadeInRight m-t-xs">
<li><a class="menuItem" th:href="@{/system/user/profile}">个人信息</a></li>
<li class="divider"></li>
<li><a th:href="@{logout}">退出</a></li>
</ul>
</div>
</li>
<li class="logo">
<span class="logo-lg">RuoYi</span>
</li>
<li>
<div class="user-panel">
<a class="menuItem" title="个人中心" th:href="@{/system/user/profile}">
<div class="hide" th:text="个人中心"></div>
<div class="pull-left image">
<img th:src="(${user.avatar} == '') ? @{/img/profile.jpg} : @{/profile/avatar/} + ${user.avatar}" class="img-circle" alt="User Image">
</div>
</a>
<div class="pull-left info">
<p>[[${user.loginName}]]</p>
<a href="#"><i class="fa fa-circle text-success"></i> 在线</a>
<a th:href="@{logout}" style="padding-left:5px;"><i class="fa fa-sign-out text-danger"></i> 注销</a>
</div>
</div>
</li>
<li class="active">
<a href="index.html"><i class="fa fa-home"></i> <span class="nav-label">主页</span> <span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
@ -74,20 +80,35 @@
<!--右侧部分开始-->
<div id="page-wrapper" class="gray-bg dashbard-1">
<div class="row border-bottom">
<nav class="navbar navbar-static-top" role="navigation"
style="margin-bottom: 0">
<nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<a class="navbar-minimalize minimalize-styl-2 btn btn-default " href="#" title="收起菜单">
<a class="navbar-minimalize minimalize-styl-2" style="color:#FFF;" href="#" title="收起菜单">
<i class="fa fa-bars"></i>
</a>
</div>
<ul class="nav navbar-top-links navbar-right welcome-message">
<li>
<span class="m-r-sm text-muted">欢迎来到若依管理后台.</span>
</li>
<li><a id="fullScreen"><i class="fa fa-arrows-alt"></i>全屏</a></li>
<li><a th:href="@{logout}"><i class="fa fa-sign-out"></i>退出</a></li>
<li><a title="全屏显示" id="fullScreen"><i class="fa fa-arrows-alt"></i> 全屏显示</a></li>
<li class="dropdown user-menu">
<a href="javascript:" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown">
<img th:src="(${user.avatar} == '') ? @{/img/profile.jpg} : @{/profile/avatar/} + ${user.avatar}" class="user-image">
<span class="hidden-xs">[[${user.userName}]]</span>
</a>
<ul class="dropdown-menu">
<li class="mt5">
<a th:href="@{/system/user/profile}" class="menuItem">
<i class="fa fa-user"></i> 个人中心</a>
</li>
<li>
<a onclick="resetPwd()" class="menuItem">
<i class="fa fa-key"></i> 修改密码</a>
</li>
<li class="divider"></li>
<li>
<a th:href="@{logout}">
<i class="fa fa-sign-out"></i> 退出登录</a>
</li>
</ul>
</li>
</ul>
</nav>
</div>
@ -137,8 +158,16 @@
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.1.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.2.0}"></script>
<script th:src="@{/ruoyi/index.js}"></script>
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
<script th:inline="javascript">
var ctx = [[@{/}]];
/*用户管理-重置密码*/
function resetPwd() {
var url = ctx + 'system/user/profile/resetPwd';
$.modal.open("重置密码", url, '800', '500');
}
</script>
</body>
</html>

@ -11,7 +11,7 @@
<link href="../static/css/font-awesome.min.css" th:href="@{css/font-awesome.min.css}" rel="stylesheet"/>
<link href="../static/css/style.css" th:href="@{css/style.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{css/login.min.css}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=3.1.0}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=3.2.0}" rel="stylesheet"/>
<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;ie.html" />
<![endif]-->
@ -83,7 +83,7 @@
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=3.1.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=3.2.0}"></script>
<script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script>
</body>
</html>

@ -94,13 +94,53 @@
<div class="ibox-content no-padding">
<div class="panel-body">
<div class="panel-group" id="version">
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v32">v3.2.0</a><code class="pull-right">2019.01.18</code>
</h5>
</div>
<div id="v32" class="panel-collapse collapse in">
<div class="panel-body">
<ol>
<li>部门修改时不允许选择最后节点</li>
<li>修复部门菜单排序字段无效</li>
<li>修复光驱磁盘导致服务监控异常</li>
<li>登录界面去除check插件</li>
<li>验证码文本字符间距修正</li>
<li>升级SpringBoot到最新版本2.1.1</li>
<li>升级MYSQL驱动</li>
<li>修正登录必填项位置偏移</li>
<li>Session会话检查优化</li>
<li>Excel注解支持多级获取</li>
<li>新增序列号生成方法</li>
<li>修复WAR部署tomcat退出线程异常</li>
<li>全屏操作增加默认确认/关闭</li>
<li>修复个人信息可能导致漏洞</li>
<li>字典数据根据下拉选择新增类型</li>
<li>升级Summernote到最新版本v0.8.11</li>
<li>新增用户数据导入</li>
<li>首页主题样式更换</li>
<li>layer扩展主题更换</li>
<li>用户管理移动端默认隐藏左侧布局</li>
<li>详细信息弹出层显示在顶层</li>
<li>表格支持切换状态(用户/角色/定时任务)</li>
<li>Druid数据源支持配置继承</li>
<li>修正部分iPhone手机端表格适配问题</li>
<li>新增防止重复提交表单方法</li>
<li>新增表格数据统计汇总方法</li>
<li>支持富文本上传图片文件</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v31">v3.1.0</a><code class="pull-right">2018.12.03</code>
</h5>
</div>
<div id="v31" class="panel-collapse collapse in">
<div id="v31" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>新增内网不获取IP地址</li>

@ -107,12 +107,12 @@
title: '执行表达式'
},
{
field: 'status',
title: '任务状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
visible: statusFlag == 'hidden' ? false : true,
title: '任务状态',
align: 'center',
formatter: function (value, row, index) {
return statusTools(row);
}
},
{
field: 'createTime',
@ -124,7 +124,6 @@
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push(statusTools(row));
actions.push('<a class="btn btn-primary btn-xs ' + statusFlag + '" href="#" onclick="run(\'' + row.jobId + '\')"><i class="fa fa-play-circle-o"></i> 执行</a> ');
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="#" onclick="$.operate.detail(\'' + row.jobId + '\')"><i class="fa fa-search"></i>详细</a> ');
return actions.join('');
@ -133,37 +132,38 @@
};
$.table.init(options);
});
/* 调度任务状态显示 */
function statusTools(row) {
if (row.status == 1) {
return '<a class="btn btn-info btn-xs ' + statusFlag + '" href="#" onclick="start(\'' + row.jobId + '\')"><i class="fa fa-play"></i>启用</a> ';
} else {
return '<a class="btn btn-danger btn-xs ' + statusFlag + '" href="#" onclick="stop(\'' + row.jobId + '\')"><i class="fa fa-pause"></i>暂停</a> ';
}
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="start(\'' + row.jobId + '\')"></i> ';
} else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="stop(\'' + row.jobId + '\')"></i> ';
}
}
/*立即执行一次*/
/* 立即执行一次 */
function run(jobId) {
$.modal.confirm("确认要立即执行任务吗?", function() {
$.operate.post(prefix + "/run", { "jobId": jobId});
})
}
/*调度任务-停用*/
/* 调度任务-停用 */
function stop(jobId) {
$.modal.confirm("确认要停用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 1 });
})
}
/*调度任务-启用*/
/* 调度任务-启用 */
function start(jobId) {
$.modal.confirm("确认要启用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 0 });
})
}
//调度日志查询
/* 调度日志查询 */
function jobLog(id) {
var url = ctx + 'monitor/jobLog';
createMenuItem(url, "调度日志");

@ -47,8 +47,38 @@
$('.summernote').summernote({
height : '220px',
lang : 'zh-CN'
lang : 'zh-CN',
callbacks: {
onImageUpload: function (files) {
sendFile(files[0], this);
}
}
});
// 上传文件
function sendFile(file, obj) {
var data = new FormData();
data.append("file", file);
$.ajax({
type: "POST",
url: ctx + "common/upload",
data: data,
cache: false,
contentType: false,
processData: false,
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
$(obj).summernote('editor.insertImage', result.url, result.fileName);
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertWarning("图片上传失败。");
}
});
}
$("#form-notice-add").validate({
rules:{

@ -48,13 +48,43 @@
$(function() {
$('.summernote').summernote({
height : '220px',
lang : 'zh-CN'
height : '220px',
lang : 'zh-CN',
callbacks: {
onImageUpload: function (files) {
sendFile(files[0], this);
}
}
});
var content = $("#noticeContent").val();
$('#editor').summernote('code', content);
});
// 上传文件
function sendFile(file, obj) {
var data = new FormData();
data.append("file", file);
$.ajax({
type: "POST",
url: ctx + "common/upload",
data: data,
cache: false,
contentType: false,
processData: false,
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
$(obj).summernote('editor.insertImage', result.url, result.fileName);
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertWarning("图片上传失败。");
}
});
}
$("#form-notice-edit").validate({
rules:{
noticeTitle:{

@ -100,12 +100,12 @@
sortable: true
},
{
field: 'status',
title: '状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
visible: editFlag == 'hidden' ? false : true,
title: '角色状态',
align: 'center',
formatter: function (value, row, index) {
return statusTools(row);
}
},
{
field: 'createTime',
@ -127,11 +127,34 @@
$.table.init(options);
});
/*角色管理-分配数据权限*/
/* 角色管理-分配数据权限 */
function rule(roleId) {
var url = prefix + '/rule/' + roleId;
$.modal.open("分配数据权限", url);
}
/* 角色状态显示 */
function statusTools(row) {
if (row.status == 1) {
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enable(\'' + row.roleId + '\')"></i> ';
} else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="disable(\'' + row.roleId + '\')"></i> ';
}
}
/* 角色管理-停用 */
function disable(roleId) {
$.modal.confirm("确认要停用角色吗?", function() {
$.operate.post(prefix + "/changeStatus", { "roleId": roleId, "status": 1 });
})
}
/* 角色管理启用 */
function enable(roleId) {
$.modal.confirm("确认要启用角色吗?", function() {
$.operate.post(prefix + "/changeStatus", { "roleId": roleId, "status": 0 });
})
}
</script>
</body>
</html>

@ -151,12 +151,12 @@
title: '手机'
},
{
field: 'status',
title: '状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
visible: editFlag == 'hidden' ? false : true,
title: '用户状态',
align: 'center',
formatter: function (value, row, index) {
return statusTools(row);
}
},
{
field: 'createTime',
@ -211,17 +211,40 @@
queryDeptTree();
});
/*用户管理-部门*/
/* 用户管理-部门 */
function dept() {
var url = ctx + "system/dept";
createMenuItem(url, "部门管理");
}
/*用户管理-重置密码*/
/* 用户管理-重置密码 */
function resetPwd(userId) {
var url = prefix + '/resetPwd/' + userId;
$.modal.open("重置密码", url, '800', '300');
}
/* 用户状态显示 */
function statusTools(row) {
if (row.status == 1) {
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enable(\'' + row.userId + '\')"></i> ';
} else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="disable(\'' + row.userId + '\')"></i> ';
}
}
/* 用户管理-停用 */
function disable(userId) {
$.modal.confirm("确认要停用用户吗?", function() {
$.operate.post(prefix + "/changeStatus", { "userId": userId, "status": 1 });
})
}
/* 用户管理启用 */
function enable(userId) {
$.modal.confirm("确认要启用用户吗?", function() {
$.operate.post(prefix + "/changeStatus", { "userId": userId, "status": 0 });
})
}
</script>
</body>
<form id="importForm" enctype="multipart/form-data" class="mt20 mb10" style="display: none;">

@ -122,13 +122,21 @@ public class Global
}
/**
*
*
*/
public static String getDownloadPath()
{
return getConfig("ruoyi.profile") + "download/";
}
/**
*
*/
public static String getUploadPath()
{
return getConfig("ruoyi.profile") + "upload/";
}
/**
*
*/

@ -30,9 +30,9 @@ import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.annotation.Excel;
@ -133,7 +133,7 @@ public class ExcelUtil<T>
public List<T> importExcel(String sheetName, InputStream is) throws Exception
{
this.type = Type.IMPORT;
this.wb = new XSSFWorkbook(is);
this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>();
Sheet sheet = null;
if (StringUtils.isNotEmpty(sheetName))

@ -8,8 +8,10 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.framework.config.properties.DruidProperties;
import com.ruoyi.framework.datasource.DynamicDataSource;
/**
@ -22,17 +24,19 @@ public class DruidConfig
{
@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource()
public DataSource masterDataSource(DruidProperties druidProperties)
{
return DruidDataSourceBuilder.create().build();
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}
@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
public DataSource slaveDataSource()
public DataSource slaveDataSource(DruidProperties druidProperties)
{
return DruidDataSourceBuilder.create().build();
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}
@Bean(name = "dynamicDataSource")

@ -0,0 +1,40 @@
package com.ruoyi.framework.config;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
*
*
* @author ruoyi
*
*/
@Component
public class ServerConfig implements ApplicationListener<WebServerInitializedEvent>
{
private int serverPort;
public String getUrl()
{
InetAddress address = null;
try
{
address = InetAddress.getLocalHost();
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
return "http://" + address.getHostAddress() + ":" + this.serverPort;
}
@Override
public void onApplicationEvent(WebServerInitializedEvent event)
{
this.serverPort = event.getWebServer().getPort();
}
}

@ -0,0 +1,77 @@
package com.ruoyi.framework.config.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
/**
* druid
*
* @author ruoyi
*/
@Configuration
public class DruidProperties
{
@Value("${spring.datasource.druid.initialSize}")
private int initialSize;
@Value("${spring.datasource.druid.minIdle}")
private int minIdle;
@Value("${spring.datasource.druid.maxActive}")
private int maxActive;
@Value("${spring.datasource.druid.maxWait}")
private int maxWait;
@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
private int maxEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.druid.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.druid.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.druid.testOnReturn}")
private boolean testOnReturn;
public DruidDataSource dataSource(DruidDataSource datasource)
{
/** 配置初始化大小、最小、最大 */
datasource.setInitialSize(initialSize);
datasource.setMaxActive(maxActive);
datasource.setMinIdle(minIdle);
/** 配置获取连接等待超时的时间 */
datasource.setMaxWait(maxWait);
/** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
/** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
/**
* sqlselect 'x'validationQuerynulltestOnBorrowtestOnReturntestWhileIdle
*/
datasource.setValidationQuery(validationQuery);
/** 建议配置为true不影响性能并且保证安全性。申请连接的时候检测如果空闲时间大于timeBetweenEvictionRunsMillis执行validationQuery检测连接是否有效。 */
datasource.setTestWhileIdle(testWhileIdle);
/** 申请连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。 */
datasource.setTestOnBorrow(testOnBorrow);
/** 归还连接时执行validationQuery检测连接是否有效做了这个配置会降低性能。 */
datasource.setTestOnReturn(testOnReturn);
return datasource;
}
}

@ -114,4 +114,12 @@ public interface ISysRoleService
* @return
*/
public int countUserRoleByRoleId(Long roleId);
/**
*
*
* @param role
* @return
*/
public int changeStatus(SysRole role);
}

@ -148,4 +148,12 @@ public interface ISysUserService
* @return
*/
public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
/**
*
*
* @param user
* @return
*/
public int changeStatus(SysUser user);
}

@ -298,4 +298,16 @@ public class SysRoleServiceImpl implements ISysRoleService
{
return userRoleMapper.countUserRoleByRoleId(roleId);
}
/**
*
*
* @param role
* @return
*/
@Override
public int changeStatus(SysRole role)
{
return roleMapper.updateRole(role);
}
}

@ -49,7 +49,7 @@ public class SysUserServiceImpl implements ISysUserService
@Autowired
private SysUserRoleMapper userRoleMapper;
@Autowired
private ISysConfigService configService;
@ -371,6 +371,7 @@ public class SysUserServiceImpl implements ISysUserService
* @param operName
* @return
*/
@Override
public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
{
if (StringUtils.isNull(userList) || userList.size() == 0)
@ -428,4 +429,20 @@ public class SysUserServiceImpl implements ISysUserService
}
return successMsg.toString();
}
/**
*
*
* @param user
* @return
*/
@Override
public int changeStatus(SysUser user)
{
if (SysUser.isAdmin(user.getUserId()))
{
throw new BusinessException("不允许修改超级管理员用户");
}
return userMapper.updateUser(user);
}
}

@ -514,7 +514,7 @@ create table sys_config (
primary key (config_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '参数配置表';
insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-default', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '默认 skin-default、蓝色 skin-blue、黄色 skin-yellow' );
insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '初始化密码 123456' );
@ -607,7 +607,7 @@ create table sys_notice (
notice_id int(4) not null auto_increment comment '公告ID',
notice_title varchar(50) not null comment '公告标题',
notice_type char(1) not null comment '公告类型1通知 2公告',
notice_content varchar(500) default '' comment '公告内容',
notice_content varchar(2000) default '' comment '公告内容',
status char(1) default '0' comment '公告状态0正常 1关闭',
create_by varchar(64) default '' comment '创建者',
create_time datetime comment '创建时间',
Loading…
Cancel
Save