基于Flask框架实现的小区物业管理平台

近年来,随着人们生活水平的提高,人们逐渐向城市迁移,因此,与城市社区建设相关的企业渐渐走进人们的视野,尤其是小区物业已经成为一个小区必不可少的一部分。利用互联网实现小区物业的管理,可以让小区用户随时随地查询自家的物业情况,为小区居民带来了巨大的便利。

小区物业管理平台可以针对使用对象分别为物业公司和普通居民带来方便。普通居民可以在平台上查询自家的信息的同时,在平台上还能发表一些文章,加强与其他居民之间的交流,或者向物业中心提一些意见;同时,用户还可以通过该平台和家中的一些设备通过传感器连接起来,比如:电表、水表、室内温度、室内湿度等等,达到随时随地了解自家情况的目的。而且,用户还可以对指定传感器值的范围进行设置,当上传的数据不在设置的特定的范围时,就会生成报警信息,并且发送到报警板块中,以方便用户查看。

而物业公司则可以通过该平台对用户的设备、发表的文章及评论进行管理,对平台中不良的文章和评论可以选择更改或删除,净化平台环境;

并且其还可以通过此平台及时接收用户的反馈,不仅省时省力,还能为居民创造一个良好的交流环境。

由此可见,这个平台的存在,无论是对物业公司,还是对居民本身,都是拥有巨大好处的,方便了双方之间的沟通,还节省了双方的精力,为更好的创建一个和谐且令人满意的小区迈出了坚实的一步。

1绪论

1.1研究目的

随着社会的发展,人们生活水平的提高,城市化成为大趋势,到城市居住逐渐成为人们的选择。但是,城市里不像农村生活,邻里之间亲如兄弟,互帮互助。陌生的环境,陌生的人群以及邻里之间不同的作息时间,导致了部分居民就算对门生活了几年,依旧相互不认识,居民之间极度缺乏沟通。

随着房地产的发展,小区物业行业也逐渐兴起,并在小区建设中起到了越来越重要的作用,甚至好多人买房子首先看的就是物业。物业公司主要是与小区开发商签订协议,通过下派成员的形式对小区住房及其相关场地与设施进行管理,同时对小区内的环境情况进行定期打扫,对公共设施进行定期维护,对社区安全进行长期保障。通过这些服务,物业公司能够为居民提供良好的住户体验,甚至在一定程度上能够影响该小区住房在之后的升值情况。

但是物业针对的是小区整体 ,对于单独住户缺乏关注,对小区居民之间的沟通不能起到促进作用。为解决这种现状,现如今我们开发了一种新型的小区物业管理平台,以便于小区居民之间的沟通与交流,促进小区文明的建设。

1.2国外研究现状

现如今国外的物业管理偏向于专业化,国内公民下想要成为一名物业管理阶层的一员,需要具备考到过专业证件、接受过正式的教育和经历过专业的培训这三个条件,并且在政府、相关机构和一些企业的推动下执行,其分工如下:

政府在这三个机构中充当了监察者的身份,对相关人员的证件进行检查,并对不合法的人员进行处罚;同时,政府还会通过测试的方式对这些相关人员予以区别,对通过测试的人员发放证书并具有效益。

相关机构扮演了一名认证者的身份,这些机构一般都是制定了一系列的标准,像拥有于 物业相关的知识,并且接受过被人们普遍认可的培训等等严苛的审核后才能取得会员资格。之后这些机构就会定期为所属会员提供专业职能所需的知识与训练。

企业方面,由地区的领导业者或国际性的物业管理公司,配合企业的发展策略,在企业内挑选具有发展潜力的人员进行培养。

1.3 国内研究现状

我国的物业行业起始于1981年,那时我国的第一家物业公司在深圳建成实行统一收费,全面管理服务,独立核算,靠企业自身经营运转的商品化房管体制。从1981年到1994年,可以算是物业管理行业的探索和起步阶段。到了21世纪,随着物业管理相关法律的颁布,该行业正式进入法制规范的时期。

2010年之后,伴随着我国的地产规模不断增长,各地方以及中央开始意识到了发展物业经营的重要性,因此,政府开始出台政策,以鼓励物业公司的发展。到了2014年,我国对物业服务的价格进行了制定,以防止乱收费的情况产生。同一年,“彩生活”在香港正式上市,成为了我国第一个上市的物业公司。其业务范围从一个房地产开发的附带产物,到独立经营,为居民提供其他的多元服务,市场化程度提升的方向发展。截止到2017年9月30日,我国已有5家企业香港主板上市。

我国的物业管理行业到目前为止虽然已经拥有30多年的发展,但是我认为还是存在一些问题,国家对该行业的相关政策还不够完善,法律法规还不够健全,行业内存在一些乱收费并且不办事的情况。同时,由于政策保护不够到位,该行业存在较大的风险,企业的收益可能面临入不敷出的局面。这种情况需要市场与企业慢慢磨合,逐渐达到双方都能接受的临界点,不能急于求成。

