基于Python+SQLite实现(Web)验室设备管理系统

实验室设备管理系统

应用背景

为方便实验室进行设备管理,某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录,查看现有的所有设备, 增加设备等功能。

开发环境

  • Mac OS
  • PyCharm IDE
  • Python3
  • Flask(Web框架)
  • SQLite(数据库)

运行方法

准备
  1. 安装virtualenv: pip3 install virtualenv
  2. 创建虚拟环境: virtualenv venv
  3. 进虚拟环境: source venv/bin/activate
  4. 安装依赖的包: pip install -r requirements.txt
  5. 退出虚拟环境: deactivate
  1. 更新数据库: python app.py db upgrade
  2. 成户: python app.py init
  3. 运: python app.py runserver
初始管理员账户

邮箱:zhaowrenee@gmail.com

密码:666666

功能结构

  1. 登录:管理员可以通过输入预置的账号密码进行登录。
  2. 查看设备列表:管理员在登录成功后,应立即展示所有设备信息,设备 信息应包括设备 ID 号,设备名,实验室名,购置时间,购置人。
  3. 增加设备:增加设备时应输入设备名,实验室名,购置人等信息,设备 增加成功后自动返回系统分配的设备 ID 号,购置时间应为系统自动生成(默认为增加设备的时间)。
  4. [附加] 删除设备:管理员本人购置的设备具有顶级重要性,故不能被删除
  5. [附加] 搜索设备:输入关键词,显示名称中包含关键词的设备列表

另外保证:

  1. 对输入数据进行合法性验证,并进行友好提示。
  2. 对数据库中的密码字段加密处理。

提示

  • 设备 ID 号应保证唯一性。
  • 设备名可重复。

功能细节

一、UML图

1、活动图

app.py中function与templates中HTML件对应,展示在页中:

  • index() 通过 SearchForm 实现对户信息的检索和展示,并通过 index.html
  • add_device() 通过 UserForm 实现对新设备信息的添加,并调 add_device.html
  • remove_device(id) 通过id删除设备,但不能删除管理员添加的设备
  • login() 通过调 LoginForm 实现登录,并调 login.html 页登录,也是服务器提供的第个页
  • 其余function对应系列错误处理和必要但和数据库关功能
2、用例图
3、顺序图
4、类图
  • HTML使Flask-wtf Bootstrap渲染功能,使界更美观
  • app.Role为户设置的用户或者管理员角类,内部有条件角条件约束
  • app.User 户类
    • 记录户名、密码、id等信息,与数据库的属性进行交互
  • app.Device 设备类
    • 记录设备名、实验室、购置人、购置时间等信息,与数据库的属性进行交互
  • FlaskForm 信息表
    • 三种Form根据不同的操作需求,设定不同的Field
5、状态图

、基本表单的定义

表一:

|-----------|-------------|------------|---------------|----------|----|----|
| roles 身份表 | | | | | | |
| 名称 | 类型 | NOT NULL约束 | PRIMARY KEY约束 | UNIQUE约束 | 默认 | 外键 |
| id | INTEGER | √ | √ | | | |
| name | VARCHAR(64) | | | | | |

复制代码
CREATE TABLE roles (
	id INTEGER NOT NULL, 
	name VARCHAR(64), 
	PRIMARY KEY (id), 
	UNIQUE (name)
)

表中实体:

|--------|----------|
| id | name |
| 1 | User |
| 2 | Admin |

表二:

|---------------|--------------|------------|---------------|----------|----|-----------|
| users 用户表 | | | | | | |
| 名称 | 类型 | NOT NULL约束 | PRIMARY KEY约束 | UNIQUE约束 | 默认 | 外键 |
| id | INTEGER | √ | √ | | | |
| number | VARCHAR(128) | | | | | |
| username | VARCHAR(64) | | | | | |
| password_hash | VARCHAR(128) | | | | | |
| role_id | INTEGER | | | | | roles(id) |

复制代码
CREATE TABLE users (
	id INTEGER NOT NULL, 
	number VARCHAR(128), 
	username VARCHAR(64), 
	password_hash VARCHAR(128), 
	role_id INTEGER, 
	PRIMARY KEY (id), 
	UNIQUE (password_hash), 
	FOREIGN KEY(role_id) REFERENCES roles (id)
)

表中实体:

|----|-----------------------------------------------------------|----------|-----------------------------------------------------------------------------------------------|---------|
| id | number | username | password_hash | role_id |
| 1 | [email protected] | Admin | pbkdf2:sha256:50000V4ZV7KEr42b0a9825baa100fa800d0544632a1ad7d6130504ef6c397ecfa6b02ca99298d | 2 |
| 2 | [email protected] | 袁帅 | pbkdf2:sha256:50000 d1c334fe90415612c0d99301d45f3e5f9c3f482726cde598259d19ff1228c217 | 1 |
| 3 | [email protected] | 刘东 | pbkdf2:sha256:50000rNv7gYzZ381113b96a85934496fe06a2796893fb85689b71c373e97a5e4d9d3adfd5ef26 | 1 |
| 4 | [email protected] | 吴娟 | pbkdf2:sha256:50000cA7RmNVD7136167bd1c3163b0ec221638b8644f12f093f3450ecc4f631c72840e26f31f3 | 1 |
| 5 | [email protected] | 刘玉珍 | pbkdf2:sha256:50000hSqUMhqa5dd222a191f376127e3dceb8244310cc7114dcceaa2d3bc5fa585a9429f66a02 | 1 |

