基于Python的IT设备管理系统
近年来,越来越多的企事业单位把业务迁移到Web上完成,随之而来的是数据量的爆炸式增长。数据信息的繁杂,必然要求一个有序的管理系统,而数据库则是管理大量信息最有效的方式,用户通过WEB向服务端程序递交查询请求,服务端程序在数据库中检索,将结果生成的页面展现在用户面前,直观而有效。如何让系统提供安全、稳定、高效的服务,无疑是Web应用系统开发人员必须再三思考的问题,因为这关系到用户的体验,进而关系到系统的成败。
本文以基于Python的IT设备管理系统为例,使用Flask框架,结合MySQL
数据库,针对管理系统登录功能、查询功能、信息分页显示功能等,展开研究,进而采用合理的技术,以达到对IT设备查询,增加,修改和删除的目的。
RBAC
(Role Based Access Control,基于角色的访问控制)通过建立“权限<->角色”的关联实现将权限赋予给角色,并通过建立“角色<->用户”的关联实现为用户指定角色,从而使用户获得相应角色所具有的权限。RBAC
的基本思想就是给用户指定角色,这些角色中定义了允许用户操作哪些系统功能以及资源对象。由于权限与用户的分离,
RBAC
具有以下优势:· 管理员不需要针对用户去逐一指定权限,只需要预先定义具有相应权限的角色,再将角色赋予用户即可。因此
RBAC
更能适应用户的变化,提高了用户权限分配的灵活性。· 由于角色与用户的关系常常会发生变化,但是角色和权限的关系相对稳定,因此利用这种稳定的关联可减小用户授权管理的复杂性,降低管理开销。
系统流程:用户注册,分配默认角色(注册用户),登录,按类别查询,按部门查询,按存放位置查询,模糊查询,修改用户信息,修改密码,忘记密码(系统发送邮件到用户邮箱),修改用户角色(需要管理员审核)为管理员,管理员对数据增加,修改,删除。
初始数据:数据库角色表添加用户和管理员两个角色,类别表添加各个类别,部门表添加各个部门,位置表添加各个存放位置。
目录结构:
MySQL
数据库
信息管理是一项复杂、系统的工作,需要加强对各种信息管理技术的应用,而计算机数据库技术在信息管理方面发挥着重要的作用。数据库技术适于对大量的数据进行组织管理,Web技术拥有较好的信息发布途径,这两种技术天然的互补性,决定其相互融合成为技术发展的必然趋势。将Web技术与数据库技术相结合,开发动态的Web数据库应用,已成为当今Web技术研究的热点所在。MySQL
数据库功能强大、处理速度快、占用资源小、跨平台、安全性好、运行稳定可靠,已被全世界范围各领域用户广泛应用,另外支持它的资源极其丰富如各种库、可视管理工具等。
数据库表
数据库设计是系统开发中非常重要的一个环节,之所以强调数据库的重要性,是因为数据库设计就像在建设高楼大厦的根基一样,如果设计不好,在后来的系统维护、变更和功能扩充时,将会引起比较大的问题,大量工作将会重新进行。通过分析系统功能,再结合IT办公设备,可以建立以下几个表。
办公设备表:设备名称,规格型号,主要参数,IP地址,使用人,所属类别,所属部门,存放位置,设备编号,设备状态,购买日期,购买成本
部门表:部门名称,部门负责人
类别表:类别名称
位置表:位置名称
用户表:用户名,密码,邮箱
角色表:角色名
数据库E-R图
根据数据库表中的实体和它们之间的关系,可以画出E-R图。
设备:
用户:
数据库模型类
如果使用原生SQL
的方式来操作数据库,随着项目代码量的提升会发现有大量操作数据库的冗余代码,以及大量SQL
语句与逻辑代码杂糅在一起不利于核心代码的读写,并且SQL
语句的利用率不高。当更换数据库产品时有些特定SQL
语句需要重写,而使用ORM
框架能很好的避免上述问题。ORM
(Object Relational Mapping),叫作对象关系映射,它把一个类映射成数据库里的一张表,而属性映射成数据库表的列,每一个实例对象对应数据库表里的一行数据。通过它我们可以直接使用面向对象的方式来编写程序,而不再直接书写原生的SQL
语句,而且大部分ORM
框架支持多种数据库,只需很少的配置即可完成数据库产品的更换。
在Python中,最有名的ORM
框架是SQLAlchemy
。 而在Flask框架中可以使用Flask-SQLAlchemy
,Flask-SQLAlchemy
是为了简化SQLAlchemy
进行的封装。
设备模型类:
# office/models.py
from ..exts import db
# 部门和办公设备的关系 一个部门可以使用多个办公设备 一个办公设备只能被一个部门使用 一对多的关系
class Department(db.Model):
__tablename__ = "department"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False, index=True, unique=True)
leader = db.Column(db.String(10), nullable=False, index=True)
def __init__(self, name, leader):
self.name = name
self.leader = leader
def __repr__(self):
return "<Department(name:%s,leader:%s)>" % (self.name, self.leader)
# 类别和办公设备的关系 一个类别可以有多个办公设备 一个办公设备只能属于一个类别 一对多的关系
class Category(db.Model):
__tablename__ = "category"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False, index=True, unique=True)
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Category(name:%s)>" % (self.name)
# 存放位置和办公设备的关系 一对多的关系
class Location(db.Model):
__tablename__ = "location"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), nullable=False, index=True, unique=True)
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Location(name:%s)>" % (self.name)
class Equipment(db.Model):
__tablename__ = "equipment"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(10), nullable=False, index=True)
model = db.Column(db.String(20))
parameter = db.Column(db.String(30))
user = db.Column(db.String(30))
IPaddress = db.Column(db.String(20))
asset_number = db.Column(db.String(20), nullable=False, unique=True)
asset_status = db.Column(db.Enum("在用", "闲置", "报废", "转移"), nullable=False)
purchase_date = db.Column(db.Date)
purchase_cost = db.Column(db.Float)
department_id = db.Column(db.Integer, db.ForeignKey(
'department.id'), nullable=False)
category_id = db.Column(db.Integer, db.ForeignKey(
'category.id'), nullable=False)
location_id = db.Column(db.Integer, db.ForeignKey(
'location.id'), nullable=False)
department = db.relationship("Department", backref="equipments")
category = db.relationship("Category", backref="equipments")
location = db.relationship("Location", backref="equipments")
def __init__(self, name, asset_number, asset_status, department_id, category_id, location_id):
self.name = name
self.asset_number = asset_number
self.asset_status = asset_status
self.department_id = department_id
self.category_id = category_id
self.location_id = location_id
def __repr__(self):
return "<Equipment(name:%s,asset_number:%s,asset_status:%s)>" % (self.name, self.asset_number, self.asset_status)
用户模型类:
# user/models.py
from ..exts import db
from flask_login import UserMixin
# mysql 日期设置默认值必须使用timestamp类型
from sqlalchemy.sql.sqltypes import TIMESTAMP
from sqlalchemy.sql import func
class User(db.Model, UserMixin):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(18), nullable=False, unique=True)
password = db.Column(db.String(64), nullable=False)
email = db.Column(db.String(60), nullable=False)
create_time = db.Column(
TIMESTAMP, server_default=func.now(), nullable=False)
role_id = db.Column(db.Integer, db.ForeignKey(
'role.id'), nullable=False, default=1)
role = db.relationship("Role", backref="users")
def __init__(self, username, password, email):
self.username = username
self.password = password
self.email = email
def __repr__(self):
return "<User(username: %s,email:%s,role:%s)>" % (self.username, self.email,<