Przeglądaj źródła

update static files in manager

reghao 2 lat temu
rodzic
commit
c03baf7f68

+ 1 - 2
manager/src/main/resources/static/js/websocket.js

@@ -21,8 +21,7 @@ WebSocketClient.prototype._generateEndpoint = function () {
         }
     }
 
-    var url = 'wss://devops.reghao.cn/ws/log/pull?token=12345678'
-    //url = 'wss://devops.reghao.cn/ws/ssh?token=12345678'
+    var url = 'wss://devops.reghao.cn/ws/ssh?token=12345678'
     return  url;
 };
 

+ 143 - 0
manager/src/main/resources/templates/app/stat/log.html

@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+    <link rel="stylesheet" th:href="@{/css/xterm.css}"/>
+</head>
+
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header">
+        <span><i class="fa fa-table"></i> 实时日志</span>
+        <span id="ws-status" style="background: red">离线</span>
+        <div class="layui-inline">
+            <label class="layui-form-label">环境</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv" name="env" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">类型</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv1" name="env" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">应用</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv2" name="env" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">机器</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv3" name="env" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+    </div>
+    <div class="layui-card-body" style="background: black">
+        <ul id="applog" class="flow-default layui-timeline" style="height: 500px;overflow: auto">
+            <!--<li id="li2">
+                <div class="layui-text">
+                    <p>
+                        1. 更新:重命名菜单类型为:目录、菜单、按钮<2. 更新:重写Shiro“记住我”系列化数据,减少cookie体积3. 新增:获取用户角色列表方法4. 修复:获取部门数据时延迟加载超时问题 5. 修复:将jq版本改为2.2.4,解决layui弹出窗口最大化问题 6. 新增:项目配置项,可直接通过yml文件配置Shiro和XSS防护忽略规则 7. 新增:ResultExceptionError和ResultExceptionSuccess异常类 8. 修复:若干页面显示问题,优化加载时提示<br>
+                    </p>
+                </div>
+            </li>-->
+        </ul>
+    </div>
+</div>
+</body>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-3.4.1.min.js}"></script>
+<script type="text/javascript" th:inline="javascript">
+    function getPageByEnv() {
+        console.log('切换机器')
+        layer.msg('切换机器', {offset: '15px', time: 5000, icon: 1});
+    }
+
+    function add(text) {
+        var p = document.createElement("p");
+        p.innerHTML = text + '<br>'
+
+        var div = document.createElement("div");
+        div.className = 'layui-text'
+        div.appendChild(p)
+
+        var li = document.createElement("li");
+        li.appendChild(div)
+
+        var ul = document.getElementById("applog");
+        ul.prepend(li);
+        //ul.appendChild(li);
+    }
+
+    var ws;
+    function initWebSocket() {
+        if ("WebSocket" in window) {
+            var token = '0123456789'
+            var app = 'admin-service'
+            var host = '172.16.90.200'
+            var params = 'token=' + token + '&app=' + app + '&host=' + host;
+            var url = "wss://devops.reghao.cn/ws/log/pull?" + params
+            ws = new WebSocket(url);
+            ws.onopen = function() {
+                // Web Socket 已连接上,使用 send() 方法发送数据
+                console.log("连接已建立...");
+                setOnline()
+            };
+            ws.onclose = function() {
+                console.log("连接已关闭...");
+                setOffline()
+            };
+            ws.onerror = function () {
+                console.log("连接错误...");
+                setOffline()
+            };
+            ws.onmessage = function (evt) {
+                console.log('on message')
+                var payload = JSON.parse(evt.data)
+                var app = '<span style="color: yellowgreen">' +  payload.app + ' ' + '</span>'
+                var host = '<span style="color: green">' +  payload.host + ' ' + '</span>'
+                var timestamp = payload.timestamp
+                var thread = payload.thread
+                var level
+                if (payload.level === 'INFO') {
+                    level = '<span style="color: green">' +  payload.level + ' ' + '</span>'
+                } else if (payload.level === 'ERROR') {
+                    level = '<span style="color: red">' +  payload.level + ' ' + '</span>'
+                } else {
+                    level = '<span style="color: yellow">' +  payload.level + ' ' + '</span>'
+                }
+
+                var logger = '<span style="color: wheat">' +  payload.logger + ' ' + '</span>'
+                var message = '<span style="color: white">' +  payload.message + ' ' + '</span>'
+
+                var text = app + ' ' +  host + ' ' + timestamp + ' ' + thread + ' ' + level + ' ' + logger + ' ' + message
+                add(text)
+            }
+        } else {
+            // 浏览器不支持 WebSocket
+            alert("您的浏览器不支持 WebSocket!");
+        }
+    }
+    initWebSocket()
+
+    function setOnline() {
+        var span = document.getElementById("ws-status")
+        span.style = "background: green"
+        span.innerHTML = '在线'
+    }
+
+    function setOffline() {
+        var span = document.getElementById("ws-status")
+        span.style = "background: red"
+        span.innerHTML = '离线'
+    }
+</script>
+</html>

