From 8325fedae3336bd68b3eb01964a0f872df3f4004 Mon Sep 17 00:00:00 2001 From: Codepy <1942171924@qq.com> Date: Sat, 13 Apr 2024 21:02:34 +0800 Subject: [PATCH 1/5] =?UTF-8?q?upd=EF=BC=9A=E4=BC=98=E5=8C=96=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/index.py | 5 ++++- app/utils/Config.py | 1 + app/utils/Route.py | 2 -- app/utils/Service.py | 3 ++- main.py | 2 ++ public/static/css/index.css | 30 ++++++++++++++++++++++++++++++ public/static/css/login.css | 4 ++++ public/static/img/ico.png | Bin 0 -> 3216 bytes public/static/img/panel.png | Bin 0 -> 6682 bytes templates/index.html | 18 ++++++++++++++++++ templates/login.html | 1 + 11 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 public/static/css/index.css create mode 100644 public/static/img/ico.png create mode 100644 public/static/img/panel.png diff --git a/app/controller/index.py b/app/controller/index.py index 15c3bd3..b88fc39 100644 --- a/app/controller/index.py +++ b/app/controller/index.py @@ -1,4 +1,6 @@ -from flask import Flask, Response +import os + +from flask import Flask from app.utils import Route from app.utils import Config @@ -9,6 +11,7 @@ def service_start(): # 获取配置文件 cfg = Config.get_config() app.secret_key = cfg["secret_key"] + print(os.getcwd()) print(cfg) # 可以在路径内以/<参数名>的形式指定参数,默认接收到的参数类型是string Route.get_route(app,cfg) diff --git a/app/utils/Config.py b/app/utils/Config.py index 95a5439..091c8fb 100644 --- a/app/utils/Config.py +++ b/app/utils/Config.py @@ -1,5 +1,6 @@ import json + # JSON 文件路径 def get_config(): file_path = "./data/config/panel.json" diff --git a/app/utils/Route.py b/app/utils/Route.py index c9e0ffe..81f34f3 100644 --- a/app/utils/Route.py +++ b/app/utils/Route.py @@ -5,8 +5,6 @@ from app.controller import api def get_route(app, cfg): @app.before_request def before_request_func(): - # 打印出所有路径参数及其值 - print(request.path) if "username"in session and "pw" in session: if cfg[session.get('username')] != session.get('pw'): if request.path != "/" + cfg["safe_entry"]: diff --git a/app/utils/Service.py b/app/utils/Service.py index 6f3bc3c..0d5ed29 100644 --- a/app/utils/Service.py +++ b/app/utils/Service.py @@ -36,7 +36,8 @@ def create_systemd_service(service_name): # 打开指定路径下的注册表项 key_handle = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key, 0, winreg.KEY_WRITE) # 设置注册表项的值 - winreg.SetValueEx(key_handle, "QPanel面板", 0, winreg.REG_SZ, "C:\Program Files\QPanel\main.exe") + + winreg.SetValueEx(key_handle, "QPanel面板", 0, winreg.REG_SZ, os.getcwd()+"\main.exe") # 关闭注册表项 winreg.CloseKey(key_handle) return True diff --git a/main.py b/main.py index 2f362a1..63343c1 100644 --- a/main.py +++ b/main.py @@ -8,6 +8,8 @@ import sys # 检测安装 if f.Had("data/config/panel.json"): print("已安装") + print("开始启动面板...") + print("------------------------------------") index.service_start() else: print("未安装面板") diff --git a/public/static/css/index.css b/public/static/css/index.css new file mode 100644 index 0000000..dbae031 --- /dev/null +++ b/public/static/css/index.css @@ -0,0 +1,30 @@ +body, html { + height: 100%; + margin: 0; + padding: 0; +} + +.container { + display: flex; + height: 100%; +} + +.menu { + min-width:80px; + width: 10%; + max-width:120px; + background-color: #e8f0ff; + color: #fff; + padding: 20px; + box-sizing: border-box; +} +.menu img{ + width:90%; + padding-inline: 5%; +} + +.content { + width: 90%; + height: 100%; + border: none; +} \ No newline at end of file diff --git a/public/static/css/login.css b/public/static/css/login.css index 2f5f060..4af1861 100644 --- a/public/static/css/login.css +++ b/public/static/css/login.css @@ -23,6 +23,10 @@ .form-group label { display: block; margin-bottom: 5px; + } + .img { + width:30%; + text-align: center; } .form-group input { width: 100%; diff --git a/public/static/img/ico.png b/public/static/img/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..a1acfa18f33abf13bbf7b3ca8217f48c8d158ff7 GIT binary patch literal 3216 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 literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html index e69de29..99af1cd 100644 --- a/templates/index.html +++ b/templates/index.html @@ -0,0 +1,18 @@ + + + + + + QPanel + + + +
+ + +
+ + diff --git a/templates/login.html b/templates/login.html index c2e00d5..bd7bf9c 100644 --- a/templates/login.html +++ b/templates/login.html @@ -9,6 +9,7 @@
+ QPanel Logo