伴随着行业规模的扩大,物业行业在规范和服务价格方面逐渐达成统一,不同的服务标准对应不同的价格层次。而社区物业逐步完善的外部驱动因素主要体现在两个方面,即互联网的快速发展与房地产存量积压时代的驱动。现如今互联网逐渐向人们生活的方方面面渗透,不可避免的就包含物业领域;房地产行业不再像前几年那样远远达不到人们的需求量,现如今的状况是,大量楼盘存在积压的情况,因此,物业服务是吸引人们购买欲望,增加楼盘销量的关键所在。“互联网+”及房地产进入存量时代双重驱动下,社区物业的价值凸显。

1.4预期目标

本小区物业管理平台主要针对于改善小区居民之间的关系,加强居民间的沟通与交流,促进和谐、幸福社区的构建。

本文的主要工作是对小区物业管理平台的设计和实现进行详细介绍。小区物业管理平台的角色组成,主要分为游客、普通用户、管理员三个角色。游客只能浏览主页及新闻,不能进行和身份相关的操作,比如:发表新闻、对他人发表的新闻进行评价、登录个人中心,查看他人的基本信息等;普通用户在拥有发表新闻、评论新闻、登录个人主页的功能以外,还具有关注他人的权限;管理员用户不仅拥有普通用户的所有权限,还可以对普通用户发布的新闻和相关的评论进行统一管理,可以根据实际情况对这些新闻和相关评论进行删除和修改。

经过对需求的深层挖掘,结合课题的背景和研究意义,充分评估了该项目开发和研究的必要性和可行性。我们采用了是数学建模、面向对象等多种思想,旨在使开发过程和论文架构尽量直观明了。小区管理平台的主框架采用的是Flask,主要考虑到Flask是一个轻量级Web应用框架[1],使用简单,易操作。Flask没有默认的数据库和复杂的系统架构,然而,Flask框架保留了较强的扩展性,利用Python强大的第三方库[2],不仅使项目开发变得简单,还大大减少了项目的内存体积,因此,Flask框架成为了许多中小型企业的不二选择。该平台的系统数据存储采用了MYSQL数据库[3],主要是利用其体积小、速度快、成本低的特点,这些可以很大程度上提升数据访问的速度。

2平台的总体设计

2.1开发环境介绍

2.1.1开发软件——pycharm

PyCharm软件是一种Python编辑器[4]内部工具十分完善,可以帮助用户在开发时大大提高开发效率,尤其在调试、项目管理、代码高亮设置、自动补齐等方面,为用户带来了巨大的便利,节省了较多的时间。

该软件的主界面包含4个主要区分,分别为菜单工具栏、项目结构区、代码区、信息显示区,如下图1

图1  主界面

要想在pycharm中创建一个新的项目,最起码需要做到以下两步:

第一步,找到“Create New Project”或“new Projiect”并选择,如图2;

图2  创建项目

第二步,在Location路径中输入新建的项目的存在路径及其名称,然后点击界面右下角的“create”,如图3。

图3  项目路径

通过该软件若要想创建一个python格式的文件,需要执行以下步骤:

首先,在菜单栏找到“File”选项,单击鼠标右键,找到“New”选项中的“Python File”选项,如图4;

图4  创建文件

然后,在New Python file窗口中输入文件名(文件后缀系统会自动补齐),并单击“ok”按钮,如图5。

图5  文件名称

如果想要查看电脑中的项目,可以按照以下步骤执行:

步骤一:在主界面中的菜单栏找到“File”选项,并选择“File”菜单中的“Open”选项,如图6;

图6  打开项目

步骤二:在弹出的窗口中找到想要打开的项目名称,并单击“OK”按钮,如图7;

图7  查找项目路径

步骤三:在Open Project窗口中会跳出两个选项,可以选择其一,并单击“OK”按钮。如果选择第二个选项,系统会在现有的窗口中打开该项目,如图8;而选择第一个选项,系统则会在一个新的窗口中打开该项目,并且不会对当前的窗口产生任何变化,如图9。

图8  当前窗口                   图9  新窗口

2.1.2数据库——MySQL

MySQL是一种开放源代码的关系型数据库[6]管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。

因为这个数据库是开放源代码的,所以谁都可以在拥有通用公共许可证[7]情况下下载且个人还能够根据自身需要对此数据库进行对应的改动

此数据库不仅其速度快,而且可靠性较强,同时它的适应性也是比较拔尖的因此许多人在对数据管理没有较强要求的时候,此种数据库往往是人们最好的选择。

MySQL数据库常用命令:

当我们不知道现有的数据库到底有哪些的时候,我们可以敲击这些代码命令来查询——show databases;

