历史操作功能
This commit is contained in:
parent
103cb878dc
commit
9ddea88f8c
|
@ -16,6 +16,11 @@ all:
|
||||||
$(cc) sqlite3.c sqlite_cgi_base.c -o sqlite_cgi_base.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
$(cc) sqlite3.c sqlite_cgi_base.c -o sqlite_cgi_base.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
||||||
$(cc) sqlite3.c sqlite_cgi_insert_base.c -o sqlite_cgi_insert_base.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
$(cc) sqlite3.c sqlite_cgi_insert_base.c -o sqlite_cgi_insert_base.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
||||||
$(cc) sqlite3.c green_house_info_show.c -o green_house_info_show.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
$(cc) sqlite3.c green_house_info_show.c -o green_house_info_show.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
||||||
|
$(cc) sqlite3.c record_of_operations_history.c -o record_of_operations_history.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
||||||
|
|
||||||
|
record_of_operations_history:
|
||||||
|
$(cc) sqlite3.c record_of_operations_history.c -o record_of_operations_history.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
green_house_info_show:
|
green_house_info_show:
|
||||||
$(cc) sqlite3.c green_house_info_show.c -o green_house_info_show.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
$(cc) sqlite3.c green_house_info_show.c -o green_house_info_show.cgi $(SQLITE3_CFLAGS) $(CJSON_CFLAGS)
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
#include <cjson/cJSON.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "includes/sqlite3.h"
|
|
||||||
|
|
||||||
// cJSON *result_json; // 用于存储查询结果
|
|
||||||
|
|
||||||
// sqlite3的回调函数
|
|
||||||
// sqlite 每查到一条记录,就调用一次这个回调
|
|
||||||
int sql_search_callback(void* NotUsed, int argc, char** argv, char** azColName);
|
|
||||||
|
|
||||||
int main(int argc, char const* argv[]) {
|
|
||||||
// result_json = cJSON_CreateObject(); // 创建 JSON 对象
|
|
||||||
|
|
||||||
// 连接到 SQLite 数据库
|
|
||||||
sqlite3* db; // 声明 sqlite3 类型变量,即声明一个数据库对象
|
|
||||||
char* zErrMsg = 0; // 用于存储错误信息
|
|
||||||
int rc; // 用于存储函数返回值
|
|
||||||
|
|
||||||
rc = sqlite3_open(
|
|
||||||
"../sql_base/green_house.db",
|
|
||||||
&db); // 打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
|
|
||||||
if (rc) {
|
|
||||||
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
|
|
||||||
sqlite3_close(db);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fprintf(stderr, "ok Opened database successfully\n");
|
|
||||||
|
|
||||||
// 获取前端传递的 JSON 数据
|
|
||||||
char request_data[128] = "";
|
|
||||||
fgets(request_data, 128, stdin); // 从标准输入中读取一行数据
|
|
||||||
|
|
||||||
// 解析 JSON 数据
|
|
||||||
cJSON* json_buf = cJSON_Parse(request_data); // 解析 JSON 数据
|
|
||||||
if (json_buf == NULL) {
|
|
||||||
fprintf(stderr, "Error parsing JSON data\n");
|
|
||||||
sqlite3_close(db);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取用户名和密码
|
|
||||||
cJSON* user = cJSON_GetObjectItemCaseSensitive(json_buf, "name");
|
|
||||||
cJSON* password = cJSON_GetObjectItemCaseSensitive(json_buf, "password");
|
|
||||||
|
|
||||||
// if (user == NULL || password == NULL || !cJSON_IsString(user) ||
|
|
||||||
// !cJSON_IsString(password)) { // 是否是非法输入
|
|
||||||
// fprintf(stderr,
|
|
||||||
// "Error getting username and/or password from JSON data\n");
|
|
||||||
// cJSON_Delete(json_buf);
|
|
||||||
// sqlite3_close(db);
|
|
||||||
// return 1;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 拿到用户名和密码
|
|
||||||
char* username_from_frontend = user->valuestring;
|
|
||||||
char* password_from_frontend = password->valuestring;
|
|
||||||
|
|
||||||
printf("username is %s, pwd is %s\n", username_from_frontend,
|
|
||||||
password_from_frontend);
|
|
||||||
|
|
||||||
// 构建查询语句
|
|
||||||
char query_sql[128] = "";
|
|
||||||
sprintf(query_sql,
|
|
||||||
"insert into record_of_operations "
|
|
||||||
"(oper_user_name,operation_detail,operation_time) "
|
|
||||||
"values('%s','%s','%s');",
|
|
||||||
username_from_frontend, password_from_frontend); // 构建插入语句
|
|
||||||
|
|
||||||
printf("query_sql is %s\n", query_sql);
|
|
||||||
|
|
||||||
// 执行查询语句
|
|
||||||
rc = sqlite3_exec(db, query_sql, NULL, NULL, &zErrMsg); // 执行查询语句
|
|
||||||
// rc = sqlite3_exec(db, query_sql, sql_search_callback, 0, &zErrMsg); //
|
|
||||||
// 执行查询语句
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
fprintf(stderr, "SQL error: %s\n", zErrMsg);
|
|
||||||
sqlite3_free(zErrMsg);
|
|
||||||
cJSON_Delete(json_buf);
|
|
||||||
sqlite3_close(db);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 释放资源
|
|
||||||
cJSON_Delete(json_buf);
|
|
||||||
sqlite3_close(db);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sql_search_callback(void* NotUsed,
|
|
||||||
int argc,
|
|
||||||
char** argv,
|
|
||||||
char** azColName) {
|
|
||||||
// int i;
|
|
||||||
// for (i = 0; i < argc; i++)
|
|
||||||
// {
|
|
||||||
// printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
|
|
||||||
// }
|
|
||||||
cJSON* result_json = cJSON_CreateObject();
|
|
||||||
if (argc == 0) {
|
|
||||||
cJSON_AddNumberToObject(result_json, "code", 1);
|
|
||||||
cJSON_AddStringToObject(result_json, "msg", "用户名或密码错误");
|
|
||||||
} else
|
|
||||||
cJSON_AddNumberToObject(result_json, "code", 0);
|
|
||||||
|
|
||||||
char* result_json_string = cJSON_Print(result_json);
|
|
||||||
|
|
||||||
// 输出 JSON 结果
|
|
||||||
printf("content-type: application/json;charset=utf-8\r\n");
|
|
||||||
printf("\r\n");
|
|
||||||
printf("%s\n", result_json_string);
|
|
||||||
|
|
||||||
free(result_json_string);
|
|
||||||
return SQLITE_OK;
|
|
||||||
}
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
#include <cjson/cJSON.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "includes/sqlite3.h"
|
||||||
|
|
||||||
|
// cJSON *result_json; // 用于存储查询结果
|
||||||
|
|
||||||
|
// sqlite3的回调函数
|
||||||
|
// sqlite 每查到一条记录,就调用一次这个回调
|
||||||
|
int sql_search_callback(void* data, int argc, char** argv, char** azColName) {
|
||||||
|
cJSON* result_array = (cJSON*)data;
|
||||||
|
cJSON* item = cJSON_CreateObject();
|
||||||
|
|
||||||
|
// 遍历每一列,并将数据添加到 JSON 对象中
|
||||||
|
for (int i = 0; i < argc; i++) {
|
||||||
|
cJSON_AddStringToObject(item, azColName[i], argv[i] ? argv[i] : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
int isDuplicate = 0;
|
||||||
|
cJSON* existingItem = result_array->child;
|
||||||
|
while (existingItem != NULL) {
|
||||||
|
if (cJSON_Compare(existingItem, item, 1)) {
|
||||||
|
isDuplicate = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
existingItem = existingItem->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果不是重复的结果,则添加到 JSON 数组中
|
||||||
|
if (!isDuplicate) {
|
||||||
|
cJSON_AddItemToArray(result_array, item);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int main(int argc, char const* argv[]) {
|
||||||
|
// 连接到 SQLite 数据库
|
||||||
|
sqlite3* db; // 声明 sqlite3 类型变量,即声明一个数据库对象
|
||||||
|
char* zErrMsg = 0; // 用于存储错误信息
|
||||||
|
int rc; // 用于存储函数返回值
|
||||||
|
|
||||||
|
rc = sqlite3_open(
|
||||||
|
"../sql_base/green_house.db",
|
||||||
|
&db); // 打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
|
||||||
|
sqlite3_close(db);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "ok Opened database successfully\n");
|
||||||
|
|
||||||
|
// 构建查询语句
|
||||||
|
char query_sql[128] = "";
|
||||||
|
sprintf(query_sql,
|
||||||
|
"select oper_user_name, operation_detail , operation_time from "
|
||||||
|
"record_of_operations ;"); // 构建查询
|
||||||
|
|
||||||
|
cJSON* result_array = cJSON_CreateArray();
|
||||||
|
|
||||||
|
// printf("query_sql is %s\n", query_sql);
|
||||||
|
|
||||||
|
// 执行查询语句
|
||||||
|
rc = sqlite3_exec(db, query_sql, sql_search_callback, result_array,
|
||||||
|
&zErrMsg); // 执行查询语句
|
||||||
|
// rc = sqlite3_exec(db, query_sql, sql_search_callback, 0, &zErrMsg); //
|
||||||
|
// 执行查询语句
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
fprintf(stderr, "SQL error: %s\n", zErrMsg);
|
||||||
|
sqlite3_free(zErrMsg);
|
||||||
|
// cJSON_Delete(json_buf);
|
||||||
|
sqlite3_close(db);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* json_str = cJSON_Print(result_array);
|
||||||
|
|
||||||
|
printf("Content-Type: application/json;charset=utf-8\r\n");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("%s", json_str);
|
||||||
|
|
||||||
|
free(json_str);
|
||||||
|
cJSON_Delete(result_array);
|
||||||
|
|
||||||
|
// 释放资源
|
||||||
|
sqlite3_close(db);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -22,6 +22,7 @@
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
/* width: 700px; */
|
/* width: 700px; */
|
||||||
|
height: 20px;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,7 +143,7 @@
|
||||||
<a href="./record_of_operations_history.html" target="content_frame" class="menu_item">历史操作</a>
|
<a href="./record_of_operations_history.html" target="content_frame" class="menu_item">历史操作</a>
|
||||||
</div>
|
</div>
|
||||||
<div id="content" style="width:100%;">
|
<div id="content" style="width:100%;">
|
||||||
<iframe name="content_frame" width="100%" height="100%" scrolling="auto"></iframe>
|
<iframe name="content_frame" width="100%" height="100%" overflow="auto"></iframe>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,50 +1,98 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="keywords" content="">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>历史操作表</title>
|
<title>温湿度</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablecenter {
|
||||||
|
display: flex;
|
||||||
|
/* justify-content: center; */
|
||||||
|
/* align-items: center; */
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
/* width: 700px; */
|
||||||
|
height: 20px;
|
||||||
|
background-color: #fff;
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
padding: 10px;
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr {
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:nth-child(even) {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:hover {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1 align="center">历史操作表</h1>
|
<div class="tablecenter">
|
||||||
<table id="arpTable" width="500" border="1" align="center">
|
<table id="arpTable">
|
||||||
<thead>
|
<thead>
|
||||||
<th>用户名</th>
|
<th>用户</th>
|
||||||
<th>操作指令</th>
|
<th>操作</th>
|
||||||
<th>操作时间</th>
|
<th>时间</th>
|
||||||
|
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="arpBody" align="center">
|
<tbody id="greenTableBody">
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
window.onload = function () {
|
function loadBlackData() {
|
||||||
query("");
|
var blackData;
|
||||||
}
|
fetch("../cgi-bin/record_of_operations_history.cgi")
|
||||||
function query(val) {
|
.then(resp => resp.json())
|
||||||
fetch("/cgi-bin/router_showarp.cgi").then(resp =>
|
.then(data => {
|
||||||
resp.json()).then(data => {
|
blackData = data;
|
||||||
if (data.code == 0) {
|
greenTableBody.innerHTML = "";
|
||||||
arpBody.innerText = "";
|
data.forEach(rowData => {
|
||||||
|
|
||||||
data.data.forEach(rowData => {
|
|
||||||
let tr = document.createElement("tr");
|
let tr = document.createElement("tr");
|
||||||
let td1 = document.createElement("td");
|
let td1 = document.createElement("td");
|
||||||
let td2 = document.createElement("td");
|
let td2 = document.createElement("td");
|
||||||
|
let td3 = document.createElement("td");
|
||||||
|
|
||||||
td1.innerText = rowData.ip;
|
td1.innerText = rowData.oper_user_name;
|
||||||
td2.innerText = rowData.mac;
|
td2.innerText = rowData.operation_detail;
|
||||||
|
td3.innerText = rowData.operation_time;
|
||||||
|
|
||||||
tr.append(td1, td2);
|
tr.append(td1, td2, td3);
|
||||||
arpBody.append(tr);
|
greenTableBody.append(tr);
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = function () {
|
||||||
|
loadBlackData();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,14 @@
|
||||||
|
-- 开启表头显示
|
||||||
|
.headers on
|
||||||
|
|
||||||
|
-- 设置列的宽度
|
||||||
|
.mode column
|
||||||
|
|
||||||
|
-- 插入数据到用户登录表
|
||||||
|
insert into record_of_operations
|
||||||
|
(oper_user_name,operation_detail, operation_time)
|
||||||
|
values
|
||||||
|
('admin', 'led:on', 'null');
|
||||||
|
|
||||||
|
-- 显示用户登录表的数据
|
||||||
|
select * from record_of_operations;
|
Loading…
Reference in New Issue