QPanel登录

-- Gitee From 6fdd9b367c2d2360226aaa292e6d3337cc7d49b4 Mon Sep 17 00:00:00 2001 From: Codepy <1942171924@qq.com> Date: Sat, 13 Apr 2024 21:21:06 +0800 Subject: [PATCH 2/5] =?UTF-8?q?test=EF=BC=9A=E5=89=8D=E7=AB=AF=E5=BC=80?= =?UTF-8?q?=E5=B7=A5=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/Route.py | 4 +++ public/static/css/index.css | 58 ++++++++++++++++++++++--------------- templates/index.html | 1 + templates/p/home.html | 13 +++++++++ 4 files changed, 53 insertions(+), 23 deletions(-) create mode 100644 templates/p/home.html diff --git a/app/utils/Route.py b/app/utils/Route.py index 81f34f3..463c2a2 100644 --- a/app/utils/Route.py +++ b/app/utils/Route.py @@ -26,6 +26,10 @@ def get_route(app, cfg): def home(): return render_template('index.html') + @app.route("/p/") + def page(path): + return render_template("/p/" + path + '.html') + @app.route("/" + cfg["safe_entry"]) def login(): return render_template('login.html') diff --git a/public/static/css/index.css b/public/static/css/index.css index dbae031..9c9dec0 100644 --- a/public/static/css/index.css +++ b/public/static/css/index.css @@ -1,30 +1,42 @@ -body, html { - height: 100%; - margin: 0; - padding: 0; +body,html { + height:100%; + margin:0; + padding:0; } - .container { - display: flex; - height: 100%; + display:flex; + height:100%; } - .menu { - min-width:80px; - width: 10%; - max-width:120px; - background-color: #e8f0ff; - color: #fff; - padding: 20px; - box-sizing: border-box; + min-width:80px; + width:10%; + max-width:120px; + background-color:#D5E2FF; + color:#fff; + padding: 1%; + box-sizing:border-box; } -.menu img{ - width:90%; - padding-inline: 5%; +.menu-item { + padding: 0px; + margin-top:10px; + /* 矩形 2 */ + left:32px; + top:142px; + color:#000000; + width:85px; + height:41px; + border-radius:5px; + opacity:1; + background:rgba(228,236,255,0.85); + box-shadow:0px 1px 7px 0px rgba(205,205,205,0.3); +} +.menu img { + width:90%; + padding-inline:5%; + margin-bottom:10px; } - .content { - width: 90%; - height: 100%; - border: none; -} \ No newline at end of file + width:90%; + height:100%; + border:none; +} diff --git a/templates/index.html b/templates/index.html index 99af1cd..a65bd4a 100644 --- a/templates/index.html +++ b/templates/index.html @@ -11,6 +11,7 @@
diff --git a/templates/p/home.html b/templates/p/home.html new file mode 100644 index 0000000..60ca61b --- /dev/null +++ b/templates/p/home.html @@ -0,0 +1,13 @@ + + + + + + + QPanel + + + + + \ No newline at end of file -- Gitee From 2679cb278cc6e2491decad3d761aae48b6cffacc Mon Sep 17 00:00:00 2001 From: Codepy <1942171924@qq.com> Date: Sun, 14 Apr 2024 10:09:57 +0800 Subject: [PATCH 3/5] =?UTF-8?q?bugfix=EF=BC=9ATraceback=20(most=20recent?= =?UTF-8?q?=20call=20last):=20=20=20File=20"/sec/root/quick-panel/bin/quic?= =?UTF-8?q?k-panel/./main.py",=20line=2018,=20in=20=20=20=20=20=20?= =?UTF-8?q?if=20paninstall.install():=20=20=20=20=20=20=20=20^^^^^^^^^^^^^?= =?UTF-8?q?^^^^^^^=20=20=20File=20"/sec/root/quick-panel/bin/quick-panel/a?= =?UTF-8?q?pp/controller/install.py",=20line=2058,=20in=20install=20=20=20?= =?UTF-8?q?=20=20service=5Ffile=20=3D=20Service.create=5Fsystemd=5Fservice?= =?UTF-8?q?(service=5Fname)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=20?= =?UTF-8?q?=20=20File=20"/sec/root/quick-panel/bin/quick-panel/app/utils/S?= =?UTF-8?q?ervice.py",=20line=208,=20in=20create=5Fsystemd=5Fservice=20=20?= =?UTF-8?q?=20=20=20username=20=3D=20os.getlogin()=20=20#=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E5=90=8D=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20^^^^^^^^^^^^^=20OSError:?= =?UTF-8?q?=20[Errno=206]=20No=20such=20device=20or=20address?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/Service.py | 6 +++--- public/static/css/index.css | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/utils/Service.py b/app/utils/Service.py index 0d5ed29..844e935 100644 --- a/app/utils/Service.py +++ b/app/utils/Service.py @@ -1,11 +1,11 @@ import os from app.utils import System - +import pwd def create_systemd_service(service_name): if System.get_system_name() == "Linux": - print(1) - username = os.getlogin() # 获取当前用户名 + print("设置开机自启动") + username = pwd.getpwuid(os.getuid()).pw_name # 获取当前用户名 script_path = "/home/quick-panel/" service_content = f"""\ [Unit] diff --git a/public/static/css/index.css b/public/static/css/index.css index 9c9dec0..f1726d3 100644 --- a/public/static/css/index.css +++ b/public/static/css/index.css @@ -17,6 +17,7 @@ body,html { box-sizing:border-box; } .menu-item { + display: flex; padding: 0px; margin-top:10px; /* 矩形 2 */ @@ -29,6 +30,8 @@ body,html { opacity:1; background:rgba(228,236,255,0.85); box-shadow:0px 1px 7px 0px rgba(205,205,205,0.3); + align-items: center; + justify-content: center; } .menu img { width:90%; -- Gitee From c740cfdf717bd772b223617dd954ba176586571b Mon Sep 17 00:00:00 2001 From: Codepy <1942171924@qq.com> Date: Sun, 14 Apr 2024 13:44:23 +0800 Subject: [PATCH 4/5] =?UTF-8?q?upd=EF=BC=9A=E4=BC=98=E5=8C=96=E5=90=84?= =?UTF-8?q?=E6=96=B9=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/api.py | 40 +++++++++++++++++++++++++++++++++++-- app/utils/Route.py | 7 +++---- app/utils/Service.py | 3 ++- public/static/css/index.css | 5 +++++ templates/p/home.html | 2 ++ 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/app/controller/api.py b/app/controller/api.py index 32edff5..9839f4a 100644 --- a/app/controller/api.py +++ b/app/controller/api.py @@ -1,8 +1,8 @@ from flask import jsonify, session import hashlib -import json +import psutil def service(path, cfg, data): - if path == "login": + if path == "post/login": print(data) if data["username"] in cfg: # 登录用户名正确 @@ -16,3 +16,39 @@ def service(path, cfg, data): return jsonify({'code': 401, 'msg': 'Wrong password'}) else: return jsonify({'code': 404, 'msg': 'User not found'}) + elif path == "get/runtime_state": + # 获取CPU信息 + cpu_count = psutil.cpu_count() + cpu_percent = psutil.cpu_percent(interval=1) + + # 获取内存信息 + memory_info = psutil.virtual_memory() + total_memory = memory_info.total + memory_percent = memory_info.percent + + # 获取CPU占比前三的进程 + cpu_top_processes = sorted( + [(p.name(), p.cpu_percent()) for p in psutil.process_iter(attrs=['name', 'cpu_percent'])], + key=lambda x: x[1], + reverse=True + )[:3] + + # 获取内存占比前三的进程 + memory_top_processes = sorted( + [(p.name(), p.memory_percent()) for p in psutil.process_iter(attrs=['name', 'memory_percent'])], + key=lambda x: x[1], + reverse=True + )[:3] + + + data = { + "cpu_core": cpu_count, + "cpu_usage": cpu_percent, + "memory_total": total_memory, + "memory_usage": memory_percent, + "top_processes": { + "cpu": cpu_top_processes, + "memory": memory_top_processes + } + } + return jsonify(data) diff --git a/app/utils/Route.py b/app/utils/Route.py index 463c2a2..d44522d 100644 --- a/app/utils/Route.py +++ b/app/utils/Route.py @@ -5,7 +5,7 @@ from app.controller import api def get_route(app, cfg): @app.before_request def before_request_func(): - if "username"in session and "pw" in session: + if "username" in session and "pw" in session: if cfg[session.get('username')] != session.get('pw'): if request.path != "/" + cfg["safe_entry"]: if "/static" not in request.path and "/api/post/login" not in request.path: @@ -17,9 +17,8 @@ def get_route(app, cfg): # 未登录 abort(404) - @app.errorhandler(404) - def page_not_found(error): + def page_not_found(): return render_template('404.html'), 404 @app.route("/") @@ -39,6 +38,6 @@ def get_route(app, cfg): # 使用send_from_directory函数来发送静态文件 return send_from_directory(app.static_folder, path) - @app.route('/api/post/', methods=['POST']) + @app.route('/api/', methods=['POST', 'GET']) def api_controller(path): return api.service(path, cfg, request.json) diff --git a/app/utils/Service.py b/app/utils/Service.py index 844e935..0ebd26b 100644 --- a/app/utils/Service.py +++ b/app/utils/Service.py @@ -1,10 +1,11 @@ import os from app.utils import System -import pwd + def create_systemd_service(service_name): if System.get_system_name() == "Linux": print("设置开机自启动") + import pwd username = pwd.getpwuid(os.getuid()).pw_name # 获取当前用户名 script_path = "/home/quick-panel/" service_content = f"""\ diff --git a/public/static/css/index.css b/public/static/css/index.css index f1726d3..a8cb3d5 100644 --- a/public/static/css/index.css +++ b/public/static/css/index.css @@ -33,6 +33,11 @@ body,html { align-items: center; justify-content: center; } + +.menu-item:hover { + background-color:#eff7ff; +} + .menu img { width:90%; padding-inline:5%; diff --git a/templates/p/home.html b/templates/p/home.html index 60ca61b..a598d25 100644 --- a/templates/p/home.html +++ b/templates/p/home.html @@ -9,5 +9,7 @@ + + \ No newline at end of file -- Gitee From 6689e11846d8f038e6e0b07fe2858fc3d492579c Mon Sep 17 00:00:00 2001 From: Codepy <1942171924@qq.com> Date: Tue, 16 Apr 2024 17:05:42 +0000 Subject: [PATCH 5/5] update README.md. Signed-off-by: Codepy <1942171924@qq.com> --- README.md | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 6b3e88a..8726895 100644 --- a/README.md +++ b/README.md @@ -4,34 +4,21 @@ 使用Python+flask框架搭建的服务器管理面板 #### 软件架构 -软件架构说明 +使用Python 3.6.8环境,flask作为后端框架开发。 #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +##### Linux版本 +1. 下载master分支的`install.sh`并执行,然后根据输出信息登录面板 -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx +##### Windows版本 +1. 下载软件的Windows发行版,并运行main.exe即可(绿色软件,放哪儿都可以) +2. 请注意⚠️该面板对Windows版本的兼容性较差。(主要体现在后台运行方面) #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +4. 新建 Pull Request \ No newline at end of file -- Gitee