This commit is contained in:
Eason010212
2022-07-22 15:05:11 +08:00
parent 7ac9f1bdbb
commit b13e59882a
24 changed files with 5909 additions and 31 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
node_modules

View File

@@ -0,0 +1,22 @@
(node:9684) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -0,0 +1,22 @@
(node:4232) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -0,0 +1,22 @@
(node:22312) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -0,0 +1,22 @@
(node:644) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -0,0 +1,22 @@
(node:22396) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -0,0 +1,22 @@
(node:792) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -0,0 +1,22 @@
(node:2804) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
node:events:498
throw er; // Unhandled 'error' event
^
Error: spawn loader ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on ChildProcess instance at:
at Process.ChildProcess._handle.onexit (node:internal/child_process:289:12)
at onErrorNT (node:internal/child_process:478:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
errno: -4058,
code: 'ENOENT',
syscall: 'spawn loader',
path: 'loader',
spawnargs: [
'C:\\Users\\MixIO\\Desktop\\mixio_linux\\mixio_server_latest\\src\\'
]
}

View File

@@ -4,7 +4,27 @@ const fs = require("fs")
var versionInfo = fs.readFileSync("version.json", "utf-8") var versionInfo = fs.readFileSync("version.json", "utf-8")
var configInfo = fs.readFileSync("src/config.json", "utf-8") var configInfo = fs.readFileSync("src/config.json", "utf-8")
var http = require("http") var http = require("http")
var os = require("os")
var {spawnSync} = require("child_process") var {spawnSync} = require("child_process")
function getIpAddress() {
var ifaces=os.networkInterfaces()
var addresses = []
for (var dev in ifaces) {
let iface = ifaces[dev]
for (let i = 0; i < iface.length; i++) {
let {family, address, internal} = iface[i]
if (family === 'IPv4' && address !== '127.0.0.1' && !internal) {
addresses.push(address)
}
}
}
return addresses
}
let ipAddress = getIpAddress()
var version = function () { var version = function () {
console.log(JSON.parse(versionInfo)) console.log(JSON.parse(versionInfo))
} }
@@ -50,6 +70,7 @@ function start() {
'command': "./loader" 'command': "./loader"
}) })
console.log("Starting MixIO server...") console.log("Starting MixIO server...")
console.log("IP Address: "+ipAddress)
while (true) { while (true) {
var content = fs.readFileSync(process.cwd() + "/logs/" + logFileName, "utf-8") var content = fs.readFileSync(process.cwd() + "/logs/" + logFileName, "utf-8")
var successLog = "[INFO] Database Connected!" var successLog = "[INFO] Database Connected!"
@@ -86,6 +107,7 @@ function debug() {
'command': "node" 'command': "node"
}) })
console.log("Starting MixIO server...") console.log("Starting MixIO server...")
console.log("IP Address: "+ipAddress)
while (true) { while (true) {
var content = fs.readFileSync(process.cwd() + "/logs/" + logFileName, "utf-8") var content = fs.readFileSync(process.cwd() + "/logs/" + logFileName, "utf-8")
var successLog = "[INFO] Database Connected!" var successLog = "[INFO] Database Connected!"

5465
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -5,9 +5,8 @@
"HTTPS_CRT_FILE": "./certs/file.crt", "HTTPS_CRT_FILE": "./certs/file.crt",
"MAX_PROJECT_NUM_PER_USER": 20, "MAX_PROJECT_NUM_PER_USER": 20,
"ALLOW_REGISTER": true, "ALLOW_REGISTER": true,
"ALLOW_HOOK": true,
"OFFLINE_MODE": true, "OFFLINE_MODE": true,
"BAIDU_MAP_AK": "", "BAIDU_MAP_AK": "",
"BAIDU_MAP_SERVER_AK": "", "BAIDU_MAP_SERVER_AK": ""
"ADMIN_USERNAME":"admin",
"ADMIN_PASSWORD":"public"
} }

View File

