白荼日记 - DelLevin https://blog.iletter.top/author/1/ zh-CN DelLevin Sun, 04 Jan 2026 14:05:00 +0800 Sun, 04 Jan 2026 14:05:00 +0800 Win11打开文件夹显示找不到应用程序 https://blog.iletter.top/archives/519/ https://blog.iletter.top/archives/519/ Sun, 04 Jan 2026 14:05:00 +0800 DelLevin
  • 按【 Win + R 】组合键,打开运行,输入【regedit】命令,按【确定或回车】打开注册表编辑器;
  • 注册表编辑器窗口,依次展开到以下路径:
    HKEY_CLASSES_ROOT\Folder\shell
  • 在【Shell】下通常默认有下图几项,如果有其它第三方软件命名项,我们可以【右键删除】;
  • 左侧列表中,点击【shell】,在右侧双击名称为【默认】的项;
  • 将数值数据【清空】,最后点击【确定】;
  • 以上设置完成后,重启电脑再看是否正常。
  • ]]>
    0 https://blog.iletter.top/archives/519/#comments https://blog.iletter.top/feed/author/1/
    linux服务器实现webdav挂载 https://blog.iletter.top/archives/518/ https://blog.iletter.top/archives/518/ Tue, 30 Dec 2025 14:35:53 +0800 DelLevin 使用 davfs2 (推荐用于标准WebDAV)

    安装 davfs2

    在 Debian/Ubuntu:

    sudo apt update && sudo apt install davfs2

    在 CentOS/RHEL (可能需要EPEL源):

    sudo yum install davfs2

    创建挂载点

    sudo mkdir /home/dellevin/zhang/jellyfin/media/webdav/g3

    配置 davfs2 凭证

    编辑 /etc/davfs2/secrets 文件,添加一行:

    /home/dellevin/zhang/jellyfin/media/webdav/g3 webdav账户 webdav密码

    设置文件权限:

    sudo chmod 600 /etc/davfs2/secrets

    挂载 WebDAV

    sudo mount -t davfs http://webdav地址/path  /home/dellevin/zhang/jellyfin/media/webdav/g3

    卸载

    sudo umount /home/dellevin/zhang/jellyfin/media/webdav/g3
    ]]>
    0 https://blog.iletter.top/archives/518/#comments https://blog.iletter.top/feed/author/1/
    碎片化时代构筑的一个碎片的人 https://blog.iletter.top/archives/517/ https://blog.iletter.top/archives/517/ Sat, 27 Dec 2025 00:03:00 +0800 DelLevin 碎片化时代构筑的一个碎片的人

    我有一个习惯,就是喜好回顾自己的曾经。虽然我对我的同学和好友常说“人生本就应该往前看,一直回头,永远不会长大。”可是真到自己的头上我却是做不到。

    曾经的我喜好写日记,随笔,虽然烂的不行,但是每当我回顾的时候,不管当时是喜是忧。那份曾经用自己残缺的文笔封印住的悸动,在回顾的时候总会有些松动。

    自从工作以后,日记随笔的频率越来越低的,多的反倒是工作的日志。我就像是丢失了近两年的记忆一般,在今晚回顾的时候竟然空无一物,望着空荡荡的日记,我不禁一次又一次的问自己,我到底是谁?

    在这个碎片化的时代,信息爆炸的初期,良莠不齐的信息大批量的涌入我们的视野。我们看着,嬉笑着,怒骂着,感叹着,然后继续面无表情的获取下一条信息,这些残缺无比的信息构筑了一个个残缺无比的人。一碰就碎。贫瘠的知识,片面的视野还有一个麻木的青年。

    我不禁一次又一次的问自己,“你愿做一位痛苦的苏格拉底还是一只快乐的猪?”。我一遍又一遍的告诉自己,“我要做一位痛苦的苏格拉底”。可是这样真的好累啊。这两年我的生活如同“一只快乐的猪”,可是这真的是我自己吗?我也不知道了。或许我不应该上学的。我应该像村里的其他人一样,辍学,外出打工,最后遇见一位女生,结婚生子,然后慢慢的老去,结束自己的一生。

    谁能告诉我,人生到底是什么?

    ]]>
    0 https://blog.iletter.top/archives/517/#comments https://blog.iletter.top/feed/author/1/
    宝塔面板V11.4精简去除vip以及其他推广功能 https://blog.iletter.top/archives/516/ https://blog.iletter.top/archives/516/ Sun, 21 Dec 2025 22:57:03 +0800 DelLevin 该操作仅适用于宝塔面板 V11.4,其他版本需要自行测试。

    功能隐藏:

    关闭不必要的功能

    设置->常用设置->面板栏隐藏,隐藏如下功能

    WAF、WP Tools、多用户、邮局、节点管理

    不想用,隐藏就行了。

    去除首页的软件推荐功能。

    image.png

    一开始我本以为这个是在utils-lib.js里面带着的,后来通过减慢请求查看到是在请求里面带着的。通过搜索关键词get_pay_type发现,是通过getRecommendContent这个请求函数带过来的。所以我们需要在这里设置返还值为空即将

    getRecommendContent=()=>useAxios.post("ajax/get_pay_type")

    替换成

    getRecommendContent=()=>{return []}

    去除日志部分的 SSH 登录日志

    删掉如下部分

    {path:"ssh",name:"ssh",meta:{title:"SSH登录日志"},component:()=>__vitePreload(()=>import("./index57.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},

    去除 SSL 部分的 自动部署

    image.png

    删掉如下部分

    {path:"auto-deploy",name:"auto-deploy",meta:{title:"自动部署"},component:()=>__vitePreload(()=>import("./index89.js?v=1766131796").then(e=>e.i),__vite__mapDeps([]),import.meta.url)},

    去除 安全部分的 安全检测和违规词检测

    image.png

    删掉如下部分

    {path:"safe-detect",name:"safe-detect",meta:{title:"安全检测"},component:()=>__vitePreload(()=>import("./index46.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"keyword",name:"keyword",meta:{title:"违规词检测"},component:()=>__vitePreload(()=>import("./index47.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},

    去除 PHP网站安全 入侵防御 系统加固 扫描感知 部分

    image (1).png

    删掉如下部分

    ,{path:"php-safe",name:"php-safe",meta:{title:"PHP网站安全"},component:()=>__vitePreload(()=>import("./index48.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"intrusion",name:"intrusion",meta:{title:"入侵防御"},component:()=>__vitePreload(()=>import("./index49.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"fixed",name:"fixed",meta:{title:"系统加固"},component:()=>__vitePreload(()=>import("./index50.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"network-scan",name:"network-scan",meta:{title:"扫描感知"},component:()=>__vitePreload(()=>import("./index51.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)}

    去除网站界面 的漏洞扫描 和 网站安全

    找到 index74.js

    image.png

    漏洞扫描删除如下部分

    {type:"custom",render:()=>w(P,{onClick:ee},{default:()=>{var e,t;return[S("漏洞扫描"),w("span",{class:"ml-4px py-1px px-4px text-center font-bold ".concat((null==(e=Se.value)?void 0:e.loophole_num)>0?"text-danger":"text-warning")},[null==(t=Se.value)?void 0:t.loophole_num])]}})},

    网站安全删除如下部分

    ,{type:"custom",render:()=>w(P,{onClick:te},{default:()=>{var e,t;return[S("网站安全"),w("span",{class:"ml-4px py-1px px-4px text-center font-bold ".concat((null==(e=Se.value)?void 0:e.web_scaning_times)>0?"text-danger":"text-warning")},[null==(t=Se.value)?void 0:t.web_scaning_times])]}})}

    去除 table 表格的右侧的统计和 waf

    image.png

    {onClick:e=>{le(e,"monitor-setting")},title:"统计"},{onClick:e=>{le(e,"bt_waf")},title:"WAF"},

    去除网站安全和防篡改

    找到 index235.js

    image (1).png

    删除该部分

    {label:"防篡改",name:"antiTamper",lazy:!0,render:()=>r(()=>import("./index463.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{label:"网站安全",lazy:!0,name:"siteSecurity",render:()=>r(()=>import("./index464.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},

    Css隐藏:

    主要路径为/www/server/panel/BTPanel/static/css/style.css 一下更改需要在此文件内进行调整,如需更改其他部分会另作说明

    去除顶部的企业版tag

    image.png

    .icon-end-time-free[data-v-402b09ab]{ 后面添加 display:none;

    软件商店的推广 banner

    image.png

    .recom-view[data-v-81e888c5]{ 后面添加 display:none

    去除底部的vip推广

    image.png

    找到如下路径的/www/server/panel/BTPanel/static/css里面的style.css搜索advantage-view吧这里面的display:flex改成display:none

    去除网站里面的 waf 图标

    image (1).png

    .svgtofont-left-waf:before{content:""} 替换成 .svgtofont-left-waf:before{dispaly:none;content:""}

    ]]>
    0 https://blog.iletter.top/archives/516/#comments https://blog.iletter.top/feed/author/1/
    笔记本断电后自动关机python命令 https://blog.iletter.top/archives/503/ https://blog.iletter.top/archives/503/ Tue, 16 Dec 2025 10:46:00 +0800 DelLevin 自己的笔记本被自己改成了win server服务器,外加来电自启+小爱同学控制开关机,可以说很好了,但是笔记本却没有断电自动关机这个东西,原本想把电池扣了,换上usp的,但是有一点成本在的,果断放弃。

    后来更改电源计划,99%的时候进行关机,但是盖上盖子,断开远程的时候,睡眠状态了就,不会进行关机操作。索性写了这个python代码

    import sys
    import win32api
    import win32gui
    import win32con
    import pythoncom
    import psutil
    import threading
    import time
    import subprocess
    
    SHUTDOWN_DELAY_SECONDS = 60
    
    class PowerListenerWindow:
        def __init__(self):
            self.is_plugged_in = True # 初始假设为连接电源
            self.shutdown_timer = None
            self.last_unplugged_time = None
    
            wc = win32gui.WNDCLASS()
            wc.lpfnWndProc = self.wnd_proc
            wc.lpszClassName = 'MyPowerListenerClass'
            wc.hInstance = win32api.GetModuleHandle(None)
            class_atom = win32gui.RegisterClass(wc)
    
            # Create a hidden window
            self.hwnd = win32gui.CreateWindow(
                class_atom,
                'PowerListener',
                0, 0, 0, 0, 0,
                0, 0, wc.hInstance, None
            )
    
        def wnd_proc(self, hwnd, msg, wparam, lparam):
            if msg == win32con.WM_POWERBROADCAST:
                if wparam == win32con.PBT_APMPOWERSTATUSCHANGE:
                    # print("[WM_POWERBROADCAST] 电源状态可能已更改 (PBT_APMPOWERSTATUSCHANGE)") # 简化日志
                    self.check_and_print_status() # 调用更新后的检查函数
    
                elif wparam == win32con.PBT_ACPIRESUMEAUTOMATIC or wparam == win32con.PBT_ACPIRESUMESUSPEND:
                    # print(f"[WM_POWERBROADCAST] 系统从睡眠/休眠恢复 (wParam={wparam})") # 简化日志
                    pass # 可根据需要添加恢复逻辑
    
                elif wparam == win32con.PBT_APMSUSPEND:
                    # print("[WM_POWERBROADCAST] 系统即将进入睡眠/休眠 (PBT_APMSUSPEND)") # 简化日志
                    pass # 可根据需要添加休眠前逻辑
    
            return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
    
        def cancel_pending_shutdown(self):
            """取消任何待定的关机操作"""
            if self.shutdown_timer and self.shutdown_timer.is_alive():
                 self.shutdown_timer.cancel()
                 self.shutdown_timer = None
    
        def schedule_shutdown(self):
            """在指定延迟后执行关机"""
            print(f"警告:设备未充电,将在 {SHUTDOWN_DELAY_SECONDS} 秒后关机!")
            self.execute_shutdown()
    
        def execute_shutdown(self):
            """实际执行关机操作"""
            # 再次确认是否仍然未充电,避免在检查间隙插上了电源
            try:
                battery_check = psutil.sensors_battery()
                if battery_check and not battery_check.power_plugged:
                     print("--- 执行关机 ---")
                     # 使用 subprocess 调用 Windows 关机命令
                     # /s 关机, /t 5 延迟5秒, /c 添加消息
                     subprocess.run(["shutdown", "/s", "/t", "5", "/c", "Battery low and not charging. Shutting down in 5 seconds..."], check=True)
                     # 等待一下,让关机命令生效
                     time.sleep(10)
                     sys.exit(0) # 正常退出监听器
                else:
                     print("--- 电源状态已恢复,取消关机 ---")
            except psutil.Error as e:
                 print(f"查询电源状态失败: {e}")
                 # 查询失败,出于安全考虑,可以选择不关机或记录日志
            except subprocess.CalledProcessError as e:
                 print(f"执行关机命令失败: {e}")
            except Exception as e:
                 print(f"执行关机时发生未知错误: {e}")
    
    
        def check_and_print_status(self):
            """Helper function to query and print current status and manage shutdown timer"""
            try:
                battery = psutil.sensors_battery()
                was_plugged_in = self.is_plugged_in # 记录之前的状态
                if battery:
                    self.is_plugged_in = battery.power_plugged
                    # 简化状态打印,仅在状态变化时提示
                    # plugged_status_str = "已充电/接入电源" if self.is_plugged_in else "未在充电"
                    # print(f"当前电源状态: {plugged_status_str}, 电量: {battery.percent}%")
    
                    if not self.is_plugged_in:
                        # 检测到未充电
                        if was_plugged_in or self.shutdown_timer is None:
                            # 如果之前是充电的,或者是第一次检测到未充电且无定时器
                            print(f"提示:笔记本电脑当前未在充电! 电量: {battery.percent}%. 将在 {SHUTDOWN_DELAY_SECONDS} 秒后关机.")
                            self.cancel_pending_shutdown() # 先取消旧的(理论上不应该有)
                            # 启动新的 60 秒关机定时器
                            self.shutdown_timer = threading.Timer(SHUTDOWN_DELAY_SECONDS, self.schedule_shutdown)
                            self.shutdown_timer.start()
                        # else: 已经在倒计时中,无需重复启动
    
                    else:
                        # 检测到已充电
                        if not was_plugged_in: # 如果之前是未充电的
                             print("提示:电源已连接,取消关机计划。")
                        # 取消任何待定的关机
                        self.cancel_pending_shutdown()
    
                else:
                    # print("无法获取电池信息,可能不是笔记本电脑或传感器不可用。") # 简化日志
                    self.is_plugged_in = True # 默认为连接(安全起见)
                    self.cancel_pending_shutdown() # 取消关机
    
            except Exception as e:
                print(f"查询电源状态时出错: {e}")
                # 出错时也应取消关机以防万一
                self.cancel_pending_shutdown()
    
    
        def start_message_loop(self):
            print("Windows 电源监听器已启动...")
            print("请插拔电源测试功能。按 Ctrl+C 退出。")
            # 初始检查一次状态
            self.check_and_print_status()
            try:
                while True:
                    pythoncom.PumpWaitingMessages()
                    win32api.Sleep(5000) # 每5秒处理一次消息队列
    
            except KeyboardInterrupt:
                print("\n收到退出指令,正在关闭...")
            finally:
                self.cancel_pending_shutdown() # 确保退出时取消定时器
                win32gui.DestroyWindow(self.hwnd)
                print("监听器已关闭。")
    
    # 编译
    # pyinstaller --noconfirm --onefile --hidden-import=win32timezone powerOffShutDown.py
    if __name__ == "__main__":
        listener = PowerListenerWindow()
        listener.start_message_loop()
    
    ]]>
    0 https://blog.iletter.top/archives/503/#comments https://blog.iletter.top/feed/author/1/
    将bat脚本设置成windows服务 https://blog.iletter.top/archives/502/ https://blog.iletter.top/archives/502/ Tue, 02 Dec 2025 13:46:29 +0800 DelLevin 步骤 1: 下载 NSSM

    访问 NSSM 官方网站:http://nssm.cc/download
    下载适用于你系统架构(通常是 64-bit x64)的最新版本。
    解压下载的 ZIP 文件。你会得到一个包含 nssm.exe 的文件夹(例如 win64 文件夹里有 nssm.exe)。

    步骤 2: 将 NSSM 添加到系统 PATH

    为了在任何地方都能使用 nssm 命令,建议将其路径添加到系统的环境变量 PATH 中。

    打开“控制面板” -> “系统和安全” -> “系统” -> “高级系统设置”。点击“环境变量”。在“系统变量”或“用户变量”中找到 Path,选中它并点击“编辑”。点击“新建”,然后粘贴你解压出来的 nssm.exe 所在的完整目录路径(例如 D:\tools\nssm-2.24\win64)。

    请务必将路径修改为你实际解压的路径。点击“确定”保存所有更改。关闭并重新打开命令提示符窗口,以使 PATH 变更生效。

    步骤 3: 使用 NSSM 创建服务

    以管理员身份 打开命令提示符 (CMD) 或 PowerShell。
    输入以下命令来启动 NSSM 的图形安装界面:

    nssm install frp_client_service

    (frp_client_service 是你将要创建的服务名称,你可以根据需要修改,但不能包含空格)。

    在弹出的 NSSM 配置窗口中:

    Path: 浏览并选择你的 start.bat 文件路径:D:\appStable\frp-client\start.bat。

    Startup directory: 自动填充为 .bat 文件所在的目录,即 D:\appStable\frp-client。请确认此目录正确。这是程序运行时的工作目录。

    Arguments: 如果你的 start.bat 脚本需要额外的命令行参数,可以在这里填写。通常 .bat 文件不需要在此处添加参数。

    其他选项卡(如 Details, Log on, Dependencies, Process, Shutdown, Exit actions, I/O Priority)可以根据需要进行配置,但对于大多数情况,默认设置即可。

    Details: 可以给服务起个易读的显示名称(Display name),比如 "FRP Client",以及描述(Description)。
    Log on: 默认是使用本地系统账户,通常足够了。

    I/O Priority: 如果担心性能,可以将优先级设为 Normal。
    确认所有信息无误后,点击 Install service 按钮。

    步骤 4: 启动并测试服务

    可以通过 NSSM GUI 来管理服务:

    nssm edit frp_client_service  # 编辑服务
    nssm start frp_client_service # 启动服务
    nssm stop frp_client_service  # 停止服务
    nssm remove frp_client_service # 删除服务

    或者使用 Windows 内置的 服务管理器:

    按 Win + R 键,输入 services.msc 并回车。

    在服务列表中找到你刚刚创建的服务(名称是你在 NSSM 中指定的 Display name 或服务名 frp_client_service)。

    右键单击该服务,选择“启动”。

    检查状态是否变为“正在运行”。

    步骤 5: 设置开机自启

    在 Windows 的 服务管理器 (services.msc) 中,找到你的 frp_client_service 服务。

    右键单击该服务,选择“属性”。

    在“常规”选项卡下,将“启动类型”设置为 自动。

    点击“应用”和“确定”。

    现在,这个 FRP 客户端就会作为 Windows 服务运行,并且在系统开机时自动启动了。

    ]]>
    0 https://blog.iletter.top/archives/502/#comments https://blog.iletter.top/feed/author/1/
    pycharm远程开发 https://blog.iletter.top/archives/501/ https://blog.iletter.top/archives/501/ Thu, 06 Nov 2025 22:18:00 +0800 DelLevin 首先创建新的ssh项目

    2025-11-06T14:03:42.png

    填写相关参数

    2025-11-06T14:04:29.png

    这里需要上传linux的安装包,因为下载的话一直失败无法下载成功,我们选择上传和上传路径
    2025-11-06T14:05:26.png

    pycharm地址:https://www.jetbrains.com/zh-cn/pycharm/download/other.html

    破解文件下载地址:ja-netfilter-2025.3.0.zip

    弄完之后,会让你填写远程pycharm的验证,在这之前退出一下我们需要填写编辑一下文件

    vim pycharm64.vmoptions

    里面填写关于破解文件的相关信息

    -Xms256m
    -Xmx2048m
    -XX:ReservedCodeCacheSize=512m
    -XX:+UseG1GC
    -XX:SoftRefLRUPolicyMSPerMB=50
    -XX:CICompilerCount=2
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:-OmitStackTraceInFastThrow
    -XX:+IgnoreUnrecognizedVMOptions
    -XX:CompileCommand=exclude,com/intellij/openapi/vfs/impl/FilePartNodeRoot,trieDescend
    -ea
    -Dsun.io.useCanonCaches=false
    -Dsun.java2d.metal=true
    -Djbr.catch.SIGABRT=true
    -Djdk.http.auth.tunneling.disabledSchemes=""
    -Djdk.attach.allowAttachSelf=true
    -Djdk.module.illegalAccess.silent=true
    -Dkotlinx.coroutines.debug=off
    -Dide.show.tips.on.startup.default.value=false
    -Dsun.tools.attach.tmp.only=true
    -Dawt.lock.fair=true
    -javaagent:/root/ja-netfilter/ja-netfilter.jar
    --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
    --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
    

    之后再次打开pycharm远程,填写激活码

    6ZLWI4KV9Y-eyJsaWNlbnNlSWQiOiI2WkxXSTRLVjlZIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvwrdjb20iLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSU0MiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSRCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTRiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNWIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQU0kiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUENXTVAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiQUlMIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUyIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiRFAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUERCIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9XSwibWV0YWRhdGEiOiIwNDIwMjUxMDI0UFBBTTAwMDAwNUEwMDAwMDBYQyIsImhhc2giOiI3NTkxODgyNy8wOjEzODU1MTE2NSIsImdyYWNlUGVyaW9kRGF5cyI6NywiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJ0cmlhbCI6ZmFsc2UsImFpQWxsb3dlZCI6dHJ1ZX0=-jEJB+XsDL603fDEvkpWiZmuv+g4j7nLQ2jwzghoDP8KuxfCXLPG6LFK4C00mUzUX23i+T9XB9hAp83icdF+YuVESTTbPPxLQVCzk2uIskO8s/g4BZacTQD5IsHVDjRmv5HWtuakqNVUzbatF+yc0ut58PfrPsnKMrp1yFBQEvw3Ch1gghbm85UsTQ4zW2C05QSQDrLSlQB4M/cZ6OTI22NtPSrfJxyfdUhVEnQQqO6uQqrqa7CX8ZuC+ZKsap4tnaXmHG4hfUlZdO7PTlZfV20n9mtJxZSftqZUgeJzreporG7C2bX1mIDlkAECzkMU5gmJzlUQ6499xz2O2Upx7Wg==-MIIETDCCAjSgAwIBAgIBETANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTI0MDkyMDEyMTEyN1oXDTI2MDkyMjEyMTEyN1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyNDA5MjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7SH/XcUoMwkDi8JJPzXWWHWFdOZdrP2Dqkz2W8iUi650cwz2vdPEd0tMzosLAj7ifkFEHUyiuEcL//q9d9Op7ZsV23lpPXX8tFMLFwugoQ9D8jDLT/XP9pp/YukWkKF5jpNbaCvsVQkDdYkArBkYvhH3aN4v9BkEsXahfgLLOPe4IG2FDJNf9R4to9V1vt+m2UVJB0zV4a/sVMKUZLgqKmKKKOKoLrE3OjBlZlb+Q0z2N5dsW0hDEVRFGmBUAbHN/mp44MMMvEIFKfoLIGpgic92P2O6uFh75PI7mcultL6yuR48ajErx8CjjQEGOSnoq/8hD+yVE+6GW2gJa2CPvAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUb5NERj05GyNerQ/Mjm9XH8HXtLIwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBALq6VfVUjmPI3N/w0RYoPGFYUieCfRO0zVvD1VYHDWsN3F9buVsdudhxEsUb8t7qZPkDKTOB6DB+apgt2ZdKwok8S0pwifwLfjHAhO3b+LUQaz/VmKQW8gTOS5kTVcpM0BY7UPF8cRBqxMsdUfm5ejYk93lBRPBAqntznDY+DNc9aXOldFiACyutB1/AIh7ikUYPbpEIPZirPdAahroVvfp2tr4BHgCrk9z0dVi0tk8AHE5t7Vk4OOaQRJzy3lST4Vv6Mc0+0z8lNa+Sc3SVL8CrRtnTAs7YpD4fpI5AFDtchNrgFalX+BZ9GLu4FDsshVI4neqV5Jd5zwWPnwRuKLxsCO/PB6wiBKzdapQBG+P9z74dQ0junol+tqxd7vUV/MFsR3VwVMTndyapIS+fMoe+ZR5g+y44R8C7fXyVE/geg+JXQKvRwS0C5UpnS5FcGk+61b0e4U7pwO20RlwhEFHLSaP61p2TaVGo/TQtT/fWmrtV+HegAv9P3X3Se+xIVtJzQsk8QrB/w52IB3FKiAKl/KRn1egbMIs4uoNAkqNZ9Ih2P1NpiQnONFmkiAgeynJ+0FPykKdJQbV3Mx44jkaHIif4aFReTsYX1WUBNu/QerZRjn4FVSHRaZPSR5Oi82Wz0Nj7IY9ocTpLnXFrqkb/Kt3S6B9s2Kol3Lr1ElYA

    这一步可能会提示

    This license xxxx has been suspended

    可以设置一下代理就可以了

    2025-11-06T14:15:15.png

    ]]>
    0 https://blog.iletter.top/archives/501/#comments https://blog.iletter.top/feed/author/1/
    1+ACE2系统优化笔记 https://blog.iletter.top/archives/495/ https://blog.iletter.top/archives/495/ Sat, 01 Nov 2025 21:01:00 +0800 DelLevin 记录一下系统的优化记录系统版本C13.1 (cn01)版本。机型1+ace2

    系统版本:

    系统版本.jpg

    冻结的应用:

    禁用服务.jpg

    其中,发现我的system_server里面一直高负载,时不时跳到150%以上。于是采用adb抓包形式。

    抓包命令

    .\adb logcat -v time > D:\UserData\Desktop\logcat.log

    第一次日志抓取

    11-01 18:31:44.931 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
    11-01 18:31:44.931 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
    11-01 18:31:44.932 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
    11-01 18:31:44.933 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
    11-01 18:31:44.934 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
    11-01 18:31:44.935 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
    11-01 18:31:44.936 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
    11-01 18:31:44.937 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
    11-01 18:31:44.938 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
    11-01 18:31:44.938 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
    11-01 18:31:44.939 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
    11-01 18:31:44.939 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 

    这里疯狂唤醒com.oplus.onet 服务,同时com.oplus.virtualcomm,这个虚拟通信也疯狂调用。于是只好解冻这net服务。

    第二次抓包

    11-01 18:48:53.927 E/AdbDebuggingManager( 3189): Caught an exception opening the socket: java.io.IOException: No such file or directory
    11-01 18:48:53.956 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.958 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.962 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.962 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.963 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.963 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.964 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.964 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.965 W/ActivityManager( 3189): Receiver with filter android.content.IntentFilter@56b32fa already registered for pid 16357, callerPackage is com.oplus.onet
    11-01 18:48:53.965 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
    11-01 18:48:53.966 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
    11-01 18:48:53.966 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found

    这里疯狂唤醒com.heytap.accessory,于是把这个解冻了。

    第三次抓包

    发现一直在唤醒com.nearme.statistics.rom这个玩意,但是频次不是很高。搜索发现这是哪个用户体验计划,索性就不管了。

    同时在阅读了https://www.coolapk.com/feed/66547164这个大佬的文章之后。也是选择性的禁用软件。删除了olc和反馈工具箱这俩应用。

    其实从18年入手的第一台小米8开始,就开始了我的root之路。到现在已经七年了。也从小米换到了一加。从一个无脑安装模块的脚本小子,到了开始解读源码写程序的程序员。自己蜕变了好多,心态也老了好多。沉下心来做事,安安静静的学习!

    加油吧!

    ]]>
    0 https://blog.iletter.top/archives/495/#comments https://blog.iletter.top/feed/author/1/
    typecho添加附件功能如果是图片就可以预览 https://blog.iletter.top/archives/492/ https://blog.iletter.top/archives/492/ Tue, 28 Oct 2025 19:29:00 +0800 DelLevin 定位文件file-upload.phpfile-upload-js.php。修改之前记得备份文件。更改了一下排序顺序,刚上传的放在最前面。如果是图片就可以简单预览缩略图。

    微信图片_20251028192723_266_15.png

    更改file-upload.php

    <?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
    
    <?php
    if (isset($post) || isset($page)) {
        $cid = isset($post) ? $post->cid : $page->cid;
    
        if ($cid) {
            \Widget\Contents\Attachment\Related::alloc(['parentId' => $cid])->to($attachment);
        } else {
            \Widget\Contents\Attachment\Unattached::alloc()->to($attachment);
        }
    }
    ?>
    
    <div id="upload-panel" class="p">
        <div class="upload-area" draggable="true"><?php _e('拖放文件到这里<br>或者 %s选择文件上传%s', '<a href="###" class="upload-file">', '</a>'); ?></div>
        <ul id="file-list">
        <?php while ($attachment->next()): ?>
            <li data-cid="<?php $attachment->cid(); ?>" data-url="<?php echo $attachment->attachment->url; ?>" data-image="<?php echo $attachment->attachment->isImage ? 1 : 0; ?>">
                <input type="hidden" name="attachment[]" value="<?php $attachment->cid(); ?>" />
                <a class="insert" title="<?php _e('点击插入文件'); ?>" href="###"><?php $attachment->title(); ?></a>
                <div class="info">
                    <?php echo number_format(ceil($attachment->attachment->size / 1024)); ?> Kb
                    <a class="file" target="_blank" href="<?php $options->adminUrl('media.php?cid=' . $attachment->cid); ?>" title="<?php _e('编辑'); ?>"><i class="i-edit"></i>编辑</a>
                    <a href="###" class="delete" title="<?php _e('删除'); ?>"><i class="i-delete"></i>删除</a>
                </div>
                <?php if ($attachment->attachment->isImage): ?>
                    <div class="image-preview">
                        <img src="<?php echo $attachment->attachment->url; ?>" alt="<?php $attachment->title(); ?>" />
                    </div>
                <?php endif; ?>
            </li>
        <?php endwhile; ?>
        </ul>
    </div>
    
    <style>
    /* 为包含图片的列表项设置基础样式 */
    #file-list li {
        margin-bottom: 10px; /* 列表项之间的间距 */
        padding: 8px; /* 内边距 */
        border: 1px solid #eee; /* 边框 */
        border-radius: 4px; /* 圆角 */
        background-color: #fafafa; /* 背景色 */
        list-style: none; /* 去除默认列表符号 */
    }
    
    /* 标题样式 */
    #file-list li .insert {
        display: block; /* 使其独占一行 */
        font-weight: bold; /* 标题加粗 */
        margin-bottom: 4px; /* 与下方 .info 的间距 */
        color: #333; /* 标题颜色 */
        text-decoration: none; /* 去除下划线 */
    }
    
    #file-list li .insert:hover {
        text-decoration: underline; /* 悬停时添加下划线 */
    }
    
    /* 信息栏样式 */
    #file-list li .info {
        font-size: 0.9em; /* 信息栏字体稍小 */
        color: #666; /* 信息栏颜色 */
        margin-bottom: 8px; /* 与下方图片的间距 */
        line-height: 1.4; /* 行高 */
    }
    
    /* 信息栏内的链接和图标 */
    #file-list li .info a {
        margin-right: 8px; /* 链接之间的间距 */
        color: #999; /* 图标颜色 */
        text-decoration: none;
    }
    
    #file-list li .info a:hover {
        color: #007cba; /* 悬停时的颜色 */
    }
    
    /* 图片预览容器 */
    .image-preview {
        text-align: center; /* 图片居中 */
        margin-top: 5px; /* 与上方 .info 的间距 */
        clear: both; /* 清除浮动(如果有的话) */
    }
    
    /* 图片样式 */
    .image-preview img {
        max-width: 150px; /* 设置最大宽度 */
        max-height: 150px; /* 设置最大高度 */
        height: auto; /* 保持宽高比 */
        border: 1px solid #ddd; /* 图片边框 */
        border-radius: 4px; /* 图片圆角 */
        padding: 2px; /* 图片内边距 */
        background-color: #fff; /* 图片背景色,防止透明图有背景色干扰 */
        box-shadow: 0 1px 3px rgba(0,0,0,0.1); /* 添加轻微阴影 */
    }
    
    /* 加载状态样式 */
    #file-list li.loading {
        color: #999;
        font-style: italic;
    }
    
    /* 删除按钮悬停效果 */
    #file-list li a.delete:hover {
        color: #e74c3c !important; /* 删除按钮悬停时变为红色 */
    }
    
    /* 编辑按钮悬停效果 */
    #file-list li a.file:hover {
        color: #3498db !important; /* 编辑按钮悬停时变为蓝色 */
    }
    </style>

    更改file-upload-js.php

    <?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
    <?php
    if (isset($post) && $post instanceof \Typecho\Widget && $post->have()) {
        $fileParentContent = $post;
    } elseif (isset($page) && $page instanceof \Typecho\Widget && $page->have()) {
        $fileParentContent = $page;
    }
    
    $phpMaxFilesize = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0;
    
    if (preg_match("/^([0-9]+)([a-z]{1,2})$/i", $phpMaxFilesize, $matches)) {
        $phpMaxFilesize = strtolower($matches[1] . $matches[2] . (1 == strlen($matches[2]) ? 'b' : ''));
    }
    ?>
    
    <script src="<?php $options->adminStaticUrl('js', 'moxie.js'); ?>"></script>
    <script src="<?php $options->adminStaticUrl('js', 'plupload.js'); ?>"></script>
    <script>
    $(document).ready(function() {
        function updateAttacmentNumber () {
            var btn = $('#tab-files-btn'),
                balloon = $('.balloon', btn),
                count = $('#file-list li .insert').length;
    
            if (count > 0) {
                if (!balloon.length) {
                    btn.html($.trim(btn.html()) + ' ');
                    balloon = $('<span class="balloon"></span>').appendTo(btn);
                }
    
                balloon.html(count);
            } else if (0 == count && balloon.length > 0) {
                balloon.remove();
            }
        }
    
        $('.upload-area').bind({
            dragenter   :   function () {
                $(this).parent().addClass('drag');
            },
    
            dragover    :   function (e) {
                $(this).parent().addClass('drag');
            },
    
            drop        :   function () {
                $(this).parent().removeClass('drag');
            },
            
            dragend     :   function () {
                $(this).parent().removeClass('drag');
            },
    
            dragleave   :   function () {
                $(this).parent().removeClass('drag');
            }
        });
    
        updateAttacmentNumber();
    
        function fileUploadStart (file) {
            $('<li id="' + file.id + '" class="loading">'
                + file.name + '</li>').appendTo('#file-list');
        }
    
        function fileUploadError (error) {
            var file = error.file, code = error.code, word; 
            
            switch (code) {
                case plupload.FILE_SIZE_ERROR:
                    word = '<?php _e('文件大小超过限制'); ?>';
                    break;
                case plupload.FILE_EXTENSION_ERROR:
                    word = '<?php _e('文件扩展名不被支持'); ?>';
                    break;
                case plupload.FILE_DUPLICATE_ERROR:
                    word = '<?php _e('文件已经上传过'); ?>';
                    break;
                case plupload.HTTP_ERROR:
                default:
                    word = '<?php _e('上传出现错误'); ?>';
                    break;
            }
    
            var fileError = '<?php _e('%s 上传失败'); ?>'.replace('%s', file.name),
                li, exist = $('#' + file.id);
    
            if (exist.length > 0) {
                li = exist.removeClass('loading').html(fileError);
            } else {
                li = $('<li>' + fileError + '<br />' + word + '</li>').appendTo('#file-list');
            }
    
            li.effect('highlight', {color : '#FBC2C4'}, 2000, function () {
                $(this).remove();
            });
    
            // fix issue #341
            this.removeFile(file);
        }
    
        var completeFile = null;
        function fileUploadComplete (id, url, data) {
            // 根据是否为图片来构建列表项内容
            var itemContent = '<input type="hidden" name="attachment[]" value="' + data.cid + '" />';
        
            // 添加标题和信息
            itemContent += '<a class="insert" target="_blank" href="###" title="<?php _e('点击插入文件'); ?>">' + data.title + '</a>'
                         + '<div class="info">' + data.bytes
                         + ' <a class="file" target="_blank" href="<?php $options->adminUrl('media.php'); ?>?cid=' 
                         + data.cid + '" title="<?php _e('编辑'); ?>"><i class="i-edit"></i>编辑</a>'
                         + ' <a class="delete" href="###" title="<?php _e('删除'); ?>"><i class="i-delete"></i>删除</a></div>';
        
            // 如果是图片,添加预览图 (注意:这里图片放在 .info 之后,与PHP模板保持一致)
            if (data.isImage) {
                itemContent += '<div class="image-preview"><img src="' + data.url + '" alt="' + data.title + '" /></div>';
            }
        
            // 创建 jQuery 对象 li
            var li = $('#' + id).removeClass('loading').data('cid', data.cid)
                .data('url', data.url)
                .data('image', data.isImage)
                .html(itemContent); // 先设置内容
        
            // 关键修改:将新 li 插入到 #file-list 的最前面,而不是留在原地或追加到末尾
            // 1. 先从当前位置移除(如果它在列表中的话,虽然通常在上传开始时是添加到列表末尾的空li)
            // 2. 然后插入到 #file-list 的开头
            li.prependTo('#file-list'); // prependTo 将元素插入到目标元素的开头
        
            // 绑定事件
            attachInsertEvent(li);
            attachDeleteEvent(li);
            updateAttacmentNumber();
        
            if (!completeFile) {
                completeFile = data;
            }
        }
    
        var uploader = null, tabFilesEl = $('#tab-files').bind('init', function () {
            uploader = new plupload.Uploader({
                browse_button   :   $('.upload-file').get(0),
                url             :   '<?php $security->index('/action/upload'
                    . (isset($fileParentContent) ? '?cid=' . $fileParentContent->cid : '')); ?>',
                runtimes        :   'html5,flash,html4',
                flash_swf_url   :   '<?php $options->adminStaticUrl('js', 'Moxie.swf'); ?>',
                drop_element    :   $('.upload-area').get(0),
                filters         :   {
                    max_file_size       :   '<?php echo $phpMaxFilesize ?>',
                    mime_types          :   [{'title' : '<?php _e('允许上传的文件'); ?>', 'extensions' : '<?php echo implode(',', $options->allowedAttachmentTypes); ?>'}],
                    prevent_duplicates  :   true
                },
    
                init            :   {
                    FilesAdded      :   function (up, files) {
                        for (var i = 0; i < files.length; i ++) {
                            fileUploadStart(files[i]);
                        }
    
                        completeFile = null;
                        uploader.start();
                    },
    
                    UploadComplete  :   function () {
                        if (completeFile) {
                            Typecho.uploadComplete(completeFile);
                        }
                    },
    
                    FileUploaded    :   function (up, file, result) {
                        if (200 == result.status) {
                            var data = $.parseJSON(result.response);
    
                            if (data) {
                                fileUploadComplete(file.id, data[0], data[1]);
                                uploader.removeFile(file);
                                return;
                            }
                        }
    
                        fileUploadError.call(uploader, {
                            code : plupload.HTTP_ERROR,
                            file : file
                        });
                    },
    
                    Error           :   function (up, error) {
                        fileUploadError.call(uploader, error);
                    }
                }
            });
    
            uploader.init();
        });
    
        Typecho.uploadFile = function (file, name) {
            if (!uploader) {
                $('#tab-files-btn').parent().trigger('click');
            }
            
            var timer = setInterval(function () {
                if (!uploader) {
                    return;
                }
    
                clearInterval(timer);
                timer = null;
    
                uploader.addFile(file, name);
            }, 50);
        };
    
        // function attachInsertEvent (el) {
        //     $('.insert', el).click(function () {
        //         var t = $(this), p = t.parents('li');
        //         Typecho.insertFileToEditor(t.text(), p.data('url'), p.data('image'));
        //         return false;
        //     });
        // }
        // 修改 attachInsertEvent 函数,使其能处理标题链接和图片
        function attachInsertEvent (el) {
            // 为标题链接和图片(或其父容器 .image-preview)绑定点击事件
            $('.insert, .image-preview img', el).click(function (e) {
                // 防止事件冒泡到父级 <a> 标签(如果图片被另一个链接包裹的话)
                e.stopPropagation();
                
                var t = $(this);
                // 查找当前点击元素的父级 <li>,然后从中获取数据
                var p = t.closest('li'); // 使用 closest 更可靠,可以找到最近的祖先 <li>
        
                // 确保找到了包含数据的 <li> 元素
                if (p.length > 0) {
                    // 从 <li> 元素获取数据
                    var url = p.data('url');
                    var isImage = p.data('image');
                    var title = p.find('.insert').first().text(); // 获取标题文本
        
                    // 调用 Typecho 提供的插入函数
                    Typecho.insertFileToEditor(title, url, isImage);
                }
                
                return false; // 阻止默认链接行为
            });
        }
    
        function attachDeleteEvent (el) {
            var file = $('a.insert', el).text();
            $('.delete', el).click(function () {
                if (confirm('<?php _e('确认要删除文件 %s 吗?'); ?>'.replace('%s', file))) {
                    var cid = $(this).parents('li').data('cid');
                    $.post('<?php $security->index('/action/contents-attachment-edit'); ?>',
                        {'do' : 'delete', 'cid' : cid},
                        function () {
                            $(el).fadeOut(function () {
                                $(this).remove();
                                updateAttacmentNumber();
                            });
                        });
                }
    
                return false;
            });
        }
    
        $('#file-list li').each(function () {
            attachInsertEvent(this);
            attachDeleteEvent(this);
        });
    });
    </script>
    
    
    
    ]]>
    0 https://blog.iletter.top/archives/492/#comments https://blog.iletter.top/feed/author/1/
    服务器状态监控开发(设计+初步规划) https://blog.iletter.top/archives/472/ https://blog.iletter.top/archives/472/ Mon, 27 Oct 2025 16:19:00 +0800 DelLevin 已废弃,发现了更好的项目Beszel

    项目说明

    简述

    用于监控服务器状态。

    python客户端用于服务器状态上报,上报到admin里面的接口,通过token进行设备识别。

    目前仅实现了windows的系统上报

    实现方式:

    部署方式

    • 需安装lombok插件,不然会提示找不到entity的get set方法
    • 创建数据库mydatabase,数据库编码为UTF-8
    • 执行db/mydatabase.sql文件,初始化数据
    • 修改application-dev.yml文件,更新MySQL账号和密码
    • IDEA运行AdminApplication.java,则可启动项目【admin】
    • vscode运行前端项目npm install安装依赖
    • vscode运行前端项目npm run dev 运行项目
    • 前端访问路径:http://localhost:8001/
    • admin接口文档路径:http://localhost:8080/admin/doc.html
    • 账号密码:admin 密码应该是123456或者admin我也忘记了

    设计规划

    双端

    admin为服务端后台为java编写作为后台接口信息,sys_monitor_FrontEnd为服务器端前台项目

    client客户端为python编写,实时上报客户端状态

    功能规划

    • client作为数据主动推送,每隔2s(自定义时间)进行信息状态推送。api传输地址标识比如 传入服务器名称和识别token。
    • 在线ssh功能/在线终端
    • frp穿透功能
    • 允许远程执行客户端脚本
    • 点击服务器查看服务器详情信息,即查看该服务器的当前心跳信息及其基本信息
    • admin后端日志筛选方式:昨天/今天/最近七天/自定义事件

    服务器资源压力指数计算

    RPI = w_cpu × (CPU_usage / CPU_max) + w_mem × (Mem_usage / Mem_total) + N(w_disk x (Disk_usage / Disk_total))
    • CPU_usage:当前 CPU 使用率(例如 45 表示 45%)
    • CPU_max:通常为 100 × 核心数(但更推荐使用 整体使用率百分比,即 0~100% 范围,避免多核复杂化)
    • Mem_usage:已用内存(单位 MB 或 GB)
    • Mem_total:总物理内存
    • N代表有几块磁盘,根据实际情况进行计算
    • Disk_usage:已用磁盘空间(单位 MB 或 GB)
    • Disk_total:总磁盘空间
    • w_cpuw_memw_disk :权重,满足 w_cpu + w_mem + w_disk = 1

    未涉及到使用swap和使用率超90%的阈值惩罚的功能。

    客户端上报监控端心跳数据格式(windows)

    {
        'clientName': 'windows11',
        'clientToken': 'windows11-dellevin-19990902',
        'timestamp': 1761876974.3407657,
        'data': {
            'sysBaseInfo': {
                'system': {
                    'osType': 'Windows',
                    'rawOsName': 'Windows-11-10.0.26100-SP0',
                    'osVersion': '10.0.26100',
                    'osArch': 'AMD64',
                    'systemRuntime': 7957,
                    'osStartTime': '2025-10-31 08:03:37',
                    'systemLanguage': 'zh-CN',
                    'systemCountry': 'CN'
                },
                'cpu': {
                    'cpu_name': 'AMD Ryzen 5 7500F 6-Core Processor',
                    'logical_cores': 12,
                    'physical_cores': 6,
                    'cpu_max_clock_mhz': 3701,
                    'cpu_usage_percent': 0.0,
                    'process_count': 202,
                    'thread_count': 3338,
                    'system_uptime_seconds': 7959
                },
                'gpu': [
                    {
                    'name': 'Microsoft Remote Display Adapter',
                    'vendor': 'Unknown',
                    'driver_version': '10.0.26100.6725',
                    'total_memory_bytes': 0
                }, {
                    'name': 'NVIDIA GeForce RTX 4070',
                    'vendor': 'NVIDIA',
                    'driver_version': '32.0.15.7680',
                    'total_memory_bytes': 0
                }],
                'network': [
                    {
                    'interface_name': '以太网',
                    'mac_address': '04-7C-16-C8-78-E3',
                    'ip_address': '192.168.31.48',
                    'bytes_sent': 165698545,
                    'bytes_recv': 581040639,
                    'is_up': True
                }, {
                    'interface_name': 'VMware Network Adapter VMnet1',
                    'mac_address': '00-50-56-C0-00-01',
                    'ip_address': '192.168.184.1',
                    'bytes_sent': 2554,
                    'bytes_recv': 18,
                    'is_up': True
                }, {
                    'interface_name': 'VMware Network Adapter VMnet8',
                    'mac_address': '00-50-56-C0-00-08',
                    'ip_address': '10.0.0.2',
                    'bytes_sent': 4990,
                    'bytes_recv': 0,
                    'is_up': True
                }, {
                    'interface_name': 'ZeroTier One [af78bf9436e11b49]',
                    'mac_address': '4A-98-68-C5-57-04',
                    'ip_address': '192.168.196.81',
                    'bytes_sent': 318241,
                    'bytes_recv': 61915,
                    'is_up': True
                }, {
                    'interface_name': 'HOME-4070',
                    'mac_address': '',
                    'ip_address': '10.8.0.3',
                    'bytes_sent': 143426176,
                    'bytes_recv': 14426536,
                    'is_up': True
                }],
                'memory': {
                    'total_bytes': 34090856448,
                    'used_bytes': 11354742784,
                    'free_bytes': 22736113664,
                    'memory_percent': 33.3
                },
                'disk': [
                    {
                    'drive_letter': 'C:',
                    'total_bytes': 182131965952,
                    'used_bytes': 165342781440,
                    'free_bytes': 16789184512
                }, {
                    'drive_letter': 'D:',
                    'total_bytes': 841953484800,
                    'used_bytes': 536226193408,
                    'free_bytes': 305727291392
                }]
            },
            'sysHardWareInfo': [
                {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU Fan',
                'sensor_type': 'Control',
                'value': 34.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'Pump Fan',
                'sensor_type': 'Control',
                'value': 100.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #1',
                'sensor_type': 'Control',
                'value': 60.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #2',
                'sensor_type': 'Control',
                'value': 60.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #3',
                'sensor_type': 'Control',
                'value': 100.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #4',
                'sensor_type': 'Control',
                'value': 100.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #5',
                'sensor_type': 'Control',
                'value': 100.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #6',
                'sensor_type': 'Control',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': '+12V',
                'sensor_type': 'Voltage',
                'value': 11.97599983215332
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': '+5V',
                'sensor_type': 'Voltage',
                'value': 4.900000095367432
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'Vcore',
                'sensor_type': 'Voltage',
                'value': 1.0240000486373901
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'Voltage #1',
                'sensor_type': 'Voltage',
                'value': 0.550000011920929
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'DIMM',
                'sensor_type': 'Voltage',
                'value': 2.5
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU I/O',
                'sensor_type': 'Voltage',
                'value': 0.8940000534057617
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU System Agent',
                'sensor_type': 'Voltage',
                'value': 1.1060000658035278
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'Voltage #2',
                'sensor_type': 'Voltage',
                'value': 1.534000039100647
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'AVCC3',
                'sensor_type': 'Voltage',
                'value': 3.376000165939331
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU Termination',
                'sensor_type': 'Voltage',
                'value': 2.0460000038146973
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'VRef',
                'sensor_type': 'Voltage',
                'value': 1.8360000848770142
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'VSB',
                'sensor_type': 'Voltage',
                'value': 3.3560001850128174
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'AVSB',
                'sensor_type': 'Voltage',
                'value': 3.3560001850128174
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CMOS Battery',
                'sensor_type': 'Voltage',
                'value': 3.1680002212524414
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU',
                'sensor_type': 'Temperature',
                'value': 41.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System',
                'sensor_type': 'Temperature',
                'value': 33.5
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'VRM MOS',
                'sensor_type': 'Temperature',
                'value': 44.5
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'PCH',
                'sensor_type': 'Temperature',
                'value': 20.5
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU Socket',
                'sensor_type': 'Temperature',
                'value': 34.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'PCIe x1',
                'sensor_type': 'Temperature',
                'value': 32.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'M2_1',
                'sensor_type': 'Temperature',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'CPU Fan',
                'sensor_type': 'Fan',
                'value': 1152.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'Pump Fan',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #1',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #2',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #3',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #4',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #5',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'MSI PRO A620M-E (MS-7E28)/Nuvoton NCT6687D',
                'hardware_type': 'SuperIO',
                'sensor_name': 'System Fan #6',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #1',
                'sensor_type': 'Load',
                'value': 1.0465800762176514
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #2',
                'sensor_type': 'Load',
                'value': 1.3650298118591309
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #3',
                'sensor_type': 'Load',
                'value': 3.404635190963745
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #4',
                'sensor_type': 'Load',
                'value': 5.146729946136475
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #5',
                'sensor_type': 'Load',
                'value': 3.217226266860962
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #6',
                'sensor_type': 'Load',
                'value': 4.625016212463379
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #7',
                'sensor_type': 'Load',
                'value': 3.052729368209839
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #8',
                'sensor_type': 'Load',
                'value': 1.5176832675933838
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #9',
                'sensor_type': 'Load',
                'value': 0.5498290061950684
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #10',
                'sensor_type': 'Load',
                'value': 0.6076335906982422
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #11',
                'sensor_type': 'Load',
                'value': 0.9741425514221191
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core #12',
                'sensor_type': 'Load',
                'value': 0.9807765483856201
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Total',
                'sensor_type': 'Load',
                'value': 2.2073328495025635
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CPU Core Max',
                'sensor_type': 'Load',
                'value': 5.146729946136475
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Package',
                'sensor_type': 'Power',
                'value': 25.28716468811035
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #1',
                'sensor_type': 'Clock',
                'value': 3233.38525390625
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #1',
                'sensor_type': 'Factor',
                'value': 32.33333206176758
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #1 (SMU)',
                'sensor_type': 'Power',
                'value': 0.23090383410453796
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #1 VID',
                'sensor_type': 'Voltage',
                'value': 0.3187499940395355
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #2',
                'sensor_type': 'Clock',
                'value': 3233.38525390625
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #2',
                'sensor_type': 'Factor',
                'value': 32.33333206176758
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #2 (SMU)',
                'sensor_type': 'Power',
                'value': 0.6404263973236084
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #2 VID',
                'sensor_type': 'Voltage',
                'value': 0.3187499940395355
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #3',
                'sensor_type': 'Clock',
                'value': 4850.07763671875
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #3',
                'sensor_type': 'Factor',
                'value': 48.5
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #3 (SMU)',
                'sensor_type': 'Power',
                'value': 1.0164790153503418
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #3 VID',
                'sensor_type': 'Voltage',
                'value': 0.3187499940395355
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #4',
                'sensor_type': 'Clock',
                'value': 4850.07763671875
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #4',
                'sensor_type': 'Factor',
                'value': 48.5
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #4 (SMU)',
                'sensor_type': 'Power',
                'value': 0.3363816440105438
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #4 VID',
                'sensor_type': 'Voltage',
                'value': 0.3187499940395355
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #5',
                'sensor_type': 'Clock',
                'value': 3233.38525390625
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #5',
                'sensor_type': 'Factor',
                'value': 32.33333206176758
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #5 (SMU)',
                'sensor_type': 'Power',
                'value': 0.10547586530447006
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #5 VID',
                'sensor_type': 'Voltage',
                'value': 0.3187499940395355
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #6',
                'sensor_type': 'Clock',
                'value': 3233.38525390625
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #6',
                'sensor_type': 'Factor',
                'value': 32.33333206176758
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #6 (SMU)',
                'sensor_type': 'Power',
                'value': 0.15878205001354218
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core #6 VID',
                'sensor_type': 'Voltage',
                'value': 0.3187499940395355
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Core (Tctl/Tdie)',
                'sensor_type': 'Temperature',
                'value': 41.75000762939453
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'CCD1 (Tdie)',
                'sensor_type': 'Temperature',
                'value': 37.375
            }, {
                'hardware_path': 'AMD Ryzen 5 7500F',
                'hardware_type': 'Cpu',
                'sensor_name': 'Bus Speed',
                'sensor_type': 'Clock',
                'value': 100.00160217285156
            }, {
                'hardware_path': 'Generic Memory',
                'hardware_type': 'Memory',
                'sensor_name': 'Memory Used',
                'sensor_type': 'Data',
                'value': 10.574928283691406
            }, {
                'hardware_path': 'Generic Memory',
                'hardware_type': 'Memory',
                'sensor_name': 'Memory Available',
                'sensor_type': 'Data',
                'value': 21.17465591430664
            }, {
                'hardware_path': 'Generic Memory',
                'hardware_type': 'Memory',
                'sensor_name': 'Memory',
                'sensor_type': 'Load',
                'value': 33.30729675292969
            }, {
                'hardware_path': 'Generic Memory',
                'hardware_type': 'Memory',
                'sensor_name': 'Virtual Memory Used',
                'sensor_type': 'Data',
                'value': 11.593002319335938
            }, {
                'hardware_path': 'Generic Memory',
                'hardware_type': 'Memory',
                'sensor_name': 'Virtual Memory Available',
                'sensor_type': 'Data',
                'value': 25.15658187866211
            }, {
                'hardware_path': 'Generic Memory',
                'hardware_type': 'Memory',
                'sensor_name': 'Virtual Memory',
                'sensor_type': 'Load',
                'value': 31.545944213867188
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Core',
                'sensor_type': 'Temperature',
                'value': 36.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Core',
                'sensor_type': 'Clock',
                'value': 2475.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Memory',
                'sensor_type': 'Clock',
                'value': 10501.984375
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Fan 1',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Fan 2',
                'sensor_type': 'Fan',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Fan 1',
                'sensor_type': 'Control',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Fan 2',
                'sensor_type': 'Control',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Core',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Memory Controller',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Video Engine',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Bus',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Power',
                'sensor_type': 'Load',
                'value': 13.553999900817871
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Board Power',
                'sensor_type': 'Load',
                'value': 16.159000396728516
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Dedicated Memory Used',
                'sensor_type': 'SmallData',
                'value': 817.703125
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Shared Memory Used',
                'sensor_type': 'SmallData',
                'value': 70.703125
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D 3D',
                'sensor_type': 'Load',
                'value': 0.20605340600013733
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Compute_0',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Overlay',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Video Decode',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Copy',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Copy',
                'sensor_type': 'Load',
                'value': 0.0029525277204811573
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Security',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Video Encode',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Video Encode',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Video Processing',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Graphics_1',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Cuda',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Compute_1',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D VR',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Copy',
                'sensor_type': 'Load',
                'value': 0.0015937299467623234
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Copy',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Copy',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'D3D Copy',
                'sensor_type': 'Load',
                'value': 0.0025690165348351
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Hot Spot',
                'sensor_type': 'Temperature',
                'value': 40.46875
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Memory Total',
                'sensor_type': 'SmallData',
                'value': 12282.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Memory Free',
                'sensor_type': 'SmallData',
                'value': 11200.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Memory Used',
                'sensor_type': 'SmallData',
                'value': 1081.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Memory',
                'sensor_type': 'Load',
                'value': 8.804615020751953
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU Package',
                'sensor_type': 'Power',
                'value': 27.187999725341797
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU PCIe Rx',
                'sensor_type': 'Throughput',
                'value': 102400.0
            }, {
                'hardware_path': 'NVIDIA GeForce RTX 4070',
                'hardware_type': 'GpuNvidia',
                'sensor_name': 'GPU PCIe Tx',
                'sensor_type': 'Throughput',
                'value': 921600.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Temperature',
                'sensor_type': 'Temperature',
                'value': 40.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Available Spare',
                'sensor_type': 'Level',
                'value': 100.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Available Spare Threshold',
                'sensor_type': 'Level',
                'value': 1.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Percentage Used',
                'sensor_type': 'Level',
                'value': 3.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Data Read',
                'sensor_type': 'Data',
                'value': 37448.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Data Written',
                'sensor_type': 'Data',
                'value': 25698.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Temperature 1',
                'sensor_type': 'Temperature',
                'value': 40.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Temperature 2',
                'sensor_type': 'Temperature',
                'value': 33.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Used Space',
                'sensor_type': 'Load',
                'value': 68.50688171386719
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Read Activity',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Write Activity',
                'sensor_type': 'Load',
                'value': 0.056402258574962616
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Total Activity',
                'sensor_type': 'Load',
                'value': 0.20758971571922302
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Read Rate',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'Acer SSD N3500 1TB',
                'hardware_type': 'Storage',
                'sensor_name': 'Write Rate',
                'sensor_type': 'Throughput',
                'value': 39383.9140625
            }, {
                'hardware_path': 'HOME-4070',
                'hardware_type': 'Network',
                'sensor_name': 'Data Uploaded',
                'sensor_type': 'Data',
                'value': 0.13357633352279663
            }, {
                'hardware_path': 'HOME-4070',
                'hardware_type': 'Network',
                'sensor_name': 'Data Downloaded',
                'sensor_type': 'Data',
                'value': 0.01343630999326706
            }, {
                'hardware_path': 'HOME-4070',
                'hardware_type': 'Network',
                'sensor_name': 'Upload Speed',
                'sensor_type': 'Throughput',
                'value': 1898.752685546875
            }, {
                'hardware_path': 'HOME-4070',
                'hardware_type': 'Network',
                'sensor_name': 'Download Speed',
                'sensor_type': 'Throughput',
                'value': 768.71142578125
            }, {
                'hardware_path': 'HOME-4070',
                'hardware_type': 'Network',
                'sensor_name': 'Network Utilization',
                'sensor_type': 'Load',
                'value': 2.133971247531008e-05
            }, {
                'hardware_path': 'VMware Network Adapter VMnet1',
                'hardware_type': 'Network',
                'sensor_name': 'Data Uploaded',
                'sensor_type': 'Data',
                'value': 2.378597855567932e-06
            }, {
                'hardware_path': 'VMware Network Adapter VMnet1',
                'hardware_type': 'Network',
                'sensor_name': 'Data Downloaded',
                'sensor_type': 'Data',
                'value': 1.6763806343078613e-08
            }, {
                'hardware_path': 'VMware Network Adapter VMnet1',
                'hardware_type': 'Network',
                'sensor_name': 'Upload Speed',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'VMware Network Adapter VMnet1',
                'hardware_type': 'Network',
                'sensor_name': 'Download Speed',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'VMware Network Adapter VMnet1',
                'hardware_type': 'Network',
                'sensor_name': 'Network Utilization',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'VMware Network Adapter VMnet8',
                'hardware_type': 'Network',
                'sensor_name': 'Data Uploaded',
                'sensor_type': 'Data',
                'value': 4.647299647331238e-06
            }, {
                'hardware_path': 'VMware Network Adapter VMnet8',
                'hardware_type': 'Network',
                'sensor_name': 'Data Downloaded',
                'sensor_type': 'Data',
                'value': 0.0
            }, {
                'hardware_path': 'VMware Network Adapter VMnet8',
                'hardware_type': 'Network',
                'sensor_name': 'Upload Speed',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'VMware Network Adapter VMnet8',
                'hardware_type': 'Network',
                'sensor_name': 'Download Speed',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'VMware Network Adapter VMnet8',
                'hardware_type': 'Network',
                'sensor_name': 'Network Utilization',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': 'ZeroTier One [af78bf9436e11b49]',
                'hardware_type': 'Network',
                'sensor_name': 'Data Uploaded',
                'sensor_type': 'Data',
                'value': 0.0002963850274682045
            }, {
                'hardware_path': 'ZeroTier One [af78bf9436e11b49]',
                'hardware_type': 'Network',
                'sensor_name': 'Data Downloaded',
                'sensor_type': 'Data',
                'value': 5.766283720731735e-05
            }, {
                'hardware_path': 'ZeroTier One [af78bf9436e11b49]',
                'hardware_type': 'Network',
                'sensor_name': 'Upload Speed',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'ZeroTier One [af78bf9436e11b49]',
                'hardware_type': 'Network',
                'sensor_name': 'Download Speed',
                'sensor_type': 'Throughput',
                'value': 0.0
            }, {
                'hardware_path': 'ZeroTier One [af78bf9436e11b49]',
                'hardware_type': 'Network',
                'sensor_name': 'Network Utilization',
                'sensor_type': 'Load',
                'value': 0.0
            }, {
                'hardware_path': '以太网',
                'hardware_type': 'Network',
                'sensor_name': 'Data Uploaded',
                'sensor_type': 'Data',
                'value': 0.15431921184062958
            }, {
                'hardware_path': '以太网',
                'hardware_type': 'Network',
                'sensor_name': 'Data Downloaded',
                'sensor_type': 'Data',
                'value': 0.5411369800567627
            }, {
                'hardware_path': '以太网',
                'hardware_type': 'Network',
                'sensor_name': 'Upload Speed',
                'sensor_type': 'Throughput',
                'value': 2478.11279296875
            }, {
                'hardware_path': '以太网',
                'hardware_type': 'Network',
                'sensor_name': 'Download Speed',
                'sensor_type': 'Throughput',
                'value': 1231.908203125
            }, {
                'hardware_path': '以太网',
                'hardware_type': 'Network',
                'sensor_name': 'Network Utilization',
                'sensor_type': 'Load',
                'value': 0.002968016779050231
            }]
        }
    }

    关键数据库结构

    server_menu - 服务器信息存储表

    字段名称类型注释
    idbigintid编号
    server_namevarchar服务器名称
    server_tokenvarchar与客户端一致的token(唯一性)可以自动生成
    isEmailvarchar是否启用邮件告警(1开启 0关闭)
    ip_addrvarcharip地址(map存储,公网ip和局域网ip,手动设置)
    server_pwdvarchar服务密码(map存储,ssh密码,桌面密码,mysql密码等保存方式)
    service_providervarchar提供厂商(阿里云/腾讯云/家用服务器)
    remarklongtext备注信息
    create_timedatetime创建时间
    create_uservarchar创建人
    update_timedatetime更新时间
    update_uservarchar更新人

    server_heart_beat - 接收客户端心跳信息表

    字段名称类型注释
    id id编号(雪花算法)
    server_name 主机名称
    server_token 主机token
    sys_base_info 服务器基础信息
    heart_beat_info 心跳状态信息
    server_type (1 windows 2 linux 3 mac)
    server_up_time 心跳上传时间
    create_time 创建时间

    仓库地址:https://gitee.com/wonder19991209/sys-monitor

    ]]>
    0 https://blog.iletter.top/archives/472/#comments https://blog.iletter.top/feed/author/1/