+ 97 - 0
manager/src/main/resources/templates/app/stat/log1.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+    <link rel="stylesheet" th:href="@{/css/xterm.css}"/>
+</head>
+
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header">
+        <span><i class="fa fa-table"></i> 历史日志</span>
+        <div class="layui-inline">
+            <label class="layui-form-label">环境</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv" name="env" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">类型</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv1" name="env" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">应用</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv2" name="app" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+        <div class="layui-inline">
+            <label class="layui-form-label">机器</label>
+            <div class="layui-input-block">
+                <select id="getPageByEnv3" name="host" onchange="getPageByEnv()"
+                        mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+            </div>
+        </div>
+    </div>
+    <div class="layui-card-body" style="background: black">
+        <ul id="applog" class="flow-default layui-timeline" style="height: 500px;overflow: auto">
+        </ul>
+    </div>
+</div>
+</body>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-3.4.1.min.js}"></script>
+<script type="text/javascript" th:inline="javascript">
+    function getPageByEnv() {
+        console.log('切换机器')
+        layer.msg('切换机器', {offset: '15px', time: 5000, icon: 1});
+    }
+
+    layui.use('flow', function(){
+        var flow = layui.flow;
+        flow.load({
+            elem: '#applog' //流加载容器
+            ,scrollElem: '#applog' //滚动条所在元素,一般不用填,此处只是演示需要。
+            ,done: function(page, next){ //执行下一页的回调
+                $.ajax({
+                    url: '/api/app/status/log',
+                    type: 'get',
+                    success: function (result) {
+                        if (result.code === 0) {
+                            var list = []
+                            for (payload of result.data) {
+                                var app = '<span style="color: yellowgreen">' +  payload.app + ' ' + '</span>'
+                                var host = '<span style="color: green">' +  payload.host + ' ' + '</span>'
+                                var timestamp = payload.timestamp
+                                var thread = payload.thread
+                                var level
+                                if (payload.level === 'INFO') {
+                                    level = '<span style="color: green">' +  payload.level + ' ' + '</span>'
+                                } else if (payload.level === 'ERROR') {
+                                    level = '<span style="color: red">' +  payload.level + ' ' + '</span>'
+                                } else {
+                                    level = '<span style="color: yellow">' +  payload.level + ' ' + '</span>'
+                                }
+
+                                var logger = '<span style="color: wheat">' +  payload.logger + ' ' + '</span>'
+                                var message = '<span style="color: white">' +  payload.message + ' ' + '</span>'
+
+                                var text = app + ' ' +  host + ' ' + timestamp + ' ' + thread + ' ' + level + ' ' + logger + ' ' + message + '<br>'
+                                list.push(text)
+                            }
+
+                            next(list.join(''), page < 10);
+                        }
+                    }
+                });
+            }
+        });
+    });
+</script>
+</html>

+ 141 - 155
manager/src/main/resources/templates/home/index.html

@@ -1,6 +1,5 @@
 <!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
