mirror of
https://github.com/dqjdda/Aurora.git
synced 2018-11-06 05:33:29 +00:00
集成WebSocket实时输出日志到页面,更新SQl文件
This commit is contained in:
@@ -10,7 +10,7 @@ Aurora是一个简单高效的后台管理系统。项目基础框架采用全
|
||||
|
||||
- <del>用户个人中心</del>
|
||||
- <del>部门管理,组织结构</del>
|
||||
- 短信模块
|
||||
- <del>阿里短信</del>
|
||||
- 站内信模块
|
||||
- 工作流
|
||||
|
||||
@@ -48,6 +48,7 @@ Aurora是一个简单高效的后台管理系统。项目基础框架采用全
|
||||
│ ├─字典管理
|
||||
│ └─接口文档
|
||||
├─系统监控
|
||||
│ ├─实时控制台
|
||||
│ ├─Redis终端
|
||||
│ ├─SQL监控
|
||||
│ ├─在线用户
|
||||
@@ -115,11 +116,7 @@ Aurora是一个简单高效的后台管理系统。项目基础框架采用全
|
||||
|
||||
- 系统首页
|
||||
|
||||

|
||||
|
||||
- 用户管理
|
||||
|
||||

|
||||

|
||||
|
||||
- 组织结构
|
||||
|
||||
@@ -137,10 +134,6 @@ Aurora是一个简单高效的后台管理系统。项目基础框架采用全
|
||||
|
||||

|
||||
|
||||
- swagger文档
|
||||
|
||||

|
||||
|
||||
- Redis终端
|
||||
|
||||

|
||||
@@ -149,9 +142,9 @@ Aurora是一个简单高效的后台管理系统。项目基础框架采用全
|
||||
|
||||

|
||||
|
||||
- 发送邮件功能
|
||||
- 实时控制台
|
||||
|
||||

|
||||