@@ -68,7 +68,15 @@
var admin = function(){ var admin = function(){
userName = $("#userName").val() userName = $("#userName").val()
password = $("#password").val() password = $("#password").val()
window.location.href = '/admin?userName='+userName+'&password='+password $.post('/adminLogin',{
"userName":userName,
"password":password
},function(res){
if(res == 1)
window.location.href = "./admin"
else
showtext(JSLang[lang].wrongAcc)
})
} }
</script> </script>
</body> </body>

View File

@@ -131,7 +131,7 @@
<i class="fa fa-play" style="font-size:1.2rem"></i><br> <i class="fa fa-play" style="font-size:1.2rem"></i><br>
</a> </a>
<a id="stop" class="btn btn-warning" style="margin:5px;font-size:0.8rem;cursor:pointer" onclick = "stop()"> <a id="stop" class="btn btn-warning" style="margin:5px;font-size:0.8rem;cursor:pointer" onclick = "stop()">
<i class="fa fa-stop" style="font-size:1.2rem"></i><br> <i class="fa fa-pause" style="font-size:1.2rem"></i><br>
</a> </a>
<a class="btn btn-info" style="margin:5px;font-size:0.8rem;cursor:pointer" onclick = "refresh()"> <a class="btn btn-info" style="margin:5px;font-size:0.8rem;cursor:pointer" onclick = "refresh()">
<i class="fa fa-refresh" style="font-size:1.2rem"></i><br> <i class="fa fa-refresh" style="font-size:1.2rem"></i><br>

View File

@@ -19,7 +19,7 @@
<script src="js/lang.js?v=5"></script> <script src="js/lang.js?v=5"></script>
<script src="js/lang2.js?v=5"></script> <script src="js/lang2.js?v=5"></script>
<script src="js/tools.js?v=10"></script> <script src="js/tools.js?v=10"></script>
<script src="js/login.js?v=21"></script> <script src="js/login.js?v=22"></script>
</head> </head>
<body id="body" class="bg-gradient-light" style="height:100vh"> <body id="body" class="bg-gradient-light" style="height:100vh">
@@ -131,7 +131,9 @@
</div> </div>
</div> </div>
<footer id="footer" style="height:40px;font-size:0.8rem;text-align:center"> <footer id="footer" style="height:40px;font-size:0.8rem;text-align:center">
<a href="https://gitee.com/mixly2/mixio" class="lang" key="OPENSRC"></a>&nbsp;
<a id="admin" class="lang" key="ADMINDASH"></a>
&nbsp;MixIO Community Server © Mixly Team
</footer> </footer>
<!-- Bootstrap core JavaScript--> <!-- Bootstrap core JavaScript-->
</body> </body>

View File

