基于python和Django实现的资产管理系统的
第一章 绪 论
1.1 研究工作的背景与意义
当今社会正快速向信息化社会前进。信息系统的作用也越来越大,特别是一些企业或组织等,往往需要管理大量的资产数据。对这些资产信息,往往需要安全的,高效率的管理方式。而数据库系统及其应用就大大提高了资产管理的效率,减轻了工作人员的工作压力,提供了友好的人机交互界面。同时数据库的数据结构化,数据的低冗余性以及独立性等特性大大提升了资产管理的效率。同时数据的安全性保护与故障恢复等技术,满足了实际应用中对数据安全性的要求。
1.2 本文的主要贡献与创新
本文以资产管理系统需求为切入点。针对资产,设计了资产登记,领用,折旧以及维修管理等模块。针对应用中的实际需求,设计了权限管理模块,员工和部门管理模块,登录注册模块。并且为了管理方便,增加了邀请码模块,邀请码中包含了权限,有效期,有效次数等信息。
并完成了网站前端和后台的设计,实现了美观,简洁,高效和友好的人机交互界面。
同时设置了跨站访问限制以及人机验证,防止对网站的攻击和破坏。
1.3 本论文的结构安排
本文的章节结构安排如下:
第二章:需求的分析和数据库的设计
第三章:后台的搭建及特点
第四章:网站的实现和功能
第五章:总结
第二章 数据库模型的设计
2.1 需求分析
本系统的基本要求是实现如下功能或模块:
(1)资产登记管理模块:增删改查资产信息;
(2)资产领用管理模块:增删改查资产领用记录;
(3)资产折旧管理模块:根据不同的折旧方法计算资产的折旧金额和残值;
(4)维修管理模块:增删改查维修记录信息
(5)员工和部门管理模块:可以添加删除员工和部门
(6)权限管理模块:记录员工和部门的权限信息
(7)登陆注册模块:实现用户的登陆和注册
(8)邀请码模块:邀请码种包含权限信息,用户使用邀请码注册后可以自动获得对应模块的权限信息
(9)利用GUI或网站设计,实现人机友好交互界面
所以在本系统重要管理的信息主要有:资产信息,资产领用信息,资产折旧信息,维修记录信息等。因此存储此部分信息需要如下4个表:资产信息表,资产领用记录表,资产折旧记录表与维修记录表。为了达到第三范式,我们需要消除依赖,因此我们额外增加了资产种类表。
此为了实现多用户的登录与管理,还需要对用户帐号,权限及部门等信息进行管理,因此,数据库中还包括员工信息表,部门信息表,用户信息表,权限信息表。
为了实现邀请码功能,添加了表用来存储邀请码信息。
2.2 ER图
E-R的设计分为局部设计、全局设计两个内容。因为该需求较为复杂,所以实验中先设计局部E-R图,然后将局部E-R图整合成全局E-R图。
2.2.1 设计局部E-R模式
设计局部E-R模式的主要工作是要确定出实体和联系的定义、属性的分配,以及根据系统的实际情况,恰当地划分出各个分系统的局部结构范围。
资产信息主要包括资产ID,资产价值,资产名称,资产种类ID,资产种类名称。为了实现第三范式,设计了两张表来消除依赖。
图1 资产局部ER图
资产登记记录主要包含了登记人员的ID,登记记录的ID,登记日期以及所登记的资产ID,其局部ER图如下图。
图2 资产登记局部ER图
同样,折旧记录包括折旧时间,折旧记录ID,操作人的ID以及资产ID。并且为了记录资产价值的变化情况,额外增加了折旧种类,折旧金额以及残值的属性。
图3 资产折旧局部ER图
领用记录与的属性与上述类似,其局部E-R图如下图:
图4 资产领用局部ER图
资产维修模块分为了两个表,维修记录表和维修详情表。
图5 资产维修局部ER图
此外,为了实现多用户的登录及分权限管理等操作,还需要表来记录用户,部门及登录相关的数据。为此使用了三张表来记录人员信息,部门信息,及不同的权限等级所拥有的权限。
图6 人事部门及权限局部ER图
此外,为了实现登录的验证功能,设计了一张表用来存放登录验证信息。用来存放登录名,邮箱地址,登录密码以及唯一的职工号。
图7 账户及图片存储ER图
2.2.2 设计全局ER图
数据模型反映信息之间的联系,实际上,数据模型定义了数据库。在这个资产管理系统设计中,用E-R图来描述系统的数据库概念模式。我们抽象出资产信息表,资产领用记录表,资产折旧记录表与维修记录表,资产种类表。以及为了实现多用户的登录与管理,抽象出的人员信息表,部门信息表,账户信息表,权限信息表。
实体具有属性,如资产实体具有价值、名称和ID等,联系也可以具有属性。每个实体和每个实体之间的联系分别各用一张表来储存信息。实体间的联系有多种方式,如一对一、一对多、多对一和多对多等。每个关系都可以在数据库中以一个数据表来进行创建,所以在进行数据库设计之前一般要先进行实体与联系的分析和创建。
图8 主体部分全局ER图
我们将之前的部分ER图进行了整合,得到了上图的资产部分整体E-R图。
2.4 ER模型向数据模型的转换
此资产管理系统的表都属于函数依赖集。
资产信息表:
U={资产ID,资产价值,资产种类ID,资产名称}
F={资产ID——>资产价值,资产ID——>资产种类ID, 资产ID——>资产名称}
候选码为资产ID
资产领用记录表:
U={经办人ID,领用人ID,领用记录ID,领用日期,资产ID,归还日期}
F={领用记录ID——>经办人ID,领用记录ID——>领用人ID,领用记录ID——>领用日期,领用记录ID——>资产ID,领用记录ID——>归还日期}
候选码为领用记录ID
资产折旧记录表
U={折旧时间,折旧记录ID,折旧金额,残值,资产ID,操作人ID,折旧种类ID}
F={折旧记录ID——>折旧时间,折旧记录ID——>折旧金额,折旧记录ID——>残差,折旧记录ID——>资产ID, 折旧记录ID——>操作人ID, 折旧记录ID——>折旧种类ID }
候选码为折旧记录ID
资产登记记录表
U={登记时间,登记记录ID,入库单价,资产ID,操作人ID,资产入库照片}
F={登记记录ID——>登记时间,登记记录ID——>入库单价,登记记录ID——>资产ID, 登记记录ID——>操作人ID, 登记记录ID——>资产入库照片}
候选码为登记记录ID
维修记录表,资产种类表,人员信息表,部门信息表,账户信息表,权限信息表等,均与上述示例一样,满足如下的性质:
1.它们的每个非主属性都完全函数依赖于码,首先R=2NF;
2.它们的每一个非主属性既不部分依赖于码也不传递依赖于码,再次R=3NF;
2.5 数据字典
资产信息(asset)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
asset_id | int(11) | NO | PRI | 资产ID | |
asset_name | varchar(45) | 45 | NO | 资产名称 | |
asset_val | decimal(18,2) | NO | 资产价值 | ||
asset_kind_id | int(11) | YES | MUL | 资产种类ID |
资产折旧信息(asset_depreciate)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
depreciate_id | int(11) | NO | PRI | 折旧记录ID | |
depreciate_date | datetime(6) | NO | 折旧记录日期 | ||
depreciate_val | decimal(18,2) | YES | 折旧值 | ||
residual_value | decimal(18,2) | YES | 剩余价值 | ||
asset_id | int(11) | YES | MUL | 折旧资产ID | |
depreciate_kind | int(11) | YES | MUL | 折旧种类 | |
staff_id | int(11) | YES | MUL | 操作员工ID |
资产种类信息(asset_kind)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
kind_id | int(11) | NO | PRI | 资产种类ID | |
kind_name | varchar(45) | 45 | NO | 资产种类名称 |
资产申领信息(asset_requset)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
request_id | int(11) | NO | PRI | 申领记录ID | |
request_date | datetime(6) | NO | 申领日期 | ||
request_return_date | datetime(6) | YES | 归还日期 | ||
request_staff_id | varchar(45) | 45 | YES | 申领人姓名 | |
asset_id | int(11) | YES | MUL | 资产ID | |
operator_staff_id | int(11) | YES | MUL | 操作人员ID |
资产登记信息(asset_register)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
register_id | int(11) | NO | PRI | 资产登记记录ID | |
register_data | datetime(6) | NO | 资产登记时间 | ||
Staff_img_id | Int(11) | 100 | YES | MUL | 员工照片ID |
asset_id | int(11) | YES | MUL | 资产ID | |
staff_id | int(11) | YES | MUL | 操作员工ID |
资产维修信息(asset_repair)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
repair_id | int(11) | NO | PRI | 维修记录ID | |
repair_time | datetime(6) | NO | 维修时间 | ||
repair_asset_id | int(11) | YES | MUL | 维修资产ID | |
repair_staff_id | int(11) | YES | MUL | 维修人员ID |
注册用户信息(auth_user)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
id | int(11) | NO | PRI | 用户ID | |
password | varchar(128) | 128 | NO | ||
last_login | datetime(6) | YES | |||
is_superuser | tinyint(1) | NO | |||
username | varchar(150) | 150 | NO | UNI | |
first_name | varchar(30) | 30 | NO | ||
last_name | varchar(150) | 150 | NO | ||
varchar(254) | 254 | NO | |||
is_staff | tinyint(1) | NO | |||
is_active | tinyint(1) | NO | |||
date_joined | datetime(6) | NO |
邀请码信息(asset_invite_key)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
Id | int(11) | NO | PRI | ||
Times | int(11) | NO | |||
Key | varchar(100) | 100 | NO | ||
ddl_time | datetime(6) | NO | |||
dept_id | int(11) | NO | MUL | ||
operator_staff_id | int(11) | YES | MUL |
员工信息(Staff)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
Id | int(11) | NO | PRI | 员工ID | |
user_id | int(11) | NO | MUL | 用户ID | |
dep_id | int(11) | NO | MUL | 部门ID | |
Staff_img_id | Int(11) | 100 | YES | MUL | 员工照片ID |
部门信息(asset_staff)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
dep_id | int(11) | NO | PRI | 部门ID | |
dep_name | varchar(45) | 45 | NO | 部门名称 | |
dep_permmison_id | int(11) | NO | MUL | 部门权限ID |
照片信息(asset_photos)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
img_id | int(11) | NO | PRI | 部门ID | |
img_name | varchar(30) | 30 | NO | 部门名称 | |
Img | varchar(100) | 100 | NO | 部门权限ID |
折旧种类信息(asset_depreciate_kind)
列名 | 数据类型 | 最大长度 | 是否为空 | 键 | 备注 |
---|---|---|---|---|---|
depreciate_kind_id | int(11) | NO | PRI | 折旧种类 | |
depreciate_name | varchar(45) | 45 | NO | 折旧种类名 | |
depreciate_cal | varchar(45) | 45 | NO | 折旧表达式 |
2.6 数据库的逻辑设计
如下是资产管理系统的关系图:
由于关系图模型太大所以将其拆分程了两张图,第一张图主要是资产管理模块,如下图:
图9 数据库设计部分1
下图主要是用户权限信息及邀请码功能部分的结构图
图10 数据库设计部分2
第三章 网站的后台设计
3.1 后台框架的选择
Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django、Tornado、Flask、Twisted、Bottle和Web.py等,它们有的历史悠久,有的发展迅速,还有的已经停止维护。
而Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。且Django的手册较为丰富,便于学习和开发。我们网站后台主要使用python语言,利用django进行开发。
Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。
3.2 框架概述
拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生SQL。拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生SQL。
3.3 请求的响应
3.3.1 域名的解析
域名的解析使用正则表达式,通过正则表达式可以:
测试字符串内的模式。
可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
基于模式匹配从字符串中提取子字符串 。
可以查找文档内或输入域内特定的文本。
我们在域名解析中使用正则表达式,主要是为了从字符串中提取子字符串。例如: http://127.0.0.1:8000/assets/assetdepreciate/
我们通过正则表达式,可以先提取出assets,即我们的应用名称。然后在asset的基础上,提取出assetdepreciate,也就是资产折旧记录对应的view。
这样的好处是,可以实现应用的模块化。例如assets/就对应整个的资产管理系统的域名。
3.3.2 视图的返回
在访问域名对应的视图时,django会将request的内容作为参数传入视图函数。Request的变量里面包含get或post的内容。例如用户浏览器,系统等信息。以及注册登陆或其他表单信息。
在view函数中针对不同的request返回不同的html页面,就实现了简易的web服务的搭建。
3.3 与数据库的连接
与数据库连接经过了django的封装。数据库中的每个表对应python代码中的一个Module类。数据库中的每一行,对应python中类的实例。
class Asset(models.Model):
asset_id = models.AutoField(primary_key=True)
asset_kind = models.ForeignKey('AssetKind', models.DO_NOTHING, blank=True, null=True)
asset_name = models.CharField(max_length=45)
asset_val = models.DecimalField(max_digits=18, decimal_places=2)
例如如上为定义资产的部分代码。Django提供了一对一,一对多,多对多的支持。Django中的的外键与mysql中的有些区别。例如mysql提供键值的关联,而django是ORM,也就是对象关系映射。
图11 ORM示意图
上图为ORM的示意图。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。ORM技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
CREATE TABLE `asset` (
`asset_id` int(11) NOT NULL AUTO_INCREMENT,
`asset_name` varchar(45) NOT NULL,
`asset_val` decimal(18,2) NOT NULL,
`asset_kind_id` int(11) DEFAULT NULL,
PRIMARY KEY (`asset_id`),
KEY `asset_asset_kind_id_d7902bcb_fk_asset_kind_kind_id` (`asset_kind_id`),
CONSTRAINT `asset_asset_kind_id_d7902bcb_fk_asset_kind_kind_id` FOREIGN KEY (`asset_kind_id`) REFERENCES `asset_kind` (`kind_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
上述代码为django进行migration操作时,将Module类转换为SQL语句的过程
第四章 网站的整体设计
4.1 网站首页
网站首页采用HTML+JS+CSS开发,简介大方。通过滚动鼠标,可以了解资产管理系统的优势和特点,并且提供了联系方式Github地址。
以及提供了注册和登陆的按钮。
以及提供了注册和登陆的按钮。
图12 网站首页
4.2 登录和注册
4.2.1 注册系统
4.2.1.1注册系统的界面
图13 注册页面
注册页面提供了表单的有效性的验证,以及验证码验证。并在后台通过查询数据库检测用户是否已经注册过。
4.2.1.2 注册界面的实现
为了保证整个网站风格的统一,我们借鉴了django的css文件。同时为了保证注册模块的可扩展性,我们编写了模板文件。
```jsp
\<form method = 'post' enctype="multipart/form-data" id="login-form">
{% csrf_token %}
{% for field in userform %}
\<div class="c32_9739_397b82b form-row">
{{ field.label_tag }}{{ field }}
{{ field.errors }}
\</div>
{% endfor %}
\<input type="submit" value = "注册" id="TencentCaptcha" data-appid="2036447301"
data-cbfn="check">
\<!--input type="submit" value = "注册"-->
\</form> ```
模板文件的作用是提供一个可复用的html框架。模板中可以实现循环,赋值,条件判断和过滤器等操作。例如上述代码展示了如何从表单中读取数据。
Python后台读取模板文件以后,依据模板生成对应的HTML网页,并返回给浏览里。
同时通过django的静态文件机制,存储js和css文件。并在html模板文件中进行调用。
\<link rel="stylesheet" type="text/css" href="{% static 'css/regist.css' %}" />
\
参考文献
- 山东英才学院实训中心资产管理系统的设计与实现(山东大学·邵丰琳)
- 面向多业态企业的资产管理系统的设计与实现(南京邮电大学·高翔)
- 基于Web的企业资产管理系统的设计和实现(电子科技大学·王娟)
- 某资产管理公司投资管理系统的设计与实现(山东大学·胡雅雯)
- 某企业固定资产信息管理系统的设计与实现(电子科技大学·朱裕)
- 面向多业态企业的资产管理系统的设计与实现(南京邮电大学·高翔)
- 某企业固定资产信息管理系统的设计与实现(电子科技大学·朱裕)
- 沿海开发建设财务管理系统的设计与实现(大连理工大学·燕会英)
- 面向多业态企业的资产管理系统的设计与实现(南京邮电大学·高翔)
- 沿海开发建设财务管理系统的设计与实现(大连理工大学·燕会英)
- 面向多业态企业的资产管理系统的设计与实现(南京邮电大学·高翔)
- 基于Web的资产管理信息系统研究与设计(华中师范大学·伍仪强)
- 基于JavaEE的大型资金管理系统的设计与实现(北京交通大学·杨志)
- 某资产管理公司投资管理系统的设计与实现(山东大学·胡雅雯)
- 龙岩学院移动资产管理系统的设计与实现(电子科技大学·廖思超)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码小屋 ,原文地址:https://bishedaima.com/yuanma/35605.html