Python 3.8.1 Django2.2 做一个简单的运维资源管理系统
jinxin • 2020 年 04 月 24 日
一、功能需求的基本确定分管理员与普通用户,普通用户主要是对资源的查询,管理员对资源进行管理,涉及增加删除等功能。
需要存储展示资源的一些基本信息,如 型号,修改时间、创建时间,所在位置,设备类型,操作系统,hostname,sn,ip,应用,所有者,所有者邮箱等用户管理用户分级
用户注册
用户登陆
资源管理资源信息的添加
资源信息的删除
资源信息的修改
资源信息的查询
资源信息的分类展示
二、设计确定从使用角度来看,无需登陆即可进行查看检索信息。登陆后则可以对自己名下资源进行增删改查,管理员用户拥有所有权限。所以要单独做一个页面进行增删改操作。需要如下几个页面:index 首页,欢迎页面
设备类型页面
设备详细信息页面
注册页面
登陆页面
添加页面
修改页面
三、实现排期此产品主要是围绕用户及资源管理进行开发,所以首先要确定的就是资源和用户的两个模型,确定好模型之后就可以针对这个模型进行增删改查的接口开发和页面开发了。资源和用户的模型
用户注册登陆
资源增删改查接口
other
四、数据模型设计实现
1、模型数据字段
数值类字段字段名描述AutoField根据可用ID 自动添加的整数类型字段,使用需添加primary_key=True。
BigAutoField类似AutoField,不过它是一个64位证书类型字段。
IntegerField32位整数,范围-2147483648~2137483647。
PositiveIntegerField非负整数类型字段,取值范围0~2137483647。
SmaillIntegerField小整数16位类型字段,取值范围-32768~32767。
BigIntegerField大整数64位类型字段,取值范围-9223372036854775808——9223372036854775807。
FloatField浮点类型字段。
DecimalField十进制数据类型字段。
字符类型字段字段名描述CharField字符类型字段,使用需添加max_lentgh。
EmailField电子邮箱字段,在字段类型字段添加了Email格式验证。
SlugField标签字段,仅含有数字、字母、下划线和连字符,长用URL中。
URLFieldURL字段,默认长度200字符。
FilePathField文件路径阻断,用于存储文件路径,Path必选参数。
TextField文本字段,用于存储大量文本,无需指定最大长度。
UUIDFieldUUID字段,可以作为主键。
布尔类型字段字段名描述BooleanField布尔字段,只有True和False,不指定default时默认值为None。
NullBooleanField可空布尔字段。
日期时间类字段字段名描述DateField日期字段,python datetime.date,auto_now=True save会自动更新此字段,auto_now_add=True 记录创建时间,通常分开字段使用。
DateTimeField日期字段,python datetime.datetime,其余同上。
TimeField时间字段,python datetime.time,其余同上。
DurationField时间字段,python timedelta,通常在数据库层使用bigint类型存储毫秒信息。
文件类字段字段名描述FileField文件字段
ImageField图片字段
IP地址类字段字段名描述GenericIPAddressFieldIPv4、IPv6地址,会自动校验信息输入有效性。
二进制类字段字段名描述BinaryField二进制字段,只能通过字节访问。
资产管理系统模型的实现资产模型 需要如 型号,修改时间、创建时间,所在位置,设备类型,操作系统,hostname,sn,ip,应用,所有者,所有者邮箱等
用户模型 使用django自带的用户模型
创建AssetManagement项目,management app
通过pycharm 创建,具体创建方法略过
设置setting.py
略
编写模型部分
management/models.py# _*_coding:UTF-8_*_
from django.db import models
# Create your models here.
class Assettype(models.Model):
asset_type = models.CharField(max_length=128, unique=True, verbose_name='类型')
class Meta:
verbose_name = '设备类型'
verbose_name_plural = verbose_name
def __str__(self):
return self.asset_type
class Hardinfo(models.Model):
hard_ctime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
hard_mtime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
hard_type = models.ForeignKey(Assettype, on_delete=models.PROTECT, verbose_name='设备类型')
hard_sn = models.CharField(max_length=128, verbose_name='sn')
hard_name = models.CharField(max_length=64, verbose_name='设备型号')
hard_idc = models.CharField(max_length=64, verbose_name='IDC')
hard_location = models.CharField(max_length=64, verbose_name='所在位置')
hard_used = models.BooleanField(default=True)
class Meta:
verbose_name = '硬件信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.hard_name
class Osinfo(models.Model):
os_ctime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
os_mtime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
os_system = models.CharField(max_length=128, verbose_name='操作系统')
os_hostname = models.CharField(max_length=64, verbose_name='主机名')
os_ip = models.GenericIPAddressField(unique=True, verbose_name='ip')
os_cpu = models.SmallIntegerField(verbose_name='CPU')
os_mem = models.SmallIntegerField(verbose_name='内存(G)')
os_disk = models.SmallIntegerField(verbose_name='硬盘(G)')
os_owner = models.CharField(max_length=64, verbose_name='系统所有者')
owner_email = models.EmailField(null=False, verbose_name='所有者邮箱')
os_location = models.ForeignKey(Hardinfo, on_delete=models.PROTECT, verbose_name='关联硬件')
os_used = models.BooleanField(default=False)
class Meta:
verbose_name = '系统信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.os_ip
class Appinfo(models.Model):
app_ctime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
app_mtime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
app_name = models.CharField(max_length=64, unique=True, verbose_name='应用名')
app_ip = models.ForeignKey(Osinfo, on_delete=models.PROTECT, verbose_name='应用IP')
app_owner = models.CharField(max_length=64, verbose_name='应用所有者')
app_email = models.EmailField(null=False, verbose_name='所有者邮箱')
class Meta:
verbose_name = '应用信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.app_name
同步数据库python manage.py makemigrations
python manage.py migrate
创建管理员用户及启动python manage.py createsuperuser
python manage.py runserver