当我们对项目进行调试时,我们需要连接指定的数据库,这时我们就需要创建一个拥有特定名称的数据库,比如db1——create database db1;

当然,有时我们会感觉某个数据库是多余的,实际情况下是用不到的,因此我们会把它删除掉,比如去除db1——drop database db1;

使用数据库:use db1;

在实际情况下,数据库就像一个文件夹,它是间接管理我们的数据的,正常情况下,我们会把文字内容写到一个文件中,然后才放到文件夹中统一存储,因此我们需要一个类似文件的东西来储存数据,由此,数据表诞生了。create table tb1;其中tb1代指数据表名称,并且在添加数据表之前,必须首先指明使用的是哪一个数据库,要不然系统会报错。

与库类似,当我们不清楚具体有哪些表单时,我们可以执行对应的命令——show tables;

描述数据表的结构:desc tb1;

当我们不需要具体的某个表达时,我们可以通过执行相应的命令来达到目的,比如去除tb1:drop table tb1;

在具体的应用过程中,往往只查询某个表时不够的,还要对表内的数据进行分析,因此我们可以执行查看表全部内容的命令——select * from tb1;

向数据表中指定列名中插入值:insert into tb1 (第1列,第2列,第3列,...) values (值1,值2,值3,...);

在某些时候,在数据存在错误,并且在程序中不方便更改时,我们需要通过后台操作,直接在数据表中的某对象相应列的具体数值进行更改,比如我想找到第1列数值等于3的这个对象,并把它第2列的数值换成5——update tb1 set 第2列= 5 where 第1列 = 3;

既然存在更改具体数据的情况,那必然也存在某一行数据多余的情况,这个时候为了降低内存,我们会选择把没用的数据清除掉,比如我想删掉dang这列数值等于32的对象:delete from tb1 where dang =32;

在本平台中,根据功能需要,我们建立了8个数据表单,分别是alerts、comments、datas、devices、news、roles、sensors、users这八个,其具体字段介绍如下:

表1   alerts 

字段名称                 类型               描述

   id                   integer            报警信息编号

data_id                integer            传感器上传数据的外键 

sensor_id             integer            传感器外键

current_max           Float             报警信息的最大值

current_min           Float             报警信息的最小值

timestamp            DateTime          当前时间

renson               String             报警原因

2   datas

字段名称                 类型               描述

   id                   integer            传感器数据信息编号

data                  Float              数据内容 

timestamp             DateTime          数据上传时间

sensor_id              integer            数据对应传感器编号

alerts                 String             报警信息

3   comments

字段名称                 类型               描述

   id                   integer            评论信息编号

body                  Text              评论内容 

timestamp             DateTime          评论时间

news_id               integer            评论的新闻编号

user_id                integer            评论的用户编号

4   devices

字段名称                 类型               描述

   id                   integer             设备编号

name                  Text              设备名称 

timestamp             DateTime          设备创建时间

describe               Text               设备描述

user_id                integer            设备对应的用户编号

location               String              设备位置

sensors                integer             设备对应的传感器

5   news

字段名称                 类型               描述

   id                   integer            新闻编号

body                  Text              新闻内容 

timestamp             DateTime          新闻发布时间

title                   String             新闻题目

user_id                integer            新闻对应的用户编号

private                Boolean            是否私有

Comments             integer             新闻的评论

6   roles

字段名称                 类型               描述

   id                   integer             角色编号

name                  String             角色名称 

permissions            integer             角色权限

default                Boolean           是否是默认权限

users                  integer            拥有此权限的用户

7   sensors

字段名称                 类型               描述

   id                   Integer             传感器编号

name                 String              传感器名称

timestamp             DateTime           传感器创建时间

describe               Text               对传感器的描述

unit                   String              传感器的单位

max                   Float               最大值

min                   Float               最小值

device_id              integer              对用设备编号

 8   users

字段名称                 类型               描述

   id                   integer            用户编号

name                 String             用户姓名 

email                 String             邮箱

confirmed             Boolean           是否验证

about_me              Text              关于自己

password_hash         String             哈希加密后的密码

register_time           DataTime          注册时间

access_time            DataTime          最后一次登录时间

role_id                integer            用户角色

API_KEY              String             API值

location                String            位置

devices                integer            设备

news                  integer            发表的新闻

comments              integer            发表的评论

2.2平台的功能设计

平台的总体功能设计是一个项目的总体框图,它包含了平台的所有功能及客户的所有需求,通过它,我们可以对平台总体做出规划和设计,平台的总体功能设计的好坏将直接影响整个项目,对项目的整体研发起着指导性的作用,在这个项目中的前后端设计,我们都是经过反复推敲,反复对比验证才最终确定下来的,通过前后端的结合,最终共同时实现平台的基本功能。