-      xmlns:mo="https://gitee.com/aun/Timo">
+<html xmlns:th="http://www.thymeleaf.org">
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
     <style>
         a{
@@ -73,38 +72,52 @@
 
 <body class="timo-layout-page">
 <div class="layui-row layui-col-space15">
-    <div class="layui-card">
-        <div class="layui-card-header layui-form-pane">
-            <div class="pull-left">
-                <label for="getPageByEnv" class="layui-form-label">环境</label>
-            </div>
-            <div class="pull-right">
-                <div class="layui-form-label">
-                    <select id="getPageByEnv" class="timo-search-select" name="env" onchange="getPageByCriteria()"
-                            mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
-                </div>
+    <div class="layui-col-md4">
+        <div class="layui-card">
+            <div class="layui-card-body">
+                <form id="form2">
+                    <div class="layui-form-item layui-form-text">
+                        <textarea id="myTextarea" placeholder="实时同步" class="layui-textarea" name="text"></textarea>
+                    </div>
+                    <div class="layui-form-item timo-finally">
+                        <button class="layui-btn button-submit2"><i class="fa fa-times-circle"></i> 清空</button>
+                    </div>
+                </form>
             </div>
         </div>
     </div>
-    <div class="layui-col-md8">
-        <div class="layui-card">
-            <div class="layui-card-header">部署次数</div>
-            <div id="chart1" class="layui-card-body" style="width: 800px;height:400px;"></div>
-        </div>
-        <div class="layui-card">
-            <div class="layui-card-header">应用状态</div>
-            <div id="chart2" class="layui-card-body" style="width: 800px;height:400px;"></div>
-        </div>
+    <div class="layui-col-md4">
         <div class="layui-card">
-            <div class="layui-card-header">部署历史</div>
-            <div id="chart3" class="layui-card-body" style="width: 800px;height:400px;"></div>
+            <div class="layui-card-body">
+                <form id="form1">
+                    <div class="layui-form-item layui-form-text">
+                        <textarea id="myTextarea1" placeholder="请输入内容(enter 键发布, ctrl+enter 键换行)" class="layui-textarea" name="text"></textarea>
+                    </div>
+                    <div class="layui-form-item timo-finally">
+                        <button class="layui-btn button-submit"><i class="fa fa-check-circle"></i> 发布</button>
+                        <button class="layui-btn button-submit1"><i class="fa fa-times-circle"></i> 清空</button>
+                    </div>
+                </form>
+            </div>
         </div>
     </div>
     <div class="layui-col-md4">
         <div class="layui-card">
-            <div class="layui-card-header">应用类型</div>
+            <div class="layui-card-header">
+                <span><i class="fa fa-table"></i> 状态时间线</span>
+            </div>
             <div class="layui-card-body">
-                <div id="chart4" class="layui-card-body" style="width: 400px;height:400px;"></div>
+                <ul class="flow-default layui-timeline" id="LAY_demo1" style="height: 500px;overflow: auto">
+                    <!--<li id="li2" class="layui-timeline-item">
+                        <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
+                        <div class="layui-timeline-content layui-text">
+                            <h3 class="layui-timeline-title">v2.0.1</h3>
+                            <p>
+                                1.更新:重命名菜单类型为:目录、菜单、按钮. 重写Shiro“记住我”系列化数据,减少cookie体积<br>
+                            </p>
+                        </div>
+                    </li>-->
+                </ul>
             </div>
         </div>
     </div>
@@ -113,145 +126,118 @@
 <script th:src="@{/js/plugins/jquery-3.4.1.min.js}" charset="utf-8"></script>
 <script th:src="@{/lib/echarts-4.7.0/echarts.js}" charset="utf-8"></script>
 <script type="text/javascript" th:inline="javascript">
-    function getPageByCriteria() {
-        var envSelectedOption = $("#getPageByEnv option:selected")
-        var envParam = envSelectedOption.text()
+    $(document).on("click", ".button-submit", function (e) {
+        e.preventDefault();
+        var form = $(this).parents("form");
+        var url = form.attr("action");
+        var serializeArray = form.serializeArray();
+        var payload = serializeArray[0].value
+        if (payload === '') {
+            layer.msg('请输入内容', {offset: '15px', time: 5000, icon: 2});
+            return
+        }
 
-        params = '?env=' + envParam
-        window.location.href = window.location.pathname + params;
-    }
+        document.getElementById("form1").reset();
+        var jsonData = {}
+        jsonData.event = 'event_content'
+        jsonData.payload = payload
+        ws.send(JSON.stringify(jsonData))
+    });
+    $(document).on("click", ".button-submit1", function (e) {
+        e.preventDefault();
+        document.getElementById("form1").reset();
+    });
+    $(document).keypress(function(e) {
+        if((e.which === 13 && e.ctrlKey) || (e.which === 10 && e.ctrlKey)){
+            // 这里实现换行
+            var content = $("#myTextarea1").val();
+            $("#myTextarea1").val(content+"\n");
+        }else if(e.which === 13){
+            // 避免回车键换行
+            e.preventDefault();
 
-    function chart1() {
-        var chartZhu = echarts.init(document.getElementById('chart1'));
-        //指定图表配置项和数据
-        var option = {
-            xAxis: {
-                type: 'category',
-                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-            },
-            yAxis: {
-                type: 'value'
-            },
-            legend: {
-                data: ['npm', 'dotnetCore']
-            },
-            series: [
-                {
-                    name: 'npm',
-                    type: 'line',
-                    data: [120, 220, 214, 238, 125, 117, 210],
-                },
-                {
-                    name: 'dotnetCore',
-                    type: 'line',
-                    data: [150, 230, 224, 218, 135, 147, 260],
-                }
-            ]
-        };
-        chartZhu.setOption(option, true);
-    }
+            var content = $("#myTextarea1").val();
+            submitData(content)
+        }
+    });
 
-    function chart2() {
-        var chartZhu = echarts.init(document.getElementById('chart2'));
-        //指定图表配置项和数据
-        var option = {
-            xAxis: {
-                type: 'category',
-                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-            },
-            yAxis: {
-                type: 'value'
-            },
-            series: [
-                {
-                    data: [150, 230, 224, 218, 135, 147, 260],
-                    type: 'line'
-                }
-            ]
-        };
-        chartZhu.setOption(option, true);
-    }
+    function submitData(content) {
+        if (content === '') {
+            layer.msg('请输入内容', {offset: '15px', time: 5000, icon: 2});
+            return
+        }
 
-    function chart3() {
-        var chartZhu = echarts.init(document.getElementById('chart3'));
-        //指定图表配置项和数据
-        var option = {
-            xAxis: {
-                type: 'category',
-                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-            },
-            yAxis: {
-                type: 'value'
-            },
-            series: [
-                {
-                    data: [150, 230, 224, 218, 135, 147, 260],
-                    type: 'line'
-                }
-            ]
-        };
-        chartZhu.setOption(option, true);
-    }
+        document.getElementById("form1").reset();
+        var jsonData = {}
+        jsonData.event = 'event_content'
+        jsonData.payload = content
+        ws.send(JSON.stringify(jsonData))
+    };
 
-    function chart4() {
-        var option1 = {
-            tooltip: {
-                trigger: 'item'
-            },
-            legend: {
-                top: '5%',
-                left: 'center'
-            },
-            series: [
-                {
-                    name: 'App Type',
-                    type: 'pie',
-                    radius: ['40%', '70%'],
-                    avoidLabelOverlap: false,
-                    itemStyle: {
-                        borderRadius: 10,
-                        borderColor: '#fff',
-                        borderWidth: 2
-                    },
-                    label: {
-                        show: false,
-                        position: 'center'
-                    },
-                    emphasis: {
-                        label: {
-                            show: true,
-                            fontSize: 40,
-                            fontWeight: 'bold'
-                        }
-                    },
-                    labelLine: {
-                        show: false
-                    },
-                    /*data: [
-                        { value: 7, name: 'DotNotCore' },
-                        { value: 3, name: 'NPM' }
-                    ]*/
-                }
-            ]
-        };
+    document.getElementById("myTextarea").addEventListener("input", function() {
+        const event = {}
+        event.event = 'sync'
+        event.payload = this.value
+        ws.send(JSON.stringify(event))
+    });
+    $(document).on("click", ".button-submit2", function (e) {
+        e.preventDefault();
+        document.getElementById("form2").reset();
+    });
 
-        var envSelectedOption = $("#getPageByEnv option:selected")
-        var envParam = envSelectedOption.text()
-        $.get('/api/home/app?env=' + envParam,function(result){
-            if (result.code === 0) {
-                console.log(result.data)
-                option1.series[0].data = result.data
+    function add1(title, content) {
+        var h3 = document.createElement("h3");
+        h3.className = 'layui-timeline-title'
+        h3.innerHTML = title
 
-                var chart1 = echarts.init(document.getElementById('chart4'));
-                chart1.setOption(option1, true);
-            }
-        });
+        var p = document.createElement("p");
+        p.innerHTML = content
+
+        var i = document.createElement("i");
+        i.className = 'layui-icon layui-timeline-axis'
+        i.innerHTML = '&#xe63f;'
+
+        var div = document.createElement("div");
+        div.className = 'layui-timeline-content layui-text'
+        div.appendChild(h3)
+        div.appendChild(p)
+
+        var li = document.createElement("li");
+        li.className = 'layui-timeline-item'
+        li.appendChild(i)
+        li.appendChild(div)
+
+        var ul = document.getElementById("LAY_demo1");
+        ul.prepend(li);
     }
 
-    chart1()
-    chart2()
-    chart3()
-    chart4()
+    var ws;
+    function initWebSocket() {
+        if ("WebSocket" in window) {
+            ws = new WebSocket("wss://devops.reghao.cn/ws/message");
+            ws.onopen = function() {
+                // Web Socket 已连接上,使用 send() 方法发送数据
+                console.log("连接已建立...");
+            };
+            ws.onclose = function() {
+                console.log("连接已关闭...");
+            };
+            ws.onerror = function () {
+                console.log("连接错误...");
+            };
+            ws.onmessage = function (evt) {
+                var event = JSON.parse(evt.data)
+                var eventType = event.event
+                var title = new Date().getTime()
+                add1(title, event.payload)
+                //document.getElementById("myTextarea").value = evt.data
+            }
+        } else {
+            // 浏览器不支持 WebSocket
+            alert("您的浏览器不支持 WebSocket!");
+        }
+    }
+    initWebSocket()
 </script>
 </body>
 </html>

+ 246 - 0
manager/src/main/resources/templates/home/index1.html

@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <style>
+        a{
+            color: #005980;
+        }
+        .widget-small{
+            background-color: #FFFFFF;
+            overflow: hidden;
+            text-align: center;
+            border-radius: 2px;
+            box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);
+        }
+        .widget-small .fa{
+            float: left;
+            width: 40%;
+            line-height: 80px;
+            color: #FFFFFF;
+        }
+        .widget-user .fa{
+            background-color: #029789;
+        }
+        .widget-visit .fa{
+            background-color: #17a2b8;
+        }
+        .widget-message .fa{
+            background-color: #fbad4c;
+        }
+        .widget-like .fa{
+            background-color: #ff646d;
+        }
+        .widget-small-info{
+            float: left;
+            text-align: left;
+            width: 40%;
+            margin-left: 20px;
+            margin-top: 18px;
+            line-height: 24px;
+        }
+        .widget-small-info h4{
+            font-size: 18px;
+        }
+        .widget-small-info span{
+            font-size: 16px;
+        }
+        .project-introduce{
+            min-height: 466px;
+        }
+        .project-introduce h4{
+            font-weight: bold;
+            margin-top: 12px;
+            margin-bottom: 8px;
+        }
+        .project-introduce li{
+            list-style: decimal;
+            margin-left: 28px;
+        }
+        .alert {
+            padding: 15px;
+            margin-bottom: 10px;
+            border: 1px solid transparent;
+            border-radius: 4px;
+        }
+        .alert-info {
+            color: #31708f;
+            background-color: #d9edf7;
+            border-color: #bce8f1;
+        }
+    </style>
+</head>
+
+<body class="timo-layout-page">
+<div class="layui-row layui-col-space15">
+    <div class="layui-col-md8">
+        <div class="layui-card">
+            <div class="layui-card-header">部署次数</div>
+            <div id="chart1" class="layui-card-body" style="width: 800px;height:400px;"></div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-header">应用状态</div>
+            <div id="chart2" class="layui-card-body" style="width: 800px;height:400px;"></div>
+        </div>
+        <div class="layui-card">
+            <div class="layui-card-header">部署历史</div>
+            <div id="chart3" class="layui-card-body" style="width: 800px;height:400px;"></div>
+        </div>
+    </div>
+    <div class="layui-col-md4">
+        <div class="layui-card">
+            <div class="layui-card-header">应用类型</div>
+            <div class="layui-card-body">
+                <div id="chart4" class="layui-card-body" style="width: 400px;height:400px;"></div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script th:src="@{/js/plugins/jquery-3.4.1.min.js}" charset="utf-8"></script>
+<script th:src="@{/lib/echarts-4.7.0/echarts.js}" charset="utf-8"></script>
+<script type="text/javascript" th:inline="javascript">
+    function getPageByCriteria() {
+        var envSelectedOption = $("#getPageByEnv option:selected")
+        var envParam = envSelectedOption.text()
+
+        params = '?env=' + envParam
+        window.location.href = window.location.pathname + params;
+    }
+
+    function chart1() {
+        var chartZhu = echarts.init(document.getElementById('chart1'));
+        //指定图表配置项和数据
+        var option = {
+            xAxis: {
+                type: 'category',
+                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+            },
+            yAxis: {
+                type: 'value'
+            },
+            legend: {
+                data: ['npm', 'dotnetCore']
+            },
+            series: [
+                {
+                    name: 'npm',
+                    type: 'line',
+                    data: [120, 220, 214, 238, 125, 117, 210],
+                },
+                {
+                    name: 'dotnetCore',
+                    type: 'line',
+                    data: [150, 230, 224, 218, 135, 147, 260],
+                }
+            ]
+        };
+        chartZhu.setOption(option, true);
+    }
+
+    function chart2() {
+        var chartZhu = echarts.init(document.getElementById('chart2'));
+        //指定图表配置项和数据
+        var option = {
+            xAxis: {
+                type: 'category',
+                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+            },
+            yAxis: {
+                type: 'value'
+            },
+            series: [
+                {
+                    data: [150, 230, 224, 218, 135, 147, 260],
+                    type: 'line'
+                }
+            ]
+        };
+        chartZhu.setOption(option, true);
+    }
+
+    function chart3() {
+        var chartZhu = echarts.init(document.getElementById('chart3'));
+        //指定图表配置项和数据
+        var option = {
+            xAxis: {
+                type: 'category',
+                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+            },
+            yAxis: {
+                type: 'value'
+            },
+            series: [
+                {
+                    data: [150, 230, 224, 218, 135, 147, 260],
+                    type: 'line'
+                }
+            ]
+        };
+        chartZhu.setOption(option, true);
+    }
+
+    function chart4() {
+        var option1 = {
+            tooltip: {
+                trigger: 'item'
+            },
+            legend: {
+                top: '5%',
+                left: 'center'
+            },
+            series: [
+                {
+                    name: 'App Type',
+                    type: 'pie',
+                    radius: ['40%', '70%'],
+                    avoidLabelOverlap: false,
+                    itemStyle: {
+                        borderRadius: 10,
+                        borderColor: '#fff',
+                        borderWidth: 2
+                    },
+                    label: {
+                        show: false,
+                        position: 'center'
+                    },
+                    emphasis: {
+                        label: {
+                            show: true,
+                            fontSize: 40,
+                            fontWeight: 'bold'
+                        }
+                    },
+                    labelLine: {
+                        show: false
+                    },
+                    data: [
+                        { value: 7, name: 'DotNotCore' },
+                        { value: 3, name: 'NPM' }
+                    ]
+                }
+            ]
+        };
+
+        var chart1 = echarts.init(document.getElementById('chart4'));
+        chart1.setOption(option1, true);
+        /*var envSelectedOption = $("#getPageByEnv option:selected")
+        var envParam = envSelectedOption.text()
+        $.get('/api/home/app?env=' + envParam,function(result){
+            if (result.code === 0) {
+                console.log(result.data)
+                option1.series[0].data = result.data
+
+                var chart1 = echarts.init(document.getElementById('chart4'));
+                chart1.setOption(option1, true);
+            }
+        });*/
+    }
+
+    chart1()
+    chart2()
+    chart3()
+    chart4()
+</script>
+</body>
+</html>