|
||||
|
||||
### 开发与部署
|
||||
账号:aurora 密码:123456
|
||||
|
||||
@@ -76,6 +76,12 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--websocket-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
<!--spring boot相关依赖 end-->
|
||||
|
||||
<!-- shiro-redis -->
|
||||
|
||||
@@ -3,19 +3,20 @@ package me.aurora;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.web.servlet.ServletComponentScan;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
|
||||
|
||||
@Controller
|
||||
@EnableCaching
|
||||
@EnableScheduling
|
||||
@SpringBootApplication
|
||||
@EnableTransactionManagement
|
||||
@EnableWebSocketMessageBroker
|
||||
/**
|
||||
* @author 郑杰
|
||||
* @date 2018/08/21 11:54:10
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
package me.aurora.app.rest.common;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.aurora.annotation.Log;
|
||||
import me.aurora.domain.ResponseEntity;
|
||||
import me.aurora.domain.User;
|
||||
import me.aurora.service.SysLogService;
|
||||
import me.aurora.service.WebCountService;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
@@ -18,6 +22,7 @@ import java.util.Map;
|
||||
* @author 郑杰
|
||||
* @date 2018/09/25 19:08:41
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
public class CommonController {
|
||||
|
||||
@@ -37,7 +42,7 @@ public class CommonController {
|
||||
* 访问量计数
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/pageviews/plusCount")
|
||||
@GetMapping(value = "/pageviews/plusCount")
|
||||
public ResponseEntity plusCount(){
|
||||
webCountService.save();
|
||||
return ResponseEntity.ok();
|
||||
@@ -47,7 +52,7 @@ public class CommonController {
|
||||
* 访问量查询
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/pageviews/get")
|
||||
@GetMapping(value = "/pageviews/get")
|
||||
public Map getCount(){
|
||||
Map map = new HashMap();
|
||||
map.put("pv",webCountService.findByDate(LocalDate.now().toString()).getCounts());
|
||||
@@ -56,4 +61,18 @@ public class CommonController {
|
||||
map.put("weekIp",sysLogService.getWeekIP());
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 去实时日志页面
|
||||
* @param model
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/logMsg/index")
|
||||
public ModelAndView logMsgIndex(Model model){
|
||||
User user = (User) SecurityUtils.getSubject().getPrincipal();
|
||||
String osName = System.getProperty("os.name");
|
||||
model.addAttribute("osName", osName);
|
||||
model.addAttribute("userName", user.getUsername());
|
||||
return new ModelAndView("/system/logMessage/index");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package me.aurora.config.logMessage;
|
||||
|
||||
import ch.qos.logback.classic.spi.ILoggingEvent;
|
||||
import ch.qos.logback.classic.spi.IThrowableProxy;
|
||||
import ch.qos.logback.core.spi.FilterReply;
|
||||
import me.aurora.domain.utils.LogMessage;
|
||||
import ch.qos.logback.core.filter.Filter;
|
||||
import java.text.DateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 定义Logfilter拦截输出日志
|
||||
* @author 郑杰
|
||||
* @date 2018/10/30 20:49:16
|
||||
*/
|
||||
public class LogFilter extends Filter<ILoggingEvent>{
|
||||
|
||||
@Override
|
||||
public FilterReply decide(ILoggingEvent event) {
|
||||
String exception = "";
|
||||
IThrowableProxy iThrowableProxy1 = event.getThrowableProxy();
|
||||
if(iThrowableProxy1!=null){
|
||||
exception = "<span class='excehtext'>"+iThrowableProxy1.getClassName()+" "+iThrowableProxy1.getMessage()+"</span></br>";
|
||||
for(int i=0; i<iThrowableProxy1.getStackTraceElementProxyArray().length;i++){
|
||||
exception += "<span class='excetext'>"+iThrowableProxy1.getStackTraceElementProxyArray()[i].toString()+"</span></br>";
|
||||
}
|
||||
}
|
||||
LogMessage loggerMessage = new LogMessage(
|
||||
event.getMessage()
|
||||
, DateFormat.getDateTimeInstance().format(new Date(event.getTimeStamp())),
|
||||
event.getThreadName(),
|
||||
event.getLoggerName(),
|
||||
event.getLevel().levelStr
|
||||
);
|
||||
LoggerQueue.getInstance().push(loggerMessage);
|
||||
return FilterReply.ACCEPT;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package me.aurora.config.logMessage;
|
||||
|
||||
import me.aurora.domain.utils.LogMessage;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
/**
|
||||
* 创建一个阻塞队列,作为日志系统输出的日志的一个临时载体
|
||||
* @author 郑杰
|
||||
* @date 2018/10/30 19:56:37
|
||||
*/
|
||||
public class LoggerQueue {
|
||||
|
||||
//队列大小
|
||||
public static final int QUEUE_MAX_SIZE = 10000;
|
||||
|
||||
private static LoggerQueue alarmMessageQueue = new LoggerQueue();
|
||||
//阻塞队列
|
||||
private BlockingQueue blockingQueue = new LinkedBlockingQueue<>(QUEUE_MAX_SIZE);
|
||||
|
||||
private LoggerQueue() {
|
||||
}
|
||||
|
||||
public static LoggerQueue getInstance() {
|
||||
return alarmMessageQueue;
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息入队
|
||||
*
|
||||
* @param log
|
||||
* @return
|
||||
*/
|
||||
public boolean push(LogMessage log) {
|
||||
return this.blockingQueue.add(log);//队列满了就抛出异常,不阻塞
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息出队
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public LogMessage poll() {
|
||||
LogMessage result = null;
|
||||
try {
|
||||
result = (LogMessage) this.blockingQueue.take();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package me.aurora.config.logMessage;
|
||||
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.aurora.domain.utils.LogMessage;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
||||
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
|
||||
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* 配置WebSocket消息代理端点,即stomp服务端
|
||||
* @author 郑杰
|
||||
*/
|
||||
@Slf4j
|
||||
@Configuration
|
||||
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
|
||||
|
||||
@Autowired
|
||||
private SimpMessagingTemplate messagingTemplate;
|
||||
|
||||
@Override
|
||||
public void registerStompEndpoints(StompEndpointRegistry registry) {
|
||||
registry.addEndpoint("/websocket")
|
||||
.setAllowedOrigins("*")
|
||||
.withSockJS();
|
||||
}
|
||||
|
||||
/**
|
||||
* 推送日志到/topic/pullLogger
|
||||
*/
|
||||
@PostConstruct
|
||||
public void pushLogger(){
|
||||
ExecutorService executorService= Executors.newFixedThreadPool(2);
|
||||
Runnable runnable=new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
try {
|
||||
LogMessage log = LoggerQueue.getInstance().poll();
|
||||
if(log!=null && !log.getClassName().equals("jdbc.resultsettable")){
|
||||
if(messagingTemplate!=null)
|
||||
messagingTemplate.convertAndSend("/topic/pullLogger",log);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
executorService.submit(runnable);
|
||||
executorService.submit(runnable);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package me.aurora.config.redis;
|
||||
import afu.org.checkerframework.checker.oigj.qual.O;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
@@ -34,6 +35,7 @@ import java.time.Duration;
|
||||
* @author 郑杰
|
||||
* @date 2018/09/18 11:29:01
|
||||
*/
|
||||
@Slf4j
|
||||
@Configuration
|
||||
public class RedisConfig extends CachingConfigurerSupport {
|
||||
|
||||
@@ -143,6 +145,7 @@ public class RedisConfig extends CachingConfigurerSupport {
|
||||
for (Object obj : params) {
|
||||
sb.append(obj.toString());
|
||||
}
|
||||
log.info(sb.toString());
|
||||
return sb.toString();
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package me.aurora.domain.utils;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author 郑杰
|
||||
* @date 2018/10/30 19:55:46
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class LogMessage {
|
||||
|
||||
private String body;
|
||||
private String timestamp;
|
||||
private String threadName;
|
||||
private String className;
|
||||
private String level;
|
||||
}
|
||||
@@ -72,9 +72,6 @@ public class AddressUtils {
|
||||
break;
|
||||
}
|
||||
DataBlock dataBlock = null;
|
||||
if (!Util.isIpAddress(ip)) {
|
||||
log.error("Error: Invalid ip address");
|
||||
}
|
||||
dataBlock = (DataBlock) method.invoke(searcher, ip);
|
||||
String address = dataBlock.getRegion().replace("0|","");
|
||||
if(address.charAt(address.length()-1) == '|'){
|
||||
|
||||
@@ -123,7 +123,7 @@ aurora:
|
||||
# rememberMe cookie有效时长,默认86400秒,即一天
|
||||
cookieTimeout: 86400
|
||||
# 免认证的路径配置,如静态资源,注册页面,验证码请求,swagger等~
|
||||
anonUrls: /css/**,/js/**,/my/**,/images/**,/user/regist,/plugins/**,/test/**,/signUp.html,/logout,/login
|
||||
anonUrls: /css/**,/js/**,/my/**,/images/**,/user/regist,/plugins/**,/test/**,/signUp.html,/logout,/login,/websocket,/topic/pullLogger
|
||||
# 登录 url
|
||||
loginUrl: /login.html
|
||||
# 登录成功mvc后跳转的 url
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
<pattern>%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
|
||||
<!--添加我们自定义的filter-->
|
||||
<filter class="me.aurora.config.logMessage.LogFilter"></filter>
|
||||
</appender>
|
||||
|
||||
<!--输出到文件-->
|
||||
@@ -21,6 +24,8 @@
|
||||
<!--</encoder>-->
|
||||
<!--</appender>-->
|
||||
|
||||
|
||||
|
||||
<!--普通日志输出到控制台-->
|
||||
<root level="info">
|
||||
<appender-ref ref="console" />
|
||||
@@ -39,6 +44,10 @@
|
||||
<appender-ref ref="console" />
|
||||
</logger>
|
||||
|
||||
<logger name="jdbc.resultsettable" level="INFO" additivity="false">
|
||||
<appender-ref ref="console" />
|
||||
</logger>
|
||||
|
||||
<logger name="jdbc.connection" level="OFF" additivity="false">
|
||||
<appender-ref ref="console" />
|
||||
</logger>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
Target Server Version : 50559
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 27/10/2018 18:34:02
|
||||
Date: 01/11/2018 08:52:51
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
@@ -41,6 +41,19 @@ CREATE TABLE `zj_alipay_config` (
|
||||
-- ----------------------------
|
||||
INSERT INTO `zj_alipay_config` VALUES (1, '2016091700532697', 'utf-8', 'JSON', 'https://openapi.alipaydev.com/gateway.do', 'http://xiswl.xyz/aliPay/notify', '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', 'http://xiswl.xyz/aliPay/return', 'RSA2', '2088102176044281');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for zj_alisms_config
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `zj_alisms_config`;
|
||||
CREATE TABLE `zj_alisms_config` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`accessKeyId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`accessKeySecret` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`signName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`templateCode` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for zj_department
|
||||
-- ----------------------------
|
||||
@@ -104,7 +117,7 @@ CREATE TABLE `zj_dict` (
|
||||
`table_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
||||
`updateTime` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_dict
|
||||
@@ -157,7 +170,7 @@ CREATE TABLE `zj_job` (
|
||||
`status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`updateTime` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_job
|
||||
@@ -184,33 +197,35 @@ CREATE TABLE `zj_menu` (
|
||||
`sys` bit(1) NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `UK_cbhg0bi3f1emxkhqqtvca9btx`(`soft`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_menu
|
||||
-- ----------------------------
|
||||
INSERT INTO `zj_menu` VALUES (5, 'layui-icon-chart', 0, 1, '系统监控', 10, '', '2018-08-29 11:40:17', '2018-10-26 12:45:17', 4, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (5, 'layui-icon-chart', 0, 1, '系统监控', 10, '', '2018-08-29 11:40:17', '2018-10-30 20:24:33', 5, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (6, 'layui-icon-username', 7, 2, '用户管理', 1, '/user/index', '2018-08-29 11:40:17', '2018-10-25 12:14:30', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (7, 'layui-icon-set-sm', 0, 1, '系统管理', 0, '', '2018-08-29 11:40:17', '2018-10-26 13:18:15', 7, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (8, 'layui-icon-template', 7, 2, '菜单管理', 5, '/menu/index', '2018-08-29 11:40:17', '2018-10-05 14:02:44', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (9, 'layui-icon-survey', 5, 2, '系统日志', 13, '/sysLog/index', '2018-08-29 11:40:17', '2018-10-03 09:04:22', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (10, 'layui-icon-password', 7, 2, '权限管理', 4, '/permission/index', '2018-08-29 11:40:17', '2018-10-03 08:59:50', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (11, 'layui-icon-top', 7, 2, '角色管理', 3, '/role/index', '2018-08-29 11:40:17', '2018-10-03 08:59:23', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (13, 'layui-icon-picture-fine', 18, 2, 'SM.MS图床', 44, '/picture/index', '2018-09-20 11:40:53', '2018-10-03 08:56:50', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (13, 'layui-icon-picture-fine', 18, 2, 'SM.MS图床', 45, '/picture/index', '2018-09-20 11:40:53', '2018-10-03 08:56:50', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (14, 'layui-icon-username', 5, 2, '在线用户', 12, '/online/index', '2018-09-21 16:09:38', '2018-10-03 09:01:22', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (16, 'layui-icon-console', 5, 2, 'Redis终端', 16, '/redis/terminal', '2018-09-22 11:18:21', '2018-10-03 09:05:11', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (16, 'layui-icon-circle', 5, 2, 'Redis终端', 16, '/redis/terminal', '2018-09-22 11:18:21', '2018-10-31 23:00:53', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (17, 'layui-icon-file', 7, 2, '接口文档', 7, '/swagger/index', '2018-09-23 09:16:17', '2018-10-03 08:57:26', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (18, 'layui-icon-util', 0, 1, '第三方工具', 40, '', '2018-09-24 23:46:02', '2018-10-03 09:21:46', 5, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (19, 'layui-icon-code-circle', 18, 2, '百度UEditor', 45, '/ueditor/index', '2018-09-24 23:46:47', '2018-10-03 08:54:27', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (18, 'layui-icon-util', 0, 1, '第三方工具', 40, '', '2018-09-24 23:46:02', '2018-10-29 19:00:50', 6, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (19, 'layui-icon-code-circle', 18, 2, '百度UEditor', 46, '/ueditor/index', '2018-09-24 23:46:47', '2018-10-03 08:54:27', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (21, 'layui-icon-chart', 5, 2, 'SQL监控', 15, '/druid/index.html', '2018-09-27 13:24:25', '2018-10-03 08:57:49', 0, b'1', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (22, 'layui-icon-edit', 18, 2, '邮件工具', 41, '/email/index', '2018-09-28 07:32:57', '2018-10-02 16:26:01', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (24, 'layui-icon-dollar', 18, 2, '支付宝工具', 42, '/aliPay/index', '2018-09-30 15:16:43', '2018-10-02 16:27:09', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (25, 'layui-icon-upload', 18, 2, '七牛云存储', 43, '/qiNiu/index', '2018-10-02 11:03:27', '2018-10-02 16:26:42', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (24, 'layui-icon-dollar', 18, 2, '支付宝工具', 43, '/aliPay/index', '2018-09-30 15:16:43', '2018-10-02 16:27:09', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (25, 'layui-icon-upload', 18, 2, '七牛云存储', 44, '/qiNiu/index', '2018-10-02 11:03:27', '2018-10-02 16:26:42', 0, b'0', b'1');
|
||||
INSERT INTO `zj_menu` VALUES (27, 'layui-icon-read', 7, 2, '字典管理', 6, '/dict/index', '2018-10-05 14:03:40', '2018-10-05 14:03:40', 0, b'0', b'0');
|
||||
INSERT INTO `zj_menu` VALUES (28, 'layui-icon-log', 0, 1, '任务调度', 20, '', '2018-10-06 10:37:11', '2018-10-06 11:55:59', 2, b'0', b'0');
|
||||
INSERT INTO `zj_menu` VALUES (29, 'layui-icon-radio', 28, 2, '定时任务', 21, '/job/index', '2018-10-06 10:38:06', '2018-10-06 10:38:06', 0, b'0', b'0');
|
||||
INSERT INTO `zj_menu` VALUES (30, 'layui-icon-survey', 28, 2, '调度日志', 22, '/jobLog/index', '2018-10-06 11:55:59', '2018-10-06 11:55:59', 0, b'0', b'0');
|
||||
INSERT INTO `zj_menu` VALUES (31, 'layui-icon-tree', 7, 2, '组织架构', 2, '/department/index', '2018-10-25 12:13:54', '2018-10-25 12:36:21', 0, b'0', b'0');
|
||||
INSERT INTO `zj_menu` VALUES (32, 'layui-icon-dialogue', 18, 2, '阿里云通信', 42, '/aliSms/index', '2018-10-29 19:00:50', '2018-10-29 22:39:25', 0, b'0', b'0');
|
||||
INSERT INTO `zj_menu` VALUES (33, 'layui-icon-console', 5, 2, '实时控制台', 17, '/logMsg/index', '2018-10-30 20:24:33', '2018-10-31 18:03:40', 0, b'0', b'0');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for zj_menus_roles
|
||||
@@ -250,6 +265,8 @@ INSERT INTO `zj_menus_roles` VALUES (28, 1);
|
||||
INSERT INTO `zj_menus_roles` VALUES (29, 1);
|
||||
INSERT INTO `zj_menus_roles` VALUES (30, 1);
|
||||
INSERT INTO `zj_menus_roles` VALUES (31, 1);
|
||||
INSERT INTO `zj_menus_roles` VALUES (32, 1);
|
||||
INSERT INTO `zj_menus_roles` VALUES (33, 1);
|
||||
INSERT INTO `zj_menus_roles` VALUES (5, 3);
|
||||
INSERT INTO `zj_menus_roles` VALUES (6, 3);
|
||||
INSERT INTO `zj_menus_roles` VALUES (7, 3);
|
||||
@@ -278,7 +295,7 @@ CREATE TABLE `zj_permission` (
|
||||
`pid` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `UK_djtxn2vldlgrkfk21d155b48i`(`perms`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 50 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_permission
|
||||
@@ -373,6 +390,11 @@ CREATE TABLE `zj_picture` (
|
||||
CONSTRAINT `FK5qtt7wql9517j0e2read2pdus` FOREIGN KEY (`user_id`) REFERENCES `zj_user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_picture
|
||||
-- ----------------------------
|
||||
INSERT INTO `zj_picture` VALUES (1, '2018-10-29 09:27:06', '\"\"', '200', '8.49KB ', 'https://i.loli.net/2018/10/29/5bd661eac0e5f.jpg', '200', 1, '1');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for zj_qiniu_config
|
||||
-- ----------------------------
|
||||
@@ -406,7 +428,7 @@ CREATE TABLE `zj_qiniu_content` (
|
||||
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`updateTime` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_qiniu_content
|
||||
@@ -415,6 +437,7 @@ INSERT INTO `zj_qiniu_content` VALUES (1, 'aurora', '189.97KB ', '120181025163
|
||||
INSERT INTO `zj_qiniu_content` VALUES (2, 'aurora', '48.11KB ', 'dsp20181026135347.jpg', '公开', 'http://pfywktugt.bkt.clouddn.com/dsp20181026135347.jpg', '2018-10-26 15:47:23');
|
||||
INSERT INTO `zj_qiniu_content` VALUES (3, 'aurora', '48.11KB ', 'dsp20181026135403.jpg', '公开', 'http://pfywktugt.bkt.clouddn.com/dsp20181026135403.jpg', '2018-10-26 15:47:23');
|
||||
INSERT INTO `zj_qiniu_content` VALUES (4, 'aurora', '8.36KB ', 'qsc-logo-new20181025150100.png', '公开', 'http://pfywktugt.bkt.clouddn.com/qsc-logo-new20181025150100.png', '2018-10-26 15:47:23');
|
||||
INSERT INTO `zj_qiniu_content` VALUES (5, 'aurora', '292.27KB ', '谷歌上网助手1.2.020181027200432.crx', '公开', 'http://pfywktugt.bkt.clouddn.com/谷歌上网助手1.2.020181027200432.crx', '2018-10-28 09:39:37');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for zj_role
|
||||
@@ -427,7 +450,7 @@ CREATE TABLE `zj_role` (
|
||||
`remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`updateDateTime` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_role
|
||||
@@ -454,7 +477,7 @@ CREATE TABLE `zj_user` (
|
||||
UNIQUE INDEX `UK_kpubos9gc2cvtkb0thktkbkes`(`email`) USING BTREE,
|
||||
INDEX `FKqfitoyy9x1gctukdi020j4224`(`department_id`) USING BTREE,
|
||||
CONSTRAINT `FKqfitoyy9x1gctukdi020j4224` FOREIGN KEY (`department_id`) REFERENCES `zj_department` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of zj_user
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
.handle {
|
||||
height: 38px;
|
||||
background: #f9f9f9;
|
||||
border: 1px solid #eee;
|
||||
border-top-left-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
color: rgba(0,0,0,0.7);
|
||||
font-family: 'consolas';
|
||||
font-size: 13px;
|
||||
line-height: 38px;
|
||||
text-align: center;
|
||||
}
|
||||
.closes,.minimize,.maximize{
|
||||
float: left;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
background-color: gainsboro;
|
||||
border: 1px solid rgba(0,0,0,0);
|
||||
border-radius: 6px;
|
||||
color: rgba(0,0,0,0.5);
|
||||
margin:12px 8px;
|
||||
}
|
||||
.closes {
|
||||
background-color: #fc625d;
|
||||
}
|
||||
.minimize {
|
||||
background-color: #fdbc40;
|
||||
}
|
||||
.maximize {
|
||||
background-color: #35cd4b;
|
||||
}
|
||||
#log-container{
|
||||
font-family: 'consolas';
|
||||
overflow-y: scroll;
|
||||
background: #494949;
|
||||
color: #f7f7f7;
|
||||
padding: 10px;
|
||||
}
|
||||
@@ -111,7 +111,7 @@
|
||||
<ul>
|
||||
<li><del>用户个人中心</del></li>
|
||||
<li><del>部门管理,组织结构</del></li>
|
||||
<li>短信模块</li>
|
||||
<li><del>阿里短信</del></li>
|
||||
<li>站内信模块</li>
|
||||
<li>工作流</li>
|
||||
</ul>
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<title>控制台实时打印</title>
|
||||
<!-- build:css -->
|
||||
<link rel="stylesheet" th:href="@{'/css/logMsg.css'}">
|
||||
<!-- build:js -->
|
||||
<script th:src="@{'/js/jquery.min.js'}"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>
|
||||
<script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
|
||||
<!-- endbuild -->
|
||||
</head>
|
||||
<body>
|
||||
<div class="handle">
|
||||
<button class="closes"></button>
|
||||
<button class="minimize"></button>
|
||||
<button class="maximize"></button>
|
||||
<span>[[${userName}]]@[[${osName}]]: ~ (logback)</span>
|
||||
</div>
|
||||
<div id="log-container">
|
||||
<div></div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
<script>
|
||||
//动态指定高度
|
||||
$(function () {
|
||||
var offsetHig = document.documentElement.clientHeight;
|
||||
var height = offsetHig-146;
|
||||
$("#log-container").height(height)
|
||||
})
|
||||
$("#log-container div").append("aurora- "+"<span style='color: #CD0066'>"+getFormatDate()+"</span> <span style='color: #00CD00'>[aurora-system-msg]</span> <span style='color: #0000ff'>INFO</span> <span style='color: #DE00CC'>me.auaora.Applicationn</span> : (*^ω^*) 欢迎使用~").append("<br/>");
|
||||
$("#log-container").scrollTop($("#log-container div").height() - $("#log-container").height());
|
||||
var stompClient = null;
|
||||
if(stompClient==null){
|
||||
var socket =new SockJS('/websocket?token=kl');
|
||||
stompClient = Stomp.over(socket);
|
||||
stompClient.connect({token:"kl"}, function(frame) {
|
||||
stompClient.subscribe('/topic/pullLogger', function(event) {
|
||||
var content=JSON.parse(event.body);
|
||||
|
||||
var color = "<span style='color: #0000ff'>";
|
||||
|
||||
if(content.level == "WARN"){
|
||||
color = "<span style='color: #FFFF00'>"
|
||||
}
|
||||
if(content.level == "ERROR"){
|
||||
color = "<span style='color: #FF0000'>"
|
||||
}
|
||||
if(content.level == "DEBUG"){
|
||||
color = "<span style='color: #DEA000'>"
|
||||
}
|
||||
|
||||
$("#log-container div").append("aurora- "+"<span style='color: #CD0066'>"+content.timestamp +"</span> <span style='color: #00CD00'>["+ content.threadName+"]</span> "+ color + content.level+"</span> <span style='color: #DE00CC'>"+ content.className+"</span> : "+content.body).append("<br/>");
|
||||
$("#log-container").scrollTop($("#log-container div").height() - $("#log-container").height());
|
||||
},{
|
||||
token:"kltoen"
|
||||
});
|
||||
});
|
||||
}
|
||||
function closeSocket() {
|
||||
if (stompClient != null) {
|
||||
stompClient.disconnect();
|
||||
stompClient=null;
|
||||
}
|
||||
}
|
||||
function getFormatDate() {
|
||||
var date = new Date();
|
||||
var month = date.getMonth() + 1;
|
||||
var strDate = date.getDate();
|
||||
if (month >= 1 && month <= 9) {
|
||||
month = "0" + month;
|
||||
}
|
||||
if (strDate >= 0 && strDate <= 9) {
|
||||
strDate = "0" + strDate;
|
||||
}
|
||||
var currentDate = date.getFullYear() + "-" + month + "-" + strDate
|
||||
+ " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
|
||||
return currentDate;
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
@@ -1,5 +1,5 @@
|
||||
<style>
|
||||
textarea,input,button{outline:none}.window-button,.window .buttons .closes,.window .buttons .minimize,.window .buttons .maximize{padding:0;margin:0;margin-right:6px;width:12px;height:12px;background-color:gainsboro;border:1px solid rgba(0,0,0,0);border-radius:6px;color:rgba(0,0,0,0.5)}.window{width:100%}.window .handle{height:38px;background:#f9f9f9;border:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px;color:rgba(0,0,0,0.7);font-family:'consolas';font-size:13px;line-height:38px;text-align:center}.window .buttons{position:absolute;float:left;margin:0 8px}.window .buttons .closes{background-color:#fc625d}.window .buttons .minimize{background-color:#fdbc40}.window .buttons .maximize{background-color:#35cd4b}.window .terminal{padding:4px;background-color:black;opacity:0.7;height:480px;color:white;font-family:'consolas';font-weight:200;font-size:13px;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:1px;border-top-right-radius:1px;overflow-y:scroll}.window .terminal::after{content:"|";animation:blink 1.25s steps(1) infinite}.prompt{color:#bde371}.path{color:#5ed7ff}@keyframes blink{50%{color:transparent}}@keyframes bounceIn{0%{transform:translateY(-1000px)}60%{transform:translateY (200px)}100%{transform:translateY (0px)}}.kw_a{color:#E6DB74}.kw_b{color:#bde371}
|
||||
textarea,input,button{outline:none}.window-button,.window .buttons .closes,.window .buttons .minimize,.window .buttons .maximize{padding:0;margin:0;margin-right:6px;width:12px;height:12px;background-color:gainsboro;border:1px solid rgba(0,0,0,0);border-radius:6px;color:rgba(0,0,0,0.5)}.window{width:100%}.window .handle{height:38px;background:#f9f9f9;border:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px;color:rgba(0,0,0,0.7);font-family:'consolas';font-size:13px;line-height:38px;text-align:center}.window .buttons{position:absolute;float:left;margin:0 8px}.window .buttons .closes{background-color:#fc625d}.window .buttons .minimize{background-color:#fdbc40}.window .buttons .maximize{background-color:#35cd4b}.window .terminal{padding:4px;background-color:black;opacity:0.7;color:white;font-family:'consolas';font-weight:200;font-size:13px;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:1px;border-top-right-radius:1px;overflow-y:scroll}.window .terminal::after{content:"|";animation:blink 1.25s steps(1) infinite}.prompt{color:#bde371}.path{color:#5ed7ff}@keyframes blink{50%{color:transparent}}@keyframes bounceIn{0%{transform:translateY(-1000px)}60%{transform:translateY (200px)}100%{transform:translateY (0px)}}.kw_a{color:#E6DB74}.kw_b{color:#bde371}
|
||||
</style>
|
||||
<div class="card">
|
||||
<div class="card-header"></div>
|
||||
@@ -19,6 +19,14 @@ textarea,input,button{outline:none}.window-button,.window .buttons .closes,.wind
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
//动态指定高度
|
||||
$(function () {
|
||||
var offsetHig = document.documentElement.clientHeight;
|
||||
var height = offsetHig-134;
|
||||
$(".terminal").height(height)
|
||||
})
|
||||
</script>
|
||||
<script data-th-inline="javascript">
|
||||
var osName = [[${osName}]];
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user