基于Flask制作一个简易版桌面监控软件

news/2024/11/28 13:36:04/

/*

最近在B站上刷到一个视频,讲的是up主自己在上网课时和父母老师斗智斗勇,一边上课,一遍玩电脑游戏。我突然就感觉对于某些家长来说,监控电脑也许是个硬需求。市面上已经有诸如向日葵等远程监控,可以实现手机查看电脑,但有些弊端,就是操作过于复杂,我认为,对于一些人来说,功能足够简单甚至简陋都不是问题,动脑子学习才是问题,所以准备做出这个非常简陋的东西,玩一玩。

*/

系统结构:

一、桌面端

1、登记账号信息

2、上报

二、Web端

1、用户管理接口

2、桌面上报接口

3、查看桌面的web页

Web实现

一、目录结构

学习了flask,第一次写web项目,从实用的角度来对整个代码做如下的规划

--config└─route_config.py└─web_config.py--controller└─增删改拆.py--handler└─解析参数、调用controller、组装message,然后response--main└─webapp.py  #解析配置,启动web--model└─消息model└─sql model--static└─页面静态资源--templates└─模板.html--tools└─常用的方法集合

二、route config

按以往传统,route倾向于用配置文件记录,现在流行装饰模式替代route配置,但是我又希望能够一目了然的查看route,所以把所有的route单拉出来,集中放在route_config.py中。在这个文件中只写明route和处理函数,其他统统不管。

类似这样:

from main.webapp import app
from handler import watcherhandler# ********************  监控系统部分   ***********************# 客服二维码图片
@app.route('/watcher/custom')
def watcher_custom_qrcode():return watcherhandler.get_custom_qrcode()# 查看地址
@app.route('/watcher/q/<uuid>')
def watcher_query(uuid):return watcherhandler.get_user_watch_page(uuid)# 验证admin
@app.route('/watcher/adm/check')
def watcher_admin_check():return watcherhandler.handle_check_admin()# 创建用户
@app.route('/watcher/adm/create')
def watcher_create_user():return watcherhandler.handle_create_user()# 用户接口
@app.route('/watcher/user', methods=['POST'])
def watcher_api_user():return watcherhandler.handle_user_api()# 用户上传截图
@app.route('/watcher/upload',methods=['POST'])
def watcher_api_upload():return watcherhandler.handle_user_upload()

三、handler

handler层不必关心数据读写细节,只管调用controller来实现数据读写。更多的关心参数处理、状态判断等。

例如:

from flask import request
from controller import user
import json
from sql_model import message
from tools import md5tool# checking user auth and return token
# ?account=***&pwd=***
def handle_request_user():request_result = ''account = request.args.get('account')pwd = request.args.get('pwd')# check parmsif account is None or pwd is None:return message.create_fail_message(101,'parms error')u = user.get_user(account, pwd)# check user infoif u is None:return message.create_fail_message(102,'auth error')# pass check ,and create tokentk = md5tool.create_md5_by_time()create_success = user.create_token(u,tk)# create token successif create_success :return message.create_handle_user_message(100,tk)# create token failelse:return message.create_fail_message(103,'token fail')return request_result

四、controller

controller用来写与数据库打交道的逻辑。这种项目感觉用了orm会更繁琐,直接手写sql。

例如:

from sql import db
from tools import md5tool# 创建一个新的用户
def create_new_user(account,pwd):admin = get_admin(account,pwd)if admin != None:admin_id = admin['id']user_uuid = md5tool.create_md5_by_time()user_try_time = 1  # 试用天数sql = \('''insert into watcher_user (uuid,state,outdate,creator) values ('{0}',1,adddate(now(),interval {1} day),{2});''').format(user_uuid,user_try_time,admin_id)affect = db.session.execute(sql).rowcountif affect ==1 :db.session.commit()return user_uuidelse:return Noneelse:return None

五、template注意事项

资源放在static中时,资源的路径是 [域名/static/资源位置],template中使用的资源如果放在static中,那就要注意对应的route有多深,比如route配置的是[域名/a/b/c],那么在template中的资源应该地址配成[../../../static/资源位置]。

例如:

某个route配置是:

# 查看地址
@app.route('/watcher/q/<uuid>')
def watcher_query(uuid):return watcherhandler.get_user_watch_page(uuid)

这个页面使用的template是:

 该模板具体内容为:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>查 看</title>
</head>
<body style="background-image: url(../../static/watcher/bg.png);background-repeat: no-repeat;background-size: 100% 100%;"><h4>上传时间:{{ uploadtime }}</h4><img src="../../static/watcher/mo/{{ imgurl }}.png" width="100%"><div style="width: 100%;">软件到期时间:{{ outdate }}<br><br>注:<br>1、当PC端运行时,每隔5分钟上报一次 <br>2、可能因为网络、安全软件、程序没运行等原因导致截屏没有上报<br>3、如有疑问请联系客服微信<br><br></div><div style="width: 100%;text-align: center;"><img src="../../static/watcher/custom.png" width="60%"></div>  
</body></html>