基于Flask框架[8]实现的小区物业管理平台主要实现了对小区物业的管理,用户通过在平台上注册账号信息,可以在平台上查看自家的物业情况及具体信息,并且通过此平台,用户可以向物业公司对小区管理的不足之处或者社区内公共设施的损坏情况做出反馈。由此可以看出,此平台能够很好的加深小区居民与物业公司及居民与居民之间的交流,而且,通过这个平台,物业公司可以更好的接收居民的反馈,更有利于小区的管理和文明和谐社区的构建。

2.3平台的整体设计

基于Flask框架实现的小区物业管理平台主要实现了对小区物业的管理,在整体布局上,主要分为主页、论坛、设备、报警、管理中心、用户信息等六大板块,在六大板块中有细分为各个小的模块,分别实现具体的功能。同时,该系统和MySQL数据库实现同步连接,把用户信息随时上传到数据库中,以确保用户信息的正确性,如图10

            

图10  整体设计

参照上面的图表内容,我们对各个板块进行介绍:

主页作为该平台的主界面,就好比一个人的脸面,它起到一个自我介绍的作用,可见,该界面的主要功能是对小区的自我介绍,通过展示小区的一些美丽图片来加深居民对小区的认知,同时,该界面还有小区物业的具体信息以及联系方式(如:地址,电话,邮箱,微博等),方便居民能够及时联系,如图11

图11  主页

论坛作为该平台的一个主要板块,是平台功能实现必不可少的一部分,如图12。它是物业与居民及居民与居民之间沟通交流的一个重要枢纽,起到一个桥梁的作用。在该板块中,居民可以发布一些新闻趣事,或者对别人发布的话题参与讨论,很好的促进了居民之间的交流与联系;在该板快中,居民可以对社区内损坏的公共设施对物业进行反馈,以达到及时报修的目的;同时,物业也可以利用该平台提前对小区近期停水、停电情况进行通知,省时省力,十分高效。

图12  论坛

设备板块[9]作为该平台的最基本且最具特色的功能,不可不提,如图13。由于该板块涉及到硬件部分对传感器的使用,因此,我们采用了数据模拟的形式,但具体功能不受影响,该板块通过数据接口,每个一段时间就会接受传感器上传的数据,然后在对应页面上呈现出来。该传感器对应自身情况而定,可以是水表数据查看、电表数据查看、屋内空气湿度查看等等,通过该平台就能够查看自家的设备情况,简单、方便。

图13  设备

报警板块作为设备板块的附属板块,它和设备中传感器获取的数据信息密不可分,在传感器具体信息的设置中,有一项是设定传感器数值[10]的最大值与最小值,而报警板块的功能就是:当从传感器接收到的数值比我们设定的最大值还要大的时候,平台就会给用户发送警示信息到报警板块中,比最小值还小时同样如此,如图14。所以说该功能很实用,而作为设备板块的附属板块[11],之所以独立出来,是为了更醒目,同时也为了用户更方便查看。

图14  报警

管理中心板块作为一个特殊板块,它不是针对于小区居民,在权限划分中,身为普通用户的小区居民权限是不够的,因此,小区居民注册的账号登陆后,在主界面上是找不到管理中心这个板块的。该板块是服务于物业中心的。当权限为admin时,登录账号,打开管理中心,如图15,在界面上呈现出来的是所有注册该平台的账号,并且在每个账号的后面有许多可执行的操作,分别是编辑、设备、博客和删除,功能详情如下:

编辑可以更改用户的基础信息和账户权限[12]

设备则能够查询用户的设备信息;

博客则是可以查询用户发表的文章或者评论,并对这些文章或者评论拥有更改和删除权限;

删除功能就像字面理解的那样,可以删除用户的账号。

因此,在对账号赋予权限时,我们会慎重对待,并时时监督,以确保用户信息的安全性,以给予居民更好的用户体验。

图15  管理中心

用户信息板块也是该平台的一个重要板块,用户在此板块中,可以查看自己的基础信息,并可以对此信息进行更改,而且,在此板块中,用户还能够查看自己在论坛上发表的文章及其他居民对该文章的评论,如图16

图16  用户信息

2.4平台的软件构成

基于Flask框架实现的小区物业管理平台的软件部分,主要分为两部分,即前端页面与后端功能。而后端部分,我们又按照用户权限及具体功能主要划分为四个蓝本,分别为:api1_0蓝本、auth蓝本、main蓝本、manager蓝本,如图17。具体分工如下:

api1_0蓝本对应的是数据接收模块[13],主要负责接收传感器传递的数据,并对数据进行处理和判断;

auth蓝本对应的是账号的注册、邮箱验证、登录、注销等功能的实现;

