From 7be76df50bb0f330291f3cd635658aeafb8bd51e Mon Sep 17 00:00:00 2001 From: XDL163 <1056102915@qq.com> Date: Wed, 18 Dec 2024 10:37:23 +0800 Subject: [PATCH] add Computer_status --- .idea/.gitignore | 8 ++ Computer_status.py | 226 ++++++++++++++++++++++++++++++++++++ README.md | 23 +++- data/computer_status.db.bak | 43 +++++++ data/computer_status.db.dat | Bin 0 -> 47870 bytes data/computer_status.db.dir | 43 +++++++ 6 files changed, 340 insertions(+), 3 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 Computer_status.py create mode 100644 data/computer_status.db.bak create mode 100644 data/computer_status.db.dat create mode 100644 data/computer_status.db.dir diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Computer_status.py b/Computer_status.py new file mode 100644 index 0000000..3652d23 --- /dev/null +++ b/Computer_status.py @@ -0,0 +1,226 @@ +import random +import shelve +import json +from datetime import datetime + +# 定义数据对象 +class Computer_status: + def __init__(self, time, ram_all, ram_use, cpu_use, cpu_c, disk, web, gpu): + self.time = time # 时间戳,单位:秒 + self.ram_all = ram_all # 总内存 + self.ram_use = ram_use # 已占用内存 + self.cpu_use = cpu_use # CPU 占用百分比 + self.cpu_c = cpu_c # CPU 温度 + self.disk = disk # 磁盘信息 + self.web = web # 网络流量信息 + self.gpu = gpu # GPU 信息 + + def to_dict(self): + """将对象转换为字典""" + return { + "time": self.time, + "ram_all": self.ram_all, + "ram_use": self.ram_use, + "cpu_use": self.cpu_use, + "cpu_c": self.cpu_c, + "disk": self.disk, + "web": self.web, + "gpu": self.gpu, + } + + @staticmethod + def from_dict(data): + """从字典创建 Computer_status 对象""" + return Computer_status( + time=data["time"], + ram_all=data["ram_all"], + ram_use=data["ram_use"], + cpu_use=data["cpu_use"], + cpu_c=data["cpu_c"], + disk=data["disk"], + web=data["web"], + gpu=data["gpu"], + ) + + +# 数据操作方法 +DATABASE_FILE = "data/computer_status.db" # 数据库存储文件 + + +def write_data(computer_status): + """ + 写入一条数据到对象数据库 + 参数: + computer_status: Computer_status 对象 + """ + if not isinstance(computer_status, Computer_status): + raise ValueError("Input must be a Computer_status object") + with shelve.open(DATABASE_FILE) as db: + db[str(computer_status.time)] = computer_status + + +# def get_data_30s(): +# """ +# 获取最新30秒的数据 +# 返回: +# List[Computer_status],按时间升序排列 +# """ +# current_time = int(datetime.now().timestamp()) +# with shelve.open(DATABASE_FILE) as db: +# data = [ +# db[key] +# for key in db +# if current_time - int(key) <= 30 # 过滤最近30秒数据 +# ] +# return sorted(data, key=lambda x: x.time) +# +# +# def get_data(time_start, time_end): +# """ +# 获取指定时间戳到指定时间戳之间的数据 +# 参数: +# time_start: 开始时间戳(int) +# time_end: 结束时间戳(int) +# 返回: +# List[Computer_status],按时间升序排列 +# """ +# with shelve.open(DATABASE_FILE) as db: +# data = [ +# db[key] +# for key in db +# if time_start <= int(key) <= time_end +# ] +# return sorted(data, key=lambda x: x.time) +# +# +# def get_data_json_30s(): +# """ +# 获取最新30秒数据并转为 JSON +# 返回: +# JSON 数据(List[Dict]) +# """ +# data = get_data_30s() +# return json.dumps([cs.to_dict() for cs in data], indent=4) +# +# +# def get_data_json(time_start, time_end): +# """ +# 获取指定时间范围的数据并转为 JSON +# 参数: +# time_start: 开始时间戳(int) +# time_end: 结束时间戳(int) +# 返回: +# JSON 数据(List[Dict]) +# """ +# data = get_data(time_start, time_end) +# return json.dumps([cs.to_dict() for cs in data], indent=4) + + + +def delete_data(time_start): + """ + 删除 time_start 之前的数据 + 参数: + time_start: 开始时间戳(int),保留此时间戳之后的数据 + """ + with shelve.open(DATABASE_FILE, writeback=True) as db: + keys_to_delete = [key for key in db if int(key) < time_start] + for key in keys_to_delete: + del db[key] + print(f"已删除 {len(keys_to_delete)} 条记录") + + + + +# 实时数据生成函数 +def generate_data(timestamp): + """生成一个 Computer_status 对象""" + return Computer_status( + time=timestamp, + ram_all=16000, + ram_use=random.randint(8000, 16000), + cpu_use=random.randint(10, 90), + cpu_c=random.randint(40, 70), + disk={"disk1": [100000, random.randint(50000, 90000), random.randint(100, 500), random.randint(200, 600)]}, + web={"eth0": [random.randint(500, 1500), random.randint(1000, 2500)]}, + gpu={"GPU1": {"gpu_ram_all": 8, "gpu_ram_use": random.uniform(2, 8), "gpu_use": random.randint(10, 90), "gpu_fan": random.randint(20, 80)}} + ) + +# 数据操作方法 +def get_data_30s(): + """ + 实时生成最新30秒的数据 + 返回: + List[Computer_status],按时间升序排列 + """ + current_time = int(datetime.now().timestamp()) + data = [generate_data(current_time - i) for i in range(30)] # 生成过去30秒的数据 + return sorted(data, key=lambda x: x.time) + +def get_data(time_start, time_end): + """ + 实时生成指定时间范围的数据 + 参数: + time_start: 开始时间戳(int) + time_end: 结束时间戳(int) + 返回: + List[Computer_status],按时间升序排列 + """ + data = [generate_data(timestamp) for timestamp in range(time_start, time_end + 1)] + return sorted(data, key=lambda x: x.time) + +def get_data_json_30s(): + """ + 实时生成最新30秒数据并转为 JSON + 返回: + JSON 数据(List[Dict]) + """ + data = get_data_30s() + return json.dumps([cs.to_dict() for cs in data], indent=4) + +def get_data_json(time_start, time_end): + """ + 实时生成指定时间范围的数据并转为 JSON + 参数: + time_start: 开始时间戳(int) + time_end: 结束时间戳(int) + 返回: + JSON 数据(List[Dict]) + """ + data = get_data(time_start, time_end) + return json.dumps([cs.to_dict() for cs in data], indent=4) + + + +# 示例测试 +if __name__ == "__main__": + # # 创建一些测试数据 + # for i in range(40): + # cs = Computer_status( + # time=int(datetime.now().timestamp()) - i, + # ram_all=16000, + # ram_use=8000 + i * 100, + # cpu_use=50 + i, + # cpu_c=60 - i, + # disk={"disk1": [100000, 50000 + i * 100, 100, 200]}, + # web={"eth0": [1000 + i * 10, 2000 + i * 20]}, + # gpu={"GPU1": {"gpu_ram_all": 8, "gpu_ram_use": 4 + i / 10, "gpu_use": 30 + i, "gpu_fan": 50 + i}}, + # ) + # write_data(cs) + # + # # 获取最新30秒数据 + # print("最新30秒数据(JSON):") + # print(get_data_json_30s()) + # + # # 获取指定时间段的数据 + # time_now = int(datetime.now().timestamp()) + # print(f"指定时间段数据({time_now - 20} 到 {time_now - 10}):") + # print(get_data_json(time_now - 20, time_now - 10)) + # 获取最新30秒的实时数据 + print("最新30秒数据(JSON):") + print(get_data_json_30s()) + + # 获取指定时间范围的实时数据 + time_now = int(datetime.now().timestamp()) + print(f"指定时间段数据({time_now - 20} 到 {time_now - 10}):") + print(get_data_json(time_now - 20, time_now - 10)) diff --git a/README.md b/README.md index 88c6759..3d4b4c2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# Computer_status - # 服务器监控面板 @@ -144,6 +142,25 @@ time_end } +### 数据删除方法 + +删除time_start之前的数据 +方法名称:delete_data + +参数:{ + +time_start + +类型 int + +备注:开始时间 + +} + + + + + ## 数据存储部分 每隔一秒,读取电脑状态,打包成Computer_status对象,调用Computer_status.write_data @@ -158,7 +175,7 @@ time_end 可以选择查看指定时间端的历史信息,发送请求,包含开始时间和结束时间,服务器调用Computer_status.get_data_json,返回json -### **Web 前端** +### **Web 前端** ### **Python 服务器后端** diff --git a/data/computer_status.db.bak b/data/computer_status.db.bak new file mode 100644 index 0000000..f75d535 --- /dev/null +++ b/data/computer_status.db.bak @@ -0,0 +1,43 @@ +'1734488810', (20480, 254) +'1734488809', (20992, 254) +'1734488808', (21504, 254) +'1734488807', (22016, 254) +'1734488806', (22528, 254) +'1734488805', (23040, 254) +'1734488804', (23552, 254) +'1734488803', (24064, 254) +'1734488802', (24576, 254) +'1734488801', (25088, 254) +'1734488800', (25600, 254) +'1734488799', (26112, 254) +'1734488798', (26624, 254) +'1734488797', (27136, 254) +'1734488796', (27648, 254) +'1734488795', (28160, 254) +'1734488794', (28672, 254) +'1734488793', (29184, 254) +'1734488792', (29696, 254) +'1734488791', (30208, 254) +'1734488790', (30720, 254) +'1734488832', (36864, 254) +'1734488831', (37376, 254) +'1734488830', (37888, 254) +'1734488829', (38400, 254) +'1734488828', (38912, 254) +'1734488827', (39424, 254) +'1734488826', (39936, 254) +'1734488825', (40448, 254) +'1734488824', (40960, 254) +'1734488823', (41472, 254) +'1734488822', (41984, 254) +'1734488821', (42496, 254) +'1734488820', (43008, 254) +'1734488819', (43520, 254) +'1734488818', (44032, 254) +'1734488817', (44544, 254) +'1734488816', (45056, 254) +'1734488815', (45568, 254) +'1734488814', (46080, 254) +'1734488813', (46592, 254) +'1734488812', (47104, 254) +'1734488811', (47616, 254) diff --git a/data/computer_status.db.dat b/data/computer_status.db.dat new file mode 100644 index 0000000000000000000000000000000000000000..78db06da5ffea6b2ebaf7ea83b342ddea3ae62b4 GIT binary patch literal 47870 zcmeI*ZE%#;6$kL`aMwh1rm2RA7y%(@kPz|)EXn4b_vC7n7tzt#1QQXPV1{g_eo!aQ zFdaVZ2ghz_sKW)Br&NqsA7Mw$`FXrHYD*Hnx5CSv_-R?ws@C-cPwb z`yuSI8F(IkoSXmi?78<2s9$~&$v#rKi9}Dw#!ZPtI`!k`+k1NZlUDl+B?@AY^RB~faS9;}373(*oayEDLBs#jg(|VvT`=YN#)$!+n>n1Xt_2O z%{;$3-BOrRog4dp8vH4#Xy!?I`lfX8${j!dQA7{F($d*7)YX@o@UyP`Z z@9W~IZkw2SXG3p)_|CGnHRa)voEQ8~;)f$>$xXrQ%-_4Lq3}rNaWs{a`L^&-f@91) zzolbSa9I6){p(A=KlA_NUj{7w4>SHnCCGmj_+LW%R}GW?6;a)3<$q~q_(1;k$bXgi zhyUws{f8L;t=NAx_)nqzx6%IbsJ_F_|5usE{m8!o`L7m#C;vl?|0(Rh2K+Ck{l{qk zrBR)-@}HU=)scTA@?RtVPW}fO|F*ek{9g+2BbZ@TB_5X!N{a=p!tHs~R|9QrL5c}7Feed-zff0{?9P}1K7U_ z{7Y#6dujizO6Q$xbNydnzE5BHDj9?SEY9-FE&){#$_jSBk%r|I>`W3O;Cq`fmaMnY4fYQL_HuReI3Me@b|M zIR7m~{w?C~})%kI~lu5yoHU|NHO%Fyk-t|NZxWi1C;C|Ni?w$oR|rfB*e=GX66E z-+%uH7=M}n@4x>?jKB2%`0xKA<1hU`{`-$I{?h;BzyAk}zx4n3@BcpIFa1CM`@hHd zOaG7m{wEoK>HqQH|DTM%^#Azp|1RS%{XhQu|AXQ|Kq>^ z-xz=C|MB1duZ+L+|M>5Jg7KIBAOHQ|X8fi9$AAB~7=P*i@!$VV#$Wn>{P#c3_{;i# z{`>!h@t5`g{P+Je<1g#~`S1S*<1g#~`R_l%_)Gt<|NgHt{?h;JzyE8Dzx4n5@Bb>} zFa5v%`wuhz(*Ntf|0|5Y^#A(re~j^${$Kz7k23z!|Led15yoHofBpA=nemtYU;q6h zmFqX8ayEDLBs#jg(|VvT`y#W?wr-e)*8i=5^&jK(`j2fdlI#DDPSC?SHv9kOWf8J# zK8E{$PetoLR>=B~;lGdV`fvYb>VGHpuLS=Z+J6u2|M>)c($3#l|1&r&*#EIo{GI&& z!}#Y;NA+I?{?)Yq{=?XR0r0K)Lh*O<|CaIJhW%sUzkv3Cg!V5|dbypy zk^hR2e@y(H{J&xR$FTn*@SjinpMQ|7|5BxIwDULeU$8AX!k{&Del^8b?YPhtOB@GqzR zx6}S>mEL9NZ{)vVTSD-!6@MrHGmQUf>|Y1|Wwd`}h^+s1rT5$U8~HETmJIys#NWyP z3&wwSaG?d`e?9omqy0N+|J#%vvGSi}M8xxmPOrO3ZY{GI$iW&BTK|7P%?L;Ihh{qIw{$j;x$fAf%k zv-mstf5Q07{QvBap7HS2w*Ti}jK9qP9}n``W3=@@#rVtofB*eIX8gy`{Qv&}#s!XU literal 0 HcmV?d00001 diff --git a/data/computer_status.db.dir b/data/computer_status.db.dir new file mode 100644 index 0000000..f75d535 --- /dev/null +++ b/data/computer_status.db.dir @@ -0,0 +1,43 @@ +'1734488810', (20480, 254) +'1734488809', (20992, 254) +'1734488808', (21504, 254) +'1734488807', (22016, 254) +'1734488806', (22528, 254) +'1734488805', (23040, 254) +'1734488804', (23552, 254) +'1734488803', (24064, 254) +'1734488802', (24576, 254) +'1734488801', (25088, 254) +'1734488800', (25600, 254) +'1734488799', (26112, 254) +'1734488798', (26624, 254) +'1734488797', (27136, 254) +'1734488796', (27648, 254) +'1734488795', (28160, 254) +'1734488794', (28672, 254) +'1734488793', (29184, 254) +'1734488792', (29696, 254) +'1734488791', (30208, 254) +'1734488790', (30720, 254) +'1734488832', (36864, 254) +'1734488831', (37376, 254) +'1734488830', (37888, 254) +'1734488829', (38400, 254) +'1734488828', (38912, 254) +'1734488827', (39424, 254) +'1734488826', (39936, 254) +'1734488825', (40448, 254) +'1734488824', (40960, 254) +'1734488823', (41472, 254) +'1734488822', (41984, 254) +'1734488821', (42496, 254) +'1734488820', (43008, 254) +'1734488819', (43520, 254) +'1734488818', (44032, 254) +'1734488817', (44544, 254) +'1734488816', (45056, 254) +'1734488815', (45568, 254) +'1734488814', (46080, 254) +'1734488813', (46592, 254) +'1734488812', (47104, 254) +'1734488811', (47616, 254)