PC端:

核心就是记录账号和上传截图的功能。没啥好说的,唯一需要注意的就是添加开机启动项,如果为所有用户添加,则需要管理员功能,在设置的时候弹出ua,于是单独写了一个exe,然后通过Process.Start去执行。

public static void SetStartWhenBoot()
{//创建启动对象ProcessStartInfo startInfo = new ProcessStartInfo();startInfo.UseShellExecute = true;startInfo.WorkingDirectory = Environment.CurrentDirectory;startInfo.FileName = "set-auto-start.exe";startInfo.CreateNoWindow = false;//设置启动动作,确保以管理员身份运行startInfo.Verb = "runas";try{Process.Start(startInfo);}catch{return;}
}

vs安装的时候没装全,好像没带打包的功能。网上找了一个工具叫<AdvancedInstallerPortable>,感觉挺好用的,直接把debug文件夹下的exe拖过去设置就好了。

打包后:


http://www.ppmy.cn/news/249790.html

相关文章

基于神经网络的智能诊断,基于神经网络的控制

机电系统智能控制的毕业论文可以写哪些部分&#xff1f; 基于联合仿真的机电液一体化系统优化设计方法研究&#xff0c;我的题目。并联机器人系统的仿真优化在搭建的仿真优化平台上对并联机器人进行联合仿真和集成优化研究。 通过仿真优化验证了机电液一体化系统近似模型和优…

腾创秒会达Webrtc视频语音系统,支持BS,CS架构操作灵活简单,免费测试满意再谈购买

1.1视频会议系统主界面 下图是两种会议模式下系统的主界面&#xff0c;上方四大功能显示区&#xff1a;电子白板、屏幕共享、手写展台和多媒体区&#xff1b;左侧栏是系统工具栏&#xff0c;包括了各种大大小小的功能和系统设置。两种模式下&#xff0c;白板模式&#xff1a;即…

神经网络burgers方程讲解,神经网络不收敛的表现

1、为什么Matlab训练神经网络用不了GPU 可以用gpu加速训练&#xff0c;可以通过增加useGPU字段:train(net,P,T,useGPU,yes);或先将数据集P,T通过函数PgpugpuArray(P);TgpugpuArray(T);转移到gpu内存中&#xff0c;再调用训练函数train(net,Pgpu,Tgpu)但是需要注意以下几点&…

主流的神经网络的框架,神经网络设计与实现

什么叫做深度学习框架&#xff0c;其作用是什么 深度学习框架是一种为了深度学习开发而生的工具&#xff0c;库和预训练模型等资源的总和。有了这种框架&#xff0c;看似复杂神秘的深度学习模型开发被大大简化&#xff0c;成为AI开发者的必用利器。 目前&#xff0c;TensorFl…

多神经网络模型联合训练,神经网络模型怎么训练

重复利用神经网络时需要多次训练吗 神经网络中的训练次数是指什么&#xff1f; 神经网络中的训练次数是训练时&#xff0c;1个batch训练图像通过网络训练一次&#xff08;一次前向传播一次后向传播&#xff09;&#xff0c;每迭代一次权重更新一次&#xff1b;测试时&#xf…

神经网络 知识图谱,神经网络基础知识

安霸半导体最新推出高性能AI视觉处理器CV5&#xff0c;你了解多少&#xff1f; Ambarella&#xff08;下称”安霸半导体”&#xff0c;纳斯达克代码&#xff1a;AMBA&#xff0c;专注人工智能视觉的一家半导体公司&#xff09;宣布推出 CVflow 系列最新芯片 CV5&#xff0c;该…

神经网络训练数据集下载,神经网络训练集数量

200组数据可以训练神经网络吗 谷歌人工智能写作项目&#xff1a;神经网络伪原创 BP神经网络的训练集需要大样本吗&#xff1f;一般样本个数为多少&#xff1f; BP神经网络的训练集需要大样本吗&#xff1f;一般样本个数为多少&#xff1f; BP神经网络样本数有什么影响学习神…

vector 练习

目录 一、创建动态二维数组的方法 0x01 C语言法 0x02 C法 二、 杨辉三角 三、电话号码的数字组合 一、创建动态二维数组的方法 0x01 C语言法 int** p (int**)malloc(sizeof(int*) * M);//创建M行的数组,每一行都是一个数组 for(size_t i 0;i < M;i) {p[i] (int*)mal…