@@ -14,6 +14,7 @@
<link href="css/sb-admin-2.min.css" rel="stylesheet"> <link href="css/sb-admin-2.min.css" rel="stylesheet">
<link rel="stylesheet" href="css/muuri.css?v=21"> <link rel="stylesheet" href="css/muuri.css?v=21">
<script src="js/jquery.min.js"></script> <script src="js/jquery.min.js"></script>
<script src="js/lang.js?v=5"></script> <script src="js/lang.js?v=5"></script>
<script src="js/lang2.js?v=5"></script> <script src="js/lang2.js?v=5"></script>
<script src="js/farbtastic.js"></script> <script src="js/farbtastic.js"></script>
@@ -21,7 +22,11 @@
<script src="js/jquery.easing.min.js"></script> <script src="js/jquery.easing.min.js"></script>
<script src="js/echarts.min.js"></script> <script src="js/echarts.min.js"></script>
<script src="js/mqtt.min.js"></script> <script src="js/mqtt.min.js"></script>
<link rel="stylesheet" href="css/dataTables.bootstrap4.min.css">
<script src="js/jquery.dataTables.min.js"></script>
<script src="js/dataTables.bootstrap4.min.js"></script>
<script src="js/tools.js?v=14"></script> <script src="js/tools.js?v=14"></script>
<script src="js/manage.js"></script>
</head> </head>
<body id="page-top" class="sidebar-toggled" style="position:relative;overflow-x:hidden;color: black;"> <body id="page-top" class="sidebar-toggled" style="position:relative;overflow-x:hidden;color: black;">
@@ -43,12 +48,16 @@
<span class="lang" key="BASICADMIN"></span></a> <span class="lang" key="BASICADMIN"></span></a>
</li> </li>
<li class="nav-item" id="view2"> <li class="nav-item" id="view2">
<a class="nav-link" onclick="view(2)" style="cursor: pointer;" id="manage_strg"> <a class="nav-link" onclick="view(2)" style="cursor: pointer;" id="manage_data">
<i class="fa fa-fw fa-database"></i> <i class="fa fa-fw fa-database"></i>
<span class="lang" key="DATAADMIN"></span></a>
</li>
<li class="nav-item" id="view3">
<a class="nav-link" onclick="view(3)" style="cursor: pointer;" id="manage_strg">
<i class="fa fa-fw fa-user"></i>
<span class="lang" key="USERADMIN"></span></a> <span class="lang" key="USERADMIN"></span></a>
</li> </li>
<hr class="sidebar-divider"> <hr class="sidebar-divider">
</ul> </ul>
<div id="content-wrapper" class="d-flex flex-column"> <div id="content-wrapper" class="d-flex flex-column">
@@ -135,6 +144,14 @@
<input type="checkbox" id="ALLOW_REGISTER"> <input type="checkbox" id="ALLOW_REGISTER">
</td> </td>
</tr> </tr>
<tr>
<td>
<span>允许离线数据:</span>
</td>
<td>
<input type="checkbox" id="ALLOW_HOOK">
</td>
</tr>
<tr> <tr>
<td> <td>
<span>HTTP 端口:</span> <span>HTTP 端口:</span>
@@ -198,7 +215,7 @@
</div> </div>
</div> </div>
<div id="detail2" hidden> <div id="detail3" hidden>
<div class="col-xl-4 col-md-6 mb-4"> <div class="col-xl-4 col-md-6 mb-4">
<div class="card shadow" style="margin-top:1.5rem;border-radius:10px"> <div class="card shadow" style="margin-top:1.5rem;border-radius:10px">
<div class="card-body" style="display: flex;align-items: center;justify-content: center;flex-direction: column;"> <div class="card-body" style="display: flex;align-items: center;justify-content: center;flex-direction: column;">
@@ -211,8 +228,32 @@
</div> </div>
</div> </div>
</div> </div>
<div id="detail3" hidden> <div id="detail2" hidden>
<div class="col-xl-8 col-md-6 mb-4">
<div class="card shadow" style="margin-top:1.5rem;border-radius:10px">
<div class="card-body" >
<table id="table">
<thead>
<td style="min-width:100px">
用户
</td>
<td style="min-width:100px">
项目数
</td>
<td style="min-width:100px">
消息量
</td>
<td style="min-width:100px">
执行操作
</td>
</thead>
<tbody id="tbody">
</tbody>
</table>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -227,6 +268,23 @@
} }
</style> </style>
<script> <script>
var clearMessage = function(userName){
$.get('clearMessage',{
"userName":userName
},function(res){
if(res == 1)
{
showtext("操作成功!")
setTimeout(function(){
window.location.href = window.location.href
},1000)
}
else
{
showtext("操作失败")
}
})
}
$("#time").html(new Date().toLocaleTimeString()) $("#time").html(new Date().toLocaleTimeString())
setInterval(() => { setInterval(() => {
$("#time").html(new Date().toLocaleTimeString()) $("#time").html(new Date().toLocaleTimeString())
@@ -237,6 +295,7 @@
var HTTPS_CRT_FILE = "<%=configs["HTTPS_CRT_FILE"]%>" var HTTPS_CRT_FILE = "<%=configs["HTTPS_CRT_FILE"]%>"
var MAX_PROJECT_NUM_PER_USER = "<%=configs["MAX_PROJECT_NUM_PER_USER"]%>" var MAX_PROJECT_NUM_PER_USER = "<%=configs["MAX_PROJECT_NUM_PER_USER"]%>"
var ALLOW_REGISTER = <%=configs["ALLOW_REGISTER"]%> var ALLOW_REGISTER = <%=configs["ALLOW_REGISTER"]%>
var ALLOW_HOOK = <%=configs["ALLOW_HOOK"]%>
var OFFLINE_MODE = <%=configs["OFFLINE_MODE"]%> var OFFLINE_MODE = <%=configs["OFFLINE_MODE"]%>
var BAIDU_MAP_AK = "<%=configs["BAIDU_MAP_AK"]%>" var BAIDU_MAP_AK = "<%=configs["BAIDU_MAP_AK"]%>"
var BAIDU_MAP_SERVER_AK = "<%=configs["BAIDU_MAP_SERVER_AK"]%>" var BAIDU_MAP_SERVER_AK = "<%=configs["BAIDU_MAP_SERVER_AK"]%>"
@@ -258,6 +317,7 @@
$("#HTTPS_PRIVATE_PEM").val(HTTPS_PRIVATE_PEM) $("#HTTPS_PRIVATE_PEM").val(HTTPS_PRIVATE_PEM)
$("#HTTPS_CRT_FILE").val(HTTPS_CRT_FILE) $("#HTTPS_CRT_FILE").val(HTTPS_CRT_FILE)
$("#ALLOW_REGISTER").prop("checked",ALLOW_REGISTER) $("#ALLOW_REGISTER").prop("checked",ALLOW_REGISTER)
$("#ALLOW_HOOK").prop("checked",ALLOW_HOOK)
$("#OFFLINE_MODE").prop("checked",OFFLINE_MODE) $("#OFFLINE_MODE").prop("checked",OFFLINE_MODE)
$("#BAIDU_MAP_AK").val(BAIDU_MAP_AK) $("#BAIDU_MAP_AK").val(BAIDU_MAP_AK)
$("#BAIDU_MAP_SERVER_AK").val(BAIDU_MAP_SERVER_AK) $("#BAIDU_MAP_SERVER_AK").val(BAIDU_MAP_SERVER_AK)
@@ -274,6 +334,8 @@
} }
} }
loadConfig() loadConfig()
var saveAndRestart = function(){ var saveAndRestart = function(){
var modald = showmodaltext("<div style='text-align:center'><i class='fa fa-spin fa-cog' style='font-size:2rem;color:#4e73df'></i><p style='margin-top:6px;margin-bottom:0;color:#4e73df;font-size:1rem;font-weight:bold'>"+JSLang[lang].loading2+"</p></div>") var modald = showmodaltext("<div style='text-align:center'><i class='fa fa-spin fa-cog' style='font-size:2rem;color:#4e73df'></i><p style='margin-top:6px;margin-bottom:0;color:#4e73df;font-size:1rem;font-weight:bold'>"+JSLang[lang].loading2+"</p></div>")
configs = {} configs = {}
@@ -283,6 +345,7 @@
configs["HTTPS_CRT_FILE"] = $("#HTTPS_CRT_FILE").val() configs["HTTPS_CRT_FILE"] = $("#HTTPS_CRT_FILE").val()
configs["MAX_PROJECT_NUM_PER_USER"] = parseInt($("#MAX_PROJECT_NUM_PER_USER").val()) configs["MAX_PROJECT_NUM_PER_USER"] = parseInt($("#MAX_PROJECT_NUM_PER_USER").val())
configs["ALLOW_REGISTER"] = $("#ALLOW_REGISTER").prop("checked") configs["ALLOW_REGISTER"] = $("#ALLOW_REGISTER").prop("checked")
configs["ALLOW_HOOK"] = $("#ALLOW_HOOK").prop("checked")
configs["OFFLINE_MODE"] = $("#OFFLINE_MODE").prop("checked") configs["OFFLINE_MODE"] = $("#OFFLINE_MODE").prop("checked")
configs["BAIDU_MAP_AK"] = $("#BAIDU_MAP_AK").val() configs["BAIDU_MAP_AK"] = $("#BAIDU_MAP_AK").val()
configs["BAIDU_MAP_SERVER_AK"] = $("#BAIDU_MAP_SERVER_AK").val() configs["BAIDU_MAP_SERVER_AK"] = $("#BAIDU_MAP_SERVER_AK").val()

View File

@@ -2,10 +2,10 @@ function get_data(){
$.get('queryHook',function(res){ $.get('queryHook',function(res){
if(res == 1) if(res == 1)
{ {
$("#play").addClass("disabled") $("#play").remove()
} }
else{ else{
$("#stop").addClass("disabled") $("#stop").remove()
} }
$.getJSON('getData',{ $.getJSON('getData',{
@@ -227,7 +227,6 @@ var output = function(){
} }
var clearAll = function(){ var clearAll = function(){
console.log(111)
var modald = showmodaltext("<div style='text-align:center'><i class='fa fa-spin fa-cog' style='font-size:2rem;color:#4e73df'></i><p style='margin-top:6px;margin-bottom:0;color:#4e73df;font-size:1rem;font-weight:bold'>"+JSLang[lang].loading+"</p></div>") var modald = showmodaltext("<div style='text-align:center'><i class='fa fa-spin fa-cog' style='font-size:2rem;color:#4e73df'></i><p style='margin-top:6px;margin-bottom:0;color:#4e73df;font-size:1rem;font-weight:bold'>"+JSLang[lang].loading+"</p></div>")
$.get('clearHook',function(res){ $.get('clearHook',function(res){
modald.close() modald.close()

View File

@@ -486,6 +486,8 @@ var JSLang = {
var arrLang = { var arrLang = {
"en": { "en": {
"OPENSRC":"Open Repo",
"ADMINDASH": "Admin Dashboard",
"TOPIC": "Topic", "TOPIC": "Topic",
"MESSAGE": "Message", "MESSAGE": "Message",
"TIME":"Time", "TIME":"Time",
@@ -493,7 +495,7 @@ var JSLang = {
"ADMIN":"Admin", "ADMIN":"Admin",
"BASICADMIN": "Basic", "BASICADMIN": "Basic",
"USERADMIN": "Users", "USERADMIN": "Users",
"MQTTADMIN": "Devices", "DATAADMIN": "Data",
"UPEMAIL": "E-mail: ", "UPEMAIL": "E-mail: ",
"EMAIL": "placeholder$E-mail Address", "EMAIL": "placeholder$E-mail Address",
"PASSWORD": "placeholder$Password", "PASSWORD": "placeholder$Password",
@@ -512,8 +514,8 @@ var JSLang = {
"SHAREMANAGE": "Share", "SHAREMANAGE": "Share",
"SETTINGS": "Settings", "SETTINGS": "Settings",
"LOGOUT": "Log out", "LOGOUT": "Log out",
"IMPORT": "Import user data", "IMPORT": "Import user projects",
"EXPORT": "Export user data", "EXPORT": "Export user projects",
"CONNECTINGSERVER": "Connecting server...", "CONNECTINGSERVER": "Connecting server...",
"MANAGECOUNT": "Projects Managed", "MANAGECOUNT": "Projects Managed",
"OFFLINECOUNT": "Temporary Messages Reserved", "OFFLINECOUNT": "Temporary Messages Reserved",
@@ -551,6 +553,8 @@ var JSLang = {
"CFMSET":"Confirm" "CFMSET":"Confirm"
}, },
"zh": { "zh": {
"OPENSRC":"开源仓库",
"ADMINDASH": "管理后台",
"TOPIC": "主题", "TOPIC": "主题",
"MESSAGE": "消息", "MESSAGE": "消息",
"TIME":"时间", "TIME":"时间",
@@ -558,7 +562,7 @@ var JSLang = {
"ADMIN":"管理", "ADMIN":"管理",
"BASICADMIN": "基础设置", "BASICADMIN": "基础设置",
"USERADMIN": "批量注册", "USERADMIN": "批量注册",
"MQTTADMIN": "连接管理", "DATAADMIN": "数据管理",
"UPEMAIL": "注册邮箱:", "UPEMAIL": "注册邮箱:",
"EMAIL": "placeholder$请输入电子邮箱地址", "EMAIL": "placeholder$请输入电子邮箱地址",
"PASSWORD": "placeholder$请输入密码", "PASSWORD": "placeholder$请输入密码",
@@ -577,8 +581,8 @@ var JSLang = {
"SHAREMANAGE": "共享管理", "SHAREMANAGE": "共享管理",
"SETTINGS": "设置", "SETTINGS": "设置",
"LOGOUT": "退出登录", "LOGOUT": "退出登录",
"IMPORT": "导入用户数据", "IMPORT": "导入用户项目",
"EXPORT": "导出用户数据", "EXPORT": "导出用户项目",
"CONNECTINGSERVER": "正在连接服务器", "CONNECTINGSERVER": "正在连接服务器",
"MANAGECOUNT": "管理项目数", "MANAGECOUNT": "管理项目数",
"OFFLINECOUNT": "离线消息数", "OFFLINECOUNT": "离线消息数",
@@ -616,6 +620,8 @@ var JSLang = {
"CFMSET":"确定设置" "CFMSET":"确定设置"
}, },
"tw": { "tw": {
"OPENSRC":"開源倉庫",
"ADMINDASH": "管理後台",
"TOPIC": "主題", "TOPIC": "主題",
"MESSAGE": "消息", "MESSAGE": "消息",
"TIME":"時間", "TIME":"時間",
@@ -623,7 +629,7 @@ var JSLang = {
"ADMIN":"管理", "ADMIN":"管理",
"BASICADMIN": "基礎設置", "BASICADMIN": "基礎設置",
"USERADMIN": "批量註冊", "USERADMIN": "批量註冊",
"MQTTADMIN": "連接管理", "DATAADMIN": "數據管理",
"UPEMAIL": "註冊郵箱:", "UPEMAIL": "註冊郵箱:",
"EMAIL": "placeholder$請輸入電子郵箱地址", "EMAIL": "placeholder$請輸入電子郵箱地址",
"PASSWORD": "placeholder$請輸入密碼", "PASSWORD": "placeholder$請輸入密碼",
@@ -642,8 +648,8 @@ var JSLang = {
"SHAREMANAGE": "共享管理", "SHAREMANAGE": "共享管理",
"SETTINGS": "設置", "SETTINGS": "設置",
"LOGOUT": "退出登錄", "LOGOUT": "退出登錄",
"IMPORT": "匯入用戶數據", "IMPORT": "匯入用戶項目",
"EXPORT": "匯出用戶數據", "EXPORT": "匯出用戶項目",
"CONNECTINGSERVER": "正在連接服務器", "CONNECTINGSERVER": "正在連接服務器",
"MANAGECOUNT": "管理項目數", "MANAGECOUNT": "管理項目數",
"OFFLINECOUNT": "離線消息數", "OFFLINECOUNT": "離線消息數",

View File

@@ -6,6 +6,7 @@ function showmodaltext(text){
return d return d
} }
$(function(){ $(function(){
$("#admin").attr("href","http://"+window.location.href.split("//")[1].split(":")[0]+":18084")
fullHeight = $("#cd").height()+"px" fullHeight = $("#cd").height()+"px"
halfHeight = "calc( "+($("#cd").height()-$("#ref1").height()-$("#reset_text").height()-10)+"px - 1rem)" halfHeight = "calc( "+($("#cd").height()-$("#ref1").height()-$("#reset_text").height()-10)+"px - 1rem)"
if(window.screen.width<800) if(window.screen.width<800)

36
src/js/manage.js Normal file
View File

@@ -0,0 +1,36 @@
$(function(){
$.getJSON("queryData",function(res){
for(var i = 0;i<=res.length-1;i = i+1)
{
$("#tbody").append("<tr><td>"+res[i]["username"]+"</td><td>"+res[i]["projects"]+"</td><td>"+res[i]["messages"]+"</td><td>"+ "<a class='btn btn-primary' style='cursor:pointer;' onclick=\"clearMessage('"+res[i]["username"]+"')\" >清空消息</a>"+"</td></tr>")
}
datatable = $("#table").DataTable({
"order": [[ 2, "desc" ]],
language: {
"sProcessing": "处理中...",
"sLengthMenu": "每页 _MENU_ 项",
"sZeroRecords": "没有匹配结果",
"sInfo": "显示第 _START_ 项至 第 _END_ 项结果,共 _TOTAL_ 项",
"sInfoEmpty": "显示第 0 项至 0 项结果,共 0 项",
"sInfoFiltered": "(由 _MAX_ 项结果过滤)",
"sInfoPostFix": "",
"sSearch": "搜索:",
"sUrl": "",
"sEmptyTable": "表中数据为空",
"sLoadingRecords": "载入中...",
"sInfoThousands": ",",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "上页",
"sNext": "下页",
"sLast": "末页"
},
"oAria": {
"sSortAscending": ": 以升序排列此列",
"sSortDescending": ": 以降序排列此列"
}
}
});
$("#table").attr("class","table table-striped table-bordered dataTable no-footer")
})
})

View File

@@ -756,6 +756,7 @@ function view_project(projectName,projectType){
switch_mode() switch_mode()
init_codemirror() init_codemirror()
} }
$(".blocklySvg").attr("height","100%")
}) })
$("#bottom_2").removeAttr("hidden") $("#bottom_2").removeAttr("hidden")
var prevLogic = JSON.parse(res)['logicStorage'] var prevLogic = JSON.parse(res)['logicStorage']

View File

@@ -96,14 +96,86 @@ async function daemon_start(){
extended: true extended: true
})); }));
app.set('trust proxy', 1) app.set('trust proxy', 1)
app.use(session({
secret: 'mixio',
name: 'mixio',
resave: false,
rolling: true,
saveUninitialized: true,
cookie: {
path: '/',
httpOnly: true,
maxAge: 1800000
}
}));
app.get('/',function(req,res){ app.get('/',function(req,res){
ejs.renderFile(__dirname +'/ejs/admin.ejs', { ejs.renderFile(__dirname +'/ejs/admin.ejs', {
}, function (err, data) { }, function (err, data) {
res.send(data) res.send(data)
}) })
}) })
app.get('/queryData', function(req, res){
var data = []
var messages = []
var cb = function(num,newFunc){
if(num>=1)
{
var next = num - 1
reserveDBs[next].all("select userName,count(*) from `reserve` group by userName", function(err,rows){
if(rows)
{
messages.push(...rows)
}
cb(next,newFunc)
})
}
else
{
newFunc()
}
}
cb(8,function(){
db.all("select username from `user`",function(err, rows1){
db.all("select userName,count(*) from `project` group by username",function(err, rows2){
for(var i = 0;i<=rows1.length-1;i = i+1)
{
var username = rows1[i]["username"]
var projects = 0
var msgs = 0
for(var j = 0;j<=rows2.length-1;j = j+1)
{
if(rows2[j]["userName"] == username)
{
projects = rows2[j]["count(*)"]
break
}
}
for(var j = 0;j<=messages.length-1;j = j+1)
{
if(messages[j]["userName"] == username)
{
msgs = messages[j]["count(*)"]
break
}
}
data.push({
"username":username,
"projects":projects,
"messages":msgs
})
}
res.send(data)
})
})
})
})
app.get('/admin', function (req, res) { app.get('/admin', function (req, res) {
if(req.query.userName==(configs["ADMIN_USERNAME"]?configs["ADMIN_USERNAME"]:"admin") &&req.query.password==(configs["ADMIN_PASSWORD"]?configs["ADMIN_PASSWORD"]:"public")) if(req.session.admin)
{ {
ejs.renderFile(__dirname +'/ejs/manage.ejs', { ejs.renderFile(__dirname +'/ejs/manage.ejs', {
'configs': configs, 'configs': configs,
@@ -114,8 +186,51 @@ async function daemon_start(){
}) })
} }
else else
res.redirect('/')
})
app.get('/clearMessage',function(req, res){
if(req.session.admin)
{ {
res.send('账号或密码错误。') var userName = req.query.userName
if(userName)
{
var hash = 0, i, chr;
if (this.length === 0) return hash;
for (i = 0; i < userName.length; i++) {
chr = userName.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0;
}
var targetDB = reserveDBs[Math.abs(hash)%8]
targetDB.run("delete from `reserve` where userName=?",[userName,],function(err){
if(err)
{
console.log(err.message)
res.send('-1')
}
else
{
res.send('1')
}
})
}
else
res.send('-1')
}
else
res.send('-1')
})
app.post('/adminLogin', function(req, res){
if(req.body.userName==(configs["ADMIN_USERNAME"]?configs["ADMIN_USERNAME"]:"admin") &&req.body.password==(configs["ADMIN_PASSWORD"]?configs["ADMIN_PASSWORD"]:"public"))
{
req.session.admin = true
res.send('1')
}
else
{
res.send('-1')
} }
}) })
@@ -364,7 +479,7 @@ var mixioServer = function(){
} else if (topic[2] == '9d634e1a156dc0c1611eb4c3cff57276') { } else if (topic[2] == '9d634e1a156dc0c1611eb4c3cff57276') {
db.run("delete from devices where userName = ? and clientid = ?", [topic[0], payload]) db.run("delete from devices where userName = ? and clientid = ?", [topic[0], payload])
} }
else if(reserveJSON[topic[0]]){ else if(configs["ALLOW_HOOK"]&&reserveJSON[topic[0]]&&topic[0]!="$SYS"){
var userName = topic[0] var userName = topic[0]
var reserveTopic = topic[1] + "/" + topic[2] var reserveTopic = topic[1] + "/" + topic[2]
var hash = 0, i, chr; var hash = 0, i, chr;
@@ -374,7 +489,7 @@ var mixioServer = function(){
hash = ((hash << 5) - hash) + chr; hash = ((hash << 5) - hash) + chr;
hash |= 0; hash |= 0;
} }
var targetDB = reserveDBs[hash%8] var targetDB = reserveDBs[Math.abs(hash)%8]
targetDB.get("select count(*) from 'reserve' where userName = ?", [userName,], function(err, row){ targetDB.get("select count(*) from 'reserve' where userName = ?", [userName,], function(err, row){
if(err){ if(err){
console.log(err.message) console.log(err.message)
@@ -734,7 +849,7 @@ var mixioServer = function(){
hash = ((hash << 5) - hash) + chr; hash = ((hash << 5) - hash) + chr;
hash |= 0; hash |= 0;
} }
reserveDBs[hash%8].all("select * from `reserve` where userName=?", [req.session.userName], function (err, rows) { reserveDBs[Math.abs(hash)%8].all("select * from `reserve` where userName=?", [req.session.userName], function (err, rows) {
if(err) if(err)
{ {
console.log(err) console.log(err)
@@ -1332,7 +1447,7 @@ var mixioServer = function(){
hash = ((hash << 5) - hash) + chr; hash = ((hash << 5) - hash) + chr;
hash |= 0; hash |= 0;
} }
reserveDBs[hash%8].run("delete from `reserve` where userName = ?",[userName, ],function(err){ reserveDBs[Math.abs(hash)%8].run("delete from `reserve` where userName = ?",[userName, ],function(err){
if(err) if(err)
{ {
console.log(err.message) console.log(err.message)
@@ -1482,6 +1597,12 @@ var MixIOclosure = function(userName,projectName,projectPass,dataStorage,dom){
var that = this var that = this
this.errorMessage = "" this.errorMessage = ""
this.dataSave = JSON.parse(dataStorage) this.dataSave = JSON.parse(dataStorage)
if(!this.dataSave || !this.dataSave["received"])
{
this.dataSave = {
"received":{}
}
}
this.lastPublishTime = [new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0)], this.lastPublishTime = [new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0),new Date(0)],
this.minPublishInterval = 500, this.minPublishInterval = 500,
this.client = mqtt.connect('ws://localhost:8083',{ this.client = mqtt.connect('ws://localhost:8083',{

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +1,5 @@
{ {
"version": "1.7.0", "version": "1.9.0",
"platform": "linux-x64", "platform": "win-x64",
"node-version": "12" "node-version": "12"
} }