main蓝本是该软件最重要的组成部分,通过对权限的具体划分中,普通用户针对的对象就是这个部分,该部分包含了普通用户可执行的所有功能,即整体布局中主页、论坛、设备、报警、用户信息这五个重要板块都和它密不可分;

manager蓝本对应的是整体布局中的管理中心这个板块的实现,在该板块中拥有的编辑、设备、博客、删除等功能都是在这个蓝本中编写的;在权限的划分中,如果说普通用户对应的功能是main蓝本,那么,admin权限对应的功能就是main蓝本和manager蓝本的综合。

图17  软件构成

2.5本章小结

本章先是从该平台的的开发环境入手,并着手介绍了开发软件和数据库应用这两方面,因为我们只有了解了项目的开发环境,我们才能更好的接触、理解这个项目。并且在编写代码前,先对项目的功能进行设计,明确具体有哪些功能,这是属于后端部分,然后对整体结构进行划分,就是把所有功能进行归类具体的划分出几个部分,这个是属于前端部分,最后的软件构成则是属于前后端结合[14],同时还根据用户权限的不同,把不同权限可执行的功能归类到不同的蓝本中,再对蓝本代码进行细化编写,这样思路就比较清晰了。

3平台前端部分

前端部分和后端程序紧密相连,谁也离不开谁,后端负责平台功能的实现,而前端则负责页面的渲染。为了美观,我们通常对前端界面进行排版布局,提前设置对应按钮,并与后端的路由连接,实现程序的正常运行。因此,前端页面是一种可塑性很强的界面,在功能不变的情况下,我们可以按照自己的审美观念随意进行设计。

当然,前端语言有很多,通常的有html、php等等,在本平台中,我们运用的是bootstrap语言[15],通过其内的前端框架来达到快速建表的效果,虽然在美观方面有所不足,但是在功能的实现方面没有任何的影响,并且因为使用内部框架的原因,减少了代码量,提高了编写效率。

在本平台中,前端页面包括普通路由页面和一些特殊的页面,下面对程序中一些特殊的前端页面进行详细介绍。

3.1 base.html

该模板又叫做基模板,一个正常的前端页面,包含了三部分:头部(如图18)、主体、尾部(如图19),因为是一个平台,所以正常情况下,所有的前端页面的头部和尾部内容是一样的,改变的只是中间的主体部分,但是由于前端页面比较多,比较费时费力,在此种情况下,基模板的概念就诞生了。

图18  基模板头部内容

图19  基模板尾部内容

在基模板中,我们只需要把页面的头部和尾部代码写出来,而主体部分则是构建一个空的框架,而别的前端界面则采用继承的方式{% extends base.html %},通过简单的代码继承基模板[16]的内容,至于网页的主体部分则采用重写的方式来完成,这样,平台的前端界面头部和尾部就能够达到统一。重写命令如下:

{% block page_content %}

在这里写入重写的主体部分

{% endblock %}

3.2 403.html

403界面的单纯的就代码而言,非常普通,之所以拿出来在这里单独介绍,是因为出现这个界面时的含义,403这个状态码[17]是我们在网站访问过程中,一种常见的错误提示,它表示所跳转的资源不可用,如图20。在向服务器提交的请求中,服务器接收到了,但是却拒绝处理。它通常是由于服务器上的某些文件或目录的权限设置存在问题而导致的网站访问错误。

图20  403界面内容

3.3 404.html

该界面同403.html界面一样,重要的不是代码本身,而是出现这个界面时,程序运行所面临的一个小错误,404错误通常指用户发出请求,但是所请求的内容由于某些原因,根本就不存在,或者服务器找不到,换而言之,就是用户请求一个错误的路由,系统返回的页面,如图21。该错误通常是发生在网站上的问题,当我们把某个页面的路由换成其它的内容,或者直接把它删掉,这个时候就会出现这个错误。当然,如果用户把页面地址输入错误后,也会得到404这个错误页面。

图21  404界面内容

3.4 500.html

出现该界面的情况与上面两种情况存在这本质的不同,当出现403和404这两种错误状态时,说明问题是存在于客户端的,而500这种情况则是服务器出现了问题,其在处理我们发出的请求时内部发生了错误,并且这些错误和我们毫不相关,是它自身存在的问题,如图22

图22  500界面内容

3.5 本章小结

前端页面就像一个人的脸面,一个网站前端页面的样子往往关系到用户对该网站的第一印象,漂亮的前端页面往往给人一种神秘且高大尚的感觉。在本项目中,我们为了代码的简洁,采用的是bootstrap语言,因此页面提体验感稍稍有点差。并在本章中,特意针对本项目中的一些特殊页面进行了介绍。尤其是基模板base.html是重中之重,并针对http协议[18]中的一些错误状态进行了介绍,这些错误状态总结起来就是:在http请求3位的返回码中,4开头的代表客户错误,5开头代表服务器端错误。

