版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
8.8项目开发1.功能需求基于Flask,开发一个基于Web的工业设备监控系,功能及数据库设计参见第6章第6.5.2节。2.项目结构项目的结构如图8-15所示。3.项目设计(1)登录界面设计项目的登录界面如图8-16所示。(2)系统的主界面设计系统登录后直接跳转到主界面或单击主菜单的“Monitoring”按钮跳转到主界面,如图8-17所示。系统的主界面显示设备统计信息(设备总数及设备的状态)、设备的基本信息和故障预警信息。(3)设备信息界面设计单击主菜单的“Device”或从主界面单击“ViewFullList”按钮跳转到设备管理界面,如图8-18所示。该界面显示设备信息并可以添加设备、删除设备、修改设备、查看设备详细信息。(4)设备实时数据显示单击“Device”界面中每个设备后面的“Real-timeData”按钮,可以以图表的形式显示每个设备的实时运行情况(震动、电流、温度),如图8-19所示。(5)告警管理单击主菜单的“Alerts”或从主界面单击“ViewAllAlerts”按钮跳转到告警管理界面,如图8-20示。该界面显示告警信息,并可以实现告警信息进行删除、查看详情等操作。4.项目实现(1)构建模型models.py项目模型的主要代码如下:11fromwerkzeug.securityimportgenerate_password_hash,check_password_hash2fromflask_loginimportUserMixin3fromappimportdb,login4fromdatetimeimportdatetime5classDevice(db.Model):6__tablename__='devices'78id=db.Column(db.Integer,primary_key=True)9name=db.Column(db.String(100),unique=True,nullable=False)10type=db.Column(db.String(50),nullable=False)11location=db.Column(db.String(100),nullable=False)12installation_date=db.Column(db.DateTime,nullable=False)13status=db.Column(db.String(20),nullable=False)14last_maintenance=db.Column(db.DateTime)15manufacturer=db.Column(db.String(100))16model=db.Column(db.String(50))18sensor_data=db.relationship('SensorData',backref='device',lazy='dynamic')19alerts=db.relationship('Alert',backref='device',lazy='dynamic')202121defrepr(self):22returnf'<Device{}>'2324classSensorData(db.Model):25__tablename__='sensor_data'26#略27classAlert(db.Model):28__tablename__='alerts'29#略说明:以上只给出了系统的主要代码,详细代码请参见配套资源。(2)视图的实现本系统主要包括四个视图:routes/devices.py,routes/alerts.py,routes/monitoring.py和routes/auth.py视图。 devices.py的代码如下:1fromflaskimportBlueprint,render_template,redirect,url_for,flash,request2fromflask_loginimportlogin_required3fromappimportdb4fromapp.models.modelsimportDevice5fromdatetimeimportdatetime6fromapp.models.formsimportDeviceForm7bp=Blueprint('devices',__name__)#蓝图89@bp.route('/devices')10@login_required11defdevice_list():12page=request.args.get('page',1,type=int)13per_page=1014devices=Device.query.order_by(D).paginate\#续行15(page=page,per_page=per_page)16returnrender_template('devices/device_list.html',devices=devices)18@bp.route('/devices/add',methods=['GET','POST'])19@login_required20defadd_device():21form=DeviceForm()22ifform.validate_on_submit():23device=Device( 24name=.data,2525type=form.type.data,26location=form.location.data,27installation_date=datetime.strptime(form.installation_date.data,'%Y-%m-%d'),28status=form.status.data,29last_maintenance=datetime.strptime(form.last_maintenance.data,'%Y-%m-%d')ifform.last_maintenance.dataelseNone,30manufacturer=form.manufacturer.data,31model=form.model.data32)33db.session.add(device)34mit()35flash('Deviceaddedsuccessfully!','success')36returnredirect(url_for('devices.device_list'))3738returnrender_template('devices/add_device.html',form=form)3940@login_required41defedit_device():#添加设备42#略4344@login_required45defdelete_device():#删除设备46#略4748@login_required49defdevice_details_device():#设备详细信息50#略monitoring.py的代码如下:1fromflaskimportBlueprint,render_template,jsonify2fromflask_loginimportlogin_required3fromapp.models.modelsimportDevice,SensorData,Alert4fromdatetimeimportdatetime,timedelta5importstatistics67bp=Blueprint('monitoring',__name__)#蓝图89@bp.route('/dashboard')10@login_required11defdashboard():12devices=Device.query.all()13alerts=Alert.query.filter_by(resolved=False).order_by\#续行14(Alert.timestamp.desc()).limit(5).all()15returnrender_template('monitoring/dashboard.html',16devices=devices,17alerts=alerts)19@bp.route('/realtime-data/<int:device_id>')20@login_required21defrealtime_data(device_id):22device=Device.query.get_or_404(device_id)23returnrender_template('monitoring/realtime_data.html',device=device)2425@bp.route('/api/realtime-data/<int:device_id>')26@login_required27defget_realtime_data(device_id):28#Getdatafromlast5minutes29time_threshold=datetime.utcnow()-timedelta(minutes=5)30data_points=SensorData.query.filter(31SensorData.device_id==device_id,32SensorData.timestamp>=time_threshold33).order_by(SensorData.timestamp.desc()).limit(50).all()3435data={36'timestamps':[dp.timestamp.isoformat()fordpindata_points],37'temperature':[float(dp.temperature)ifdp.temperatureelseNonefordpindata_points],38'vibration':[float(dp.vibration)ifdp.vibrationelseNonefordpindata_points],39'current':[float(dp.current_consumption)ifdp.current_consumptionelseNonefordpindata_points]4142returnjsonify(data)(3)模板templates/base.html模板主要用于显示主菜单,核心代码如下:1<!1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>{%blocktitle%}DeviceManagementSystem{%endblock%}</title>7<linkrel="stylesheet"href="/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">8<linkrel="stylesheet"href="/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">9<linkrel="stylesheet"href="{{url_for('static',filename='css/styles.css')}}">10{%blockstyles%}{%endblock%}11</head>12<body>13<navclass="navbarnavbar-expand-lgnavbar-darkbg-primary">14<divclass="container">15<aclass="navbar-brand"href="{{url_for('monitoring.dashboard')}}">DeviceManagement</a>16<buttonclass="navbar-toggler"type="button"data-bs-toggle="collapse"data-bs-target="#navbarNav">17<spanclass="navbar-toggler-icon"></span>18</button>19<divclass="collapsenavbar-collapse"id="navbarNav">20<ulclass="navbar-navme-auto">21<liclass="nav-item">22<aclass="nav-link"href="{{url_for('devices.device_list')}}">Devices</a>23</li>24<liclass="nav-item">25<aclass="nav-link"href="{{url_for('monitoring.dashboard')}}">Monitoring</a>26</li>27<liclass="nav-item">28<aclass="nav-link"href="{{url_for('alerts.alert_list')}}">Alerts</a>29</li>30</ul>31<ulclass="navbar-nav">3232<liclass="nav-item">33<aclass="nav-link"href="#"><iclass="bibi-bell-fill"></i></a>34</li>35<liclass="nav-item">36<aclass="nav-link"href="#"><iclass="bibi-person-circle"></i>Admin</a>37</li>38</ul>39</div>40</div>41</nav>42<footerclass="mt-5py-3bg-light">43<divclass="containertext-center">44<spanclass="text-muted">DeviceManagementSystem©2025</span>45</div>46</footer>4748<scriptsrc="></script>"/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>49<scriptsrc="></script>50"/npm/chart.js"></script>></script>50"50<scriptsrc="{{url_for('static',filename='js/scripts.js')}}"></script>51{%blockscripts%}52{%endblock%}53</body>54</html>55templates/device_list.html核心代码如下:1{%extends"base.html"%}23{%blocktitle%}DeviceList{%endblock%}45{%blockcontent%}6<divclass="d-flexjustify-content-betweenalign-items-centermb-4">7<h1>DeviceList</h1>8<ahref="{{url_for('devices.add_device')}}"class="btnbtn-primary">9<iclass="bibi-plus-lg"></i>AddDevice</a>11</div>11</div>13<divclass="card">14<divclass="card-body">15<divclass="table-responsive">16<tableclass="tabletable-hover">17<thead>1819<th>ID</th>20<th>Name</th>21<th>Type</th>22<th>Location</th>23<th>Status</th>24<th>Actions</th>25</tr>26</thead>27<tbody>28{%fordeviceindevices.items%}29<tr>30<td>{{device.id}}</td>31<td>{{}}</td>32<td>{{device.type}}</td>33<td>{{device.location}}</td>34<td>35<spanclass="badgebg-{{device.get_status_color()}}">36{{device.status}}37</span>38</td>39<td>40<ahref="{{url_for('devices.device_details',id=device.id)}}"class="btnbtn-smbtn-info">41<iclass="bibi-eye"></i>42</a>43<ahref="{{url_for('devices.edit_device',id=device.id)}}"class="btnbtn-smbtn-warning">44<iclass="bibi-pencil"></i>45</a>4646<formmethod="POST"action="{{url_for('devices.delete_device',id=device.id)}}"class="d-inline">47<buttontype="submit"class="btnbtn-smbtn-danger"onclick="returnconfirm('Areyousureyouwanttodeletethisdevice?')">48<iclass="bibi-trash"></i>49</button>50</form>51</td>52</tr>53{%endfor%}54</tbody>55</table>56</div>5758<navaria-label="Pagenavigation">59<ulclass="paginationjustify-content-center">60{%ifdevices.has_prev%}61<liclass="item">62<aclass="link"href="{{url_for('devices.device_list',page=devices.prev_num)}}">Previous</a>63</li>64{%else%}65<liclass="itemdisabled">66<aclass="link"href="#"tabindex="-1">Previous</a>67</li>68{%endif%}6970{%forpage_numindevices.iter_pages(left_edge=1,right_edge=1,left_current=2,right_current=3)%}71{%ifpage_num%}72{%ifdevices.page==page_num%}73<liclass="itemactive">74<aclass="link"href="{{url_for('devices.device_list',page=page_num)}}">{{page_num}}</a>75</li>77<liclass="item">78<aclass="link"href="{{url_for('devices.device_list',page=page_num)}}">{{page_num}}</a>79</li>80{%endif%}82<liclass="itemdisabled">83<aclass="link"href="#">...</a>84</li>85{%endif%}86{%endfor%}88{%ifdevices.has_next%}89<liclass="item">90<aclass="link"href="{{url_for('devices.device_list',page=devices.next_num)}}">Next</a>91</li>92{%else%}93<liclass="itemdisabled">94<aclass="link"href="#"tabindex="-1">Next</a>95</li>96{%endif%}97</ul>98
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装车仓操作工安全实操竞赛考核试卷含答案
- 数控插工变革管理知识考核试卷含答案
- 文化办公用品公司渠道经理述职报告
- 煮呢机挡车工岗前离岗考核试卷含答案
- 西式面点师岗前教育考核试卷含答案
- 棉花保管员岗位操作规范考核试卷含答案
- 水上起重工安全检查评优考核试卷含答案
- 金属版印刷员工艺优化评优考核试卷含答案
- 饰面板组坯及预压工复测测试考核试卷含答案
- 2026中国叶黄素酯跨境电商发展机遇与海外市场拓展报告
- 2026年浙江省中考数学真题含答案
- 2025-2026学年四川省宜宾市兴文县数学三年级下学期期末监测试题(含答案)
- 【玉溪】2026年云南玉溪市红塔区卫生健康系统公开招聘毕业生及紧缺人才10人笔试历年典型考题及考点剖析附带答案详解
- 高考英语新课标3100词汇(音标·词性·多义·真题生义完整版)
- 2026年智能网联汽车行业深度分析报告
- 广投智慧服务集团招聘笔试题库2026
- 结构构件焊接质量监督方案
- 医疗器械使用安全评估制度
- (2025年)事业单位遴选考试真题及答案
- 孕产期抑郁症的识别与处理
- 2026年国电南瑞行测笔试题库
评论
0/150
提交评论