表三:

|---------------|-------------|------------|---------------|----------|----|-----------|
| devices 设备表 | | | | | | |
| 名称 | 类型 | NOT NULL约束 | PRIMARY KEY约束 | UNIQUE约束 | 默认 | 外键 |
| id | INTEGER | √ | √ | | | |
| device_id | VARCHAR(64) | | | | | |
| lab | VARCHAR(64) | | | | | |
| name | VARCHAR(64) | | | | | |
| password_hash | DATETIME | | | | | |
| user_id | VARCHAR(64) | | | | | users(id) |

复制代码
CREATE TABLE devices (
	id INTEGER NOT NULL, 
	lab VARCHAR(64), 
	name VARCHAR(64), 
	time DATETIME, 
	user_id VARCHAR(64), 
	PRIMARY KEY (id), 
	FOREIGN KEY(user_id) REFERENCES users (id)
)

表中实体:

|----|-------------|-----------|----------|----------------------------|---------|
| id | device_id | lab | name | time | user_id |
| 2 | 2020-QS-002 | 趋势传媒实验室 | 专业VR镜头 | 2020-03-31 22:12:17.000000 | 6 |
| 3 | 2020-LY-003 | 凌云科技实验室 | 专业VR镜头 | 2020-03-15 02:36:25.000000 | 6 |
| 4 | 2020-MX-004 | 盟新传媒实验室 | 联想启天2100 | 2020-03-16 23:44:42.000000 | 1 |
| 5 | 2020-CH-005 | 创汇网络实验室 | DSP实验箱 | 2020-01-17 03:29:31.000000 | 8 |
| 6 | 2020-LT-006 | 联通时科网络实验室 | 功率变换器 | 2020-04-06 07:49:29.000000 | 3 |
| 7 | 2020-HR-007 | 鸿睿思博网络实验室 | 双踪示波器 | 2020-03-05 00:48:16.000000 | 4 |
| 8 | 2020-TY-008 | 天益科技实验室 | 联想启天2100 | 2020-03-03 23:57:45.000000 | 11 |
| 9 | 2020-LY-009 | 凌颖信息信息实验室 | 投影机 | 2020-02-03 20:11:21.000000 | 10 |
| 10 | 2020-DM-010 | 迪摩科技实验室 | 曙光天阔服务器 | 2020-02-12 20:46:27.000000 | 1 |
| 11 | 2020-LR-011 | 联软传媒实验室 | 联想启天2100 | 2020-02-21 11:02:09.000000 | 11 |

展示后修改及优化说明

1. 对设备ID进行改进

通常设备编号都有其实际含义,而且通常有使用年限的规定。所以我在展示后对ID进行设计,更加符合实际情况。

id的格式为购置年份-实验室名称前两字的拼音大写字母缩写-设备编号(三位数补全)

其中,提取实验室名称的拼音大写字母缩写,我通过利用xpinyin包来完成。

页面中显示的"设备编号"为人为构造的"设备id",区别于数据库表中自动生成的id。

2. 删除设备时进行安全性提示

因为增加了删除设备这一附加功能,而设备删除是一个具有安全隐患的操作。为了避免发生误操作的情况,在点击"删除"按钮后系统会提示"确定要删除吗?",此时只有点击"确定"时才会执行删除操作。

整体效果及操作流程

1. 登录页面:
如果输入错误密码:
如果输入非管理员账号:
2. 查看设备列表:

为了批量生成数据,使用python中的faker包来生成不同类型和格式的随机数据来模拟真实情形

其中,设定系统的管理员拥有顶级权限,即可以管理设备购置记录,并且我这里附加了一个功能:其本身购置的设备记录用红色背景标出,表明其重要性。

3. 增加设备:

这里对输入数据进行合法性验证:

  • 设备名不能为空/长度超出32个字符
  • 购置人必须是数据库中的用户,这里主要是为了确保我们拥有购置人的详细信息(比如说邮箱等),否则我们无法确认购置人的身份、无法联系到他。
4. 删除设备:

这里考虑了可能有设备废弃或者是转让,需要删除设备的情况。

拥有顶级权限的管理员本人购置的设备无法删除。

5. 关键词搜索:
6. 注销:

完成操作后点击注销,即可退出登录,此时返回登录页面,因为之前选择了记住密码,下次可直接登录。

相关推荐
查理零世1 分钟前
【算法】 区间合并(附蓝桥杯真题) python
python·算法·蓝桥杯
Anlici20 分钟前
跨域解决方案还有优劣!?
前端·面试
庸俗今天不摸鱼26 分钟前
【万字总结】构建现代Web应用的全方位性能优化体系学习指南(二)
前端·性能优化·webp
人工智能研究所32 分钟前
使用OpenCV与Python编写自己的俄罗斯方块小游戏
开发语言·python·opencv
DDD小小小宇宙32 分钟前
python列表基础知识
开发语言·windows·python
追寻光1 小时前
Java 绘制图形验证码
java·前端
前端snow1 小时前
爬取数据利用node也行,你知道吗?
前端·javascript·后端
村头一颗草1 小时前
高德爬取瓦片和vue2使用
前端·javascript·vue.js
@黄色海岸1 小时前
【sklearn 05】sklearn功能模块
人工智能·python·sklearn
远山无期1 小时前
vue3+vite项目接入qiankun微前端关键点
前端·vue.js