4平台的功能介绍——蓝本

什么叫做蓝本,即将视图方法模块化,在我们编写程序时,按照正常方式的话,我们会把所有的视图函数编写到一个文件中,这种情况,如果是针对功能比较少的程序时,是比较简单,也比较方便的,但是,当程序中的功能较多时,我们还把所有的视图函数编写到一个文件中时,我们就会感到比较混乱,当对某个视图函数进行修改时,就会不容易查找;同时还有一个最重要的原因,当所有的视图函数在同一个文件中,一旦涉及到用户权限的划分,就会有一种无从下手的感觉,非常麻烦。因此,最好的方法就是事先按照功能或者权限的不同,把不同功能的视图函数(路由)写到不同的文件中,同时,又能确保这些文件能够连接起来。由此,蓝本这个概念诞生了。

通过上述的介绍,你是否已经对蓝本这个概念有了较为清晰的理解,简单来说,就是把一个比较复杂的任务按照一定的规则划分为几部分,每一个部分都是一个蓝本。因此,最后我们肯定会在一个文件中把这些独立起来的蓝本连接起来。

创建蓝本最基本的要完成以下几个步骤:

想要使用某个库,我们首先要明确最基本的对象,需要导入内容;

from flask import Blueprint

在拥有蓝本库的基础上,我们需要调用这个库,并把它实例化,比如创建一个yue蓝本;

auth = Blueprint(yue’,__name__)

在蓝本文件中添加视图函数

在最终的文件中注册蓝本,汇总所有的视图函数

注:注册时也可以指定路由前缀,而且优先级比创建时的高

        from .yue import yue

app.register_blueprint(yue, url_prefix='/yue')

下面是该项目的目录信息,如图23

图23  项目蓝本目录

4.1 auth蓝本

该蓝本是作为整个平台程序的第一部分,其负责的视图函数是平台中最基本但却是最重要的账号注册、邮件验证、登录、注销等功能。

在auth文件夹下的__init__.py的文件中创建蓝本,并在app文件夹下的__init__.py中注册蓝本,为使代码读取时更加清晰,因此,我们把该蓝本的视图函数编写在了auth文件夹下的views.py中。

作为一个平台,用户是一切功能的前提,因此注册帐号和登录账号是重中之重。在视图函数register中,首先我们把表单RegisterForm实例化,该表单内容都是用户注册的信息,包含Email、name、password、role。同时为确保用户的安全性,注册过程中有一个邮箱验证的过程,该过程是通过导入flask_mail中的Message库实现的。当用户在注册页面填写完信息并点击提交后,程序执行if form.validate_on_submit()语句下的内容,即把表单中的信息保存在数据库中,并向注册邮箱中传递一个token,当用户邮箱验证成功后,则返回该token,并在数据库中该用户对应的confirm列标注“1”,表示验证成功,否则就是“0”。只有验证成功的用户才拥有普通用户的权限,可以进行相关的操作,相反则不行。

当用户执行登录操作时,如图24,程序会执行视图函数login,即实例化登录表单LoginForm,当用户提交信息后,程序会根据用户所填的邮箱名在数据库中查询该用户的信息,并与所填登录密码进行匹配,匹配不成功,则显示密码或用户名错误;若密码正确,则利用导入的flask_login中的login_user库,执行login_user(user),保存该用户的登录状态,并跳转到用户信息页面。

图24  登录

想要实现注销功能只需要直接调用logout_user库即可,在视图函数中执行代码login_user(),然后把路由重定向到初始页面即可,如图25。在这里,我们对注销功能可以单纯的理解为取消登录状态,因为当不能确定用户的登录状态后,程序就不能确定用户的信息及权限。

图25  注销

4.2 main蓝本

main蓝本是本程序中最重要的一个蓝本,平台中的大部分功能都是在该蓝本中实现的。其功能总体而言可以分为三个方面:

个人信息方面,可以查询及编辑用户自身的基本信息,如图26,包括:API-KEY(是通过serializer方式[19]将用户的id进行加密后得出的128位字符串)、个人介绍、位置、用户类型、邮箱、是否邮箱验证、注册时间及最后访问时间。

图26  编辑用户

论坛管理方面,登录后的用户可以用自己的身份发表文章或对他人发表的文章进行评论。细而言之,不同的用户有不同的权限。对于发表的文章,文章作者及超级管理员拥有编辑、评论及删除的权限,但其他普通用户却没有删除权限;评论方面,同样如此,如图27

图27  文章评论

设备管理方面,当点击主页面的“设备”选项时,页面就会自动跳转到自身的设备管理页面,在该页面,用户能够执行添加设备、编辑设备、删除设备、添加传感器、设备详情五个选项。详细描述的话,“编辑设备”包括设备名称、设备描述、设备位置这三点,具体内容可以根据自身的实际情况填写;执行“删除设备”这个功能时要慎重考虑,因为一台设备可能包含多个传感器,当执行该功能时,系统会把设备中传感器的信息一起删除;“设备详情”这个功能显而易见,就如字面描述一样,详细的介绍了该设备的基本信息及各个传感器,并且还有删除设备、添加传感器、统计该设备的传感器个数等功能,如图28。而关于传感器的功能又有删除传感器、编辑传感器、传感器数据,“编辑传感器”这个功能有点类似于“编辑设备”,只是编辑的内容不同,分为传感器名称、传感器描述、测量单位、最大值、最小值这五个方面,这些东西完全可以根据用户的自身状况随意设定;点击“传感器数据”选项,系统就会自动跳转到该传感器的页面,该页面不仅有该传感器的名称描述,还会以折线图与表格的形式把该传感器近期的数据呈现出来,非常直观清晰。

图28  设备详情

4.3 manager蓝本

manager蓝本作为一个单独针对于管理员的蓝本,其重要性可想而知。该蓝本内的所有功能均被作出限制,即视图函数上方添加@decorator_admin,规定只有角色role是admin的用户才有权限执行该视图函数。

该蓝本功能对应主界面上的“管理中心”板块,当点击“管理中心”选项时,程序会执行视图函数manager_all_users,并调用数据库,把数据库中的所有用户内容呈现出来,并且在每个用户名称的后面都对应四个可执行的按钮,分别为:编辑、设备、博客、删除,如图29,下面对这四个功能进行详细介绍:

图29  用户管理

编辑,该功能是管理员权限的一个较为直观的体现,当点击这个按钮时,相应路由就会自动重定向到“编辑个人资料”页面,该页面包含了用户的邮箱、昵称、密码、位置、签名、角色及邮箱激活这七种基本信息。这其中最重要、最具有针对性的是邮箱、密码、角色和邮箱激活。其它的信息由普通用户在自身权限范围内就能更换。下面列出了针对这四项基本信息的做出更改的具体情况:1)邮箱,普通用户的编辑页面是没有邮箱这个选项的,因此,当用户更换邮箱账号时,只能主动联系管理员,让其更改成指定邮箱账号;2)密码,当用户忘记登录密码时,需要联系管理员,让管理员重置账号密码,然后用户再自行更改成自己想要的密码;3)角色,即权限,不同的角色拥有不同的权限,在此位置,管理员能够把指定用户的角色更改成普通用户或者管理员;4)邮箱激活,有些用户注册账号了,但是没有进行邮箱验证,没有执行一些功能的权限,在此,管理员可以直接更改数据库信息,让该用户不必再进行邮箱验证。

设备,当点击此按钮后,网页自动跳转到该用户的设备板块,在此板块中,管理员可执行功能和普通用户本身一样,都具有对设备和传感器的添加、编辑、删除及查看功能。设置该功能一方面是对用户设备的管理,另一方面则是对传感器报警结果的核对(当用户出现报警信息时,管理员可以通过该功能将报警信息与用户传感器真实情况进行核对,若结果正确,则可以及时联系用户,以提高用户满意度)。

博客,该功能是管理员权限的一个比较重要的体现,其换言之,就是论坛板块,管理员通过该功能能够查看用户发表的文章及对应的评论,对其中不健康的言论进行更改或者删除,以确保论坛保持在一个积极乐观、健康向上的氛围中。

删除,点击该功能按钮,其执行后的结果是直接在数据库中删除该用户,同时,与该用户相对应的文章、评论、设备、传感器及其数据都会一同删除。因此,执行该功能前,管理员需要慎重考虑,在确认该用户不再使用的情况下才可执行,毕竟数据删除后不可恢复。

同时,考虑到小区用户较多的情况,要想特定查询某个用户较为困难,在该视图函数中又加入了搜索功能,从manager文件夹中的form.py中导入SearchForm表单,并在视图函数manager_all_users中将其实例化,当管理员在搜索框中输入想要查找的用户的邮箱账号并点击“搜索”按钮时,程序就会执行if 条件下的代码,即根据前端提交的邮箱账号自动匹配数据库,查询对应用户的账号信息,并重定向到该用户的个人信息中心;若不在搜索框内填写用户邮箱名称的话,则直接跳过if条件下的代码,自动调用数据库中的全部用过户,非常简单、方便。

4.4 api1_0蓝本

如果说main蓝本中设备功能是对传感器的管理,那么api1_0蓝本则是对传感器下数据的管理,它相当于传感器硬件设备与平台连接的一个接口,设备通过API-KEY连接,其中包含上传数据、下载传感器、下载数据等功能,并且对传感器连接过程中的一些常见错误的判断,遇到不同的错误,系统会以json格式呈现出不同的状态,比如:找不到设备、找不到传感器、找不到数据等情况,如图30

图30  下载数据

同时,该蓝本还有一个比较重要且实用的功能,还记得主界面的报警板块吗,就是它,当用户创建传感器,并对其最大值、最小值进行设置后,传感器上传的数据都会与设置的这两个值进行比较,当传入的数据比最大值还大或比最小值还小时,传感器就会发出警报并列出报警原因,非常方便。

4.5 本章小结

本章主要介绍了蓝本的概念,并通过蓝本描述了该平台所拥有的功能。根据用户权限,我们对平台中的功能进行划分,分别归类到auth、main、manager、api1_0这是个蓝本中,其中auth蓝本负责的是用户的注册、登录、注销等功能;main蓝本对应的是普通用户可执行的功能;manager蓝本针对的是拥有管理员权限的用户;api1_0蓝本这是传感器硬件设备平台软件之间的接口代码。

5测试部分

在正常的程序编写中,每当我们写完一个功能的相关代码,我们都会对程序进行测试,找出其中的bug,然后在原来代码的基础上进行修改,接着再对程序进行测试,如此反复,直至感觉完美为止。因此,可以说对程序的测试对一个项目而言至关重要。

5.1数据库迁移

若想对数据库进行测试,首先我们要在MySQL数据库中建立相关的数据库,然后对应项目文件里models.py中的数据模型进行进行建表,如果不怕麻烦且数据模型较少的话,当然可以在数据库中一步步手动建表,但是当数据模型较多时,手动建表则有些费时费力且准确性还低,这时我们可以使用数据库迁移[20]的方法来确保表单的正确性,并且还能节省我们的时间,下面对这种操作进行详细的介绍:

1.想要迁移数据库,我们必须从第三方库中查找到相应的库并成功导入;

2.在数据库中添加两条命令:

将用户对象和具体的数据库紧紧绑在一起,并将其实例化,这样当执行迁移命令时,用户信息就能够成功进行转移。

通过这行代码,我们可以在命令管理模块中添加一条叫作db的迁移命令。

3.在运行结果信息区执行入库迁移命令,在该部分命令分为三步:

这行代码的目的是创建数据库迁移需要的目录和脚本文件,即数据库初始化;

(2)

这一步的目的主要是统计程序中的数据模型和数据库中表之间的区别;

(3)

这一步主要是将上一步中统计到的区别更新到数据库中。

以上就是测试程序中,更新数据模型,迁移数据库需要执行的步骤。

5.2运行文件

数据库迁移成功后,按照常理,我们只需要在运行结果信息区执行python run.py runserver命令,程序就能运行起来,但是,在这种情况下创建的用户都没有权限,查看数据库发现创建的用户role这一列为空,这是因为数据库中没有role的种类,程序中角色种类是单独编写在run.py中的init函数里的,因此,在执行python run.py runserver命令前,我们需要先执行python run.py init在数据库中创建角色种类,这样,再运行起来的程序创建的用户就拥有普通用户的权限了。

5.3 本章小结

本章主要针对的是对小区物业管理平台这个项目的调试,首先,需要对应项目中的数据模型在数据库中建表,这里为了操作方便,用到了数据库迁移的知识,并对该知识点进行了较为详细的描述;然后,执行文件中定义的生成角色类的函数,在数据库中建立角色类的表;最后,运行该项目的run.py文件,在浏览器中登录该平台。

结论

城市在发展,紧随房地产的步伐,小区的物业管理也逐渐走进人们的视野,甚至物业管理的好坏程度直接关系到小区居民的去留,因此,为了方便物业公司对小区的管理,就有了如今这个平台的诞生。

本文主要对该平台进行总体描述。首先,结合物业公司的业务需要和小区居民的实际需求,制定了详细的需求说明,并把对功能的需求根据权限的不同分成了主页、论坛、设备、警报、管理中心、个人信息这六个大的板块。然后根据需求分析对系统进行概要设计,这部分主要包括开发环境设计、平台的功能设计、平台的整体结构和平台的软件构成。接下来,对平台的程序功能进行具体描述,该部分主要描述的内容可分为两个部分:前端部分和后端部分,在前端部分中,我们主要介绍了四个特殊的前端页面,尤其是对基模板进行了较为详细的描述,而后端部分中,则讲述了我们根据权限划分的四个蓝本,并对每个蓝本中的功能进行了详细介绍。最后,对系统的实现和测试进行简要的描述,并把测试步骤分为两部分:数据库迁移部分和运行文件部分,且列出了各部分执行时的详细代码及对应的注释。该小区物业管理平台功能齐全,基本上可以投入到实际小区中进行正常使用,为小区居民带来便利。但同时,该小区物业管理平台也存在一些不足,前端页面是由bootstrap语言来完成的,页面较为简洁,不是太美观。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源码空间站11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值