《Python程序设计》 结课作业
设计题目: 个人消费记账统计与分析系统
系 别:
专 业:
班 级:
学 号:
学生姓名:
指导教师:
2022年11月18日
目录
1 需求分析
个人理财的主要对象不像企业那样,是企业的资产和资本这些大量的资金,个人的理财对大多数的人来说就是对个人收入的支配与规划。当代社会个人的收入往往就是工资,这些工资有的是以存入卡形式出现的,有的是现金形式出现的,这两种形式其实本身就为个人理财提供了很大的方便。在存卡形式出现之前,工资往往是完全以现金形式出现的,这就使得人们对收入的规划无序,大多数人遵循着“有多少,花多少”的原则,当然也有不少人利用“记账”的方式进行规划,这其实就是个人财务管理的初级表现之一。
本系统的最终目的是设计一个名为“TIME 时时记”的个人记账理财系统。对不会自主理财,同时有渴望有一个合理的消费和收入标准的广大用户来说,TIME 时时记系统就非常合适,该系统功能齐全但操作简单。
主要包括用户登录、用户管理、系统记账和图表统计四大功能,能实现用户的注册、登录以及用户信息的修改;实现用户对收入/支出记录的增加、删除、修改和查询。并对最近15天收入/支出的当天总和以柱状图对比显示,对最近15天收入/支出总和的饼状图对比显示。
2 总体设计
2.1系统程序结构设计
OAProject—项目名
├─OAProject # 项目同名文件目录
│ asgi.py# 支持异步网络服务器和应用
│ settings.py # 配置文件
│ urls.py # 根路由,用来控制页面url访问
│ wsgi.py # 帮助Django应用和网络服务器间的通讯
├─OAUser # App目录
│———migrations文件目录 # 修改数据模型时,会自动升级数据库
│ __init__.py # 空文件,允许在项目的其他部分使用它
│——— static文件目录 # 网站渲染所需文件
│—————— login文件目录
│ css文件目录 # 渲染html所需的css文件
│ font文件目录
│ images文件目录 # 渲染html所需的图片
│ js文件目录 # 渲染html所需的js文件
│ __init__.py # 空文件,允许在项目的其他部分使用它
│ admin.py
│ apps.py # app的相关配置
│ froms.py # 该系统登录、注册、收入、支出的表单设计
│ models.py # 该系统创建用户、收入、支出的三张表
│ tests.py
│ urls.py # 网页路由
│ views.py # 视图函数,业务层逻辑代码
├─templates文件目录 # 模板文件(一个一个的html)
│———login文件目录
│ __init__.py # 空文件,允许在项目的其他部分使用它
│ chart.html # 记账图表分析页面
│ income.html # 收入记账管理页面
│ index.html # “TIME 时时记”首页
│ login.html # 用户登录页面
│ pay.html # 支出记账管理页面
│ personal-info.html # 用户个人信息管理页面
│ register.html # 用户注册页面
│ update_income.html # 更新收入记账管理页面
│ update_pay.html # 更新支出记账管理页面
├─manage.py # django启动项目文件
└─temp.html # 图表管理页面
2.2 系统用例图
2.3 开发及运行环境
本系统是基于64位 windows10家庭中文版,处理器Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz 1.80GHz,机带RAM 12.0GB。
开发工具:PyCharm,Navicat 15 for MySQL
3 数据库设计
表1 用户信息表
表序号 | 1 | 表名 | Users | |||
含义 | 存储用户的基本信息 | |||||
序号 | 属性名称 | 含义 | 数据类型 | 长度 | 说明 | 约束 |
1 | uid | 用户id | Int | Not nulll | 主键 | |
2 | uname | 用户名 | varchar | 30 | Not nulll | |
3 | upwd | 密码 | varchar | 30 | Not null | |
4 | usex | 性别 | varchar | 30 | Not nulll | |
5 | uemail | 邮箱 | varchar | 254 | Not null | |
6 | utel | 电话号码 | bigint | Not null |
表2 收入表
表序号 | 2 | 表名 | Income | |||
含义 | 存储收入记录 | |||||
序号 | 属性名称 | 含义 | 数据类型 | 长度 | 说明 | 约束 |
1 | iId | 收入id | Int | Not nulll | 主键 | |
2 | iType | 类型 | varchar | 30 | Not nulll | |
3 | iMoney | 金额 | decimal | 10 | Not null | |
4 | iRemark | 备注 | varchar | 55 | Not nulll | |
5 | iTime | 时间 | date | Not null |
表3 支出表
表序号 | 3 | 表名 | Pay | |||
含义 | 存储支出记录 | |||||
序号 | 属性名称 | 含义 | 数据类型 | 长度 | 说明 | 约束 |
1 | pId | 支出id | Int | Not nulll | 主键 | |
2 | pType | 类型 | varchar | 30 | Not nulll | |
3 | pMoney | 金额 | decimal | 10 | Not null | |
4 | pRemark | 备注 | varchar | 55 | Not nulll | |
5 | pTime | 时间 | date | Not null |
4 详细设计
4.1 用户注册
新用户可以通过输入用户名、密码、确认密码、邮箱地址、电话号码、性别和验证码进行注册。
在/login/forms.py中添加一个新的表单类,upwd1和upwd2用于输入两遍密码,并进行比较,防止误输密码;uemail是一个邮箱输入框;usex是一个select下拉框。然后在register.html中编写forms相关条目。在/viwes.py/文件中完善register()视图,首先两次输入的密码必须相同,其次不能存在相同用户名和邮箱,最后如果条件都满足,则创建一个用户实例,然后保存到数据库内。
4.2 用户登录
用户注册成功后会跳转至登录页面,输入用户名、密码和验证码,点击登录按钮进入系统首页。
用户通过login.html中的表单填写用户名和密码,并以POST的方式发送到服务器的/1ogin/地址。服务器通过1ogin/views.py 中的1ogin() 视图函数,接收并处理这一请求。
4.3 个人中心
可在顶部导航栏进入个人信息界面,对个人信息进行修改操作。点击保完信息完成信息修改。
4.4 首页(新增收入/支出记录)
选择记账类型(收入/支出),金额,备注和时间,点击保存跳出弹窗,点击确定,这条收入/支出记录就会保存至数据库中并显示在相对应的页面上。
后台通过判断iType是否等于“收入”,是的话就将该条记账信息保存至收入记录页面,不是的话就保存至支出记录页面,首先收入、支出页面分开显示。
4.5 收入记账管理
该页面显示收入的序号、类型、金额、备注和时间。
搜索框:输入要搜索的“备注”中的内容,查找到相关记录;
编辑按钮:点击编辑按钮,进入修改页面,修改内容后点击保存即可;
删除按钮:点击删除按钮,在弹窗上点击确认,删除该条信息。
在views.py中实现了收入记录的查询、修改和删除的功能,将其通过income.html页面显示出来。
4.6 支出记账管理
该页面显示支出的序号、类型、金额、备注和时间。
搜索框:输入要搜索的“备注”中的内容,查找到相关记录;
编辑按钮:点击编辑按钮,进入修改页面,修改内容后点击保存即可;
删除按钮:点击删除按钮,在弹窗上点击确认,删除该条信息。
在views.py中实现了支出记录的查询、修改和删除的功能,将其通过pay.html页面显示出来。
4.7 记账图表
通过Echarts,一款基于JavaScript的数据可视化图表库,根据前面的收入和支出记录,生成最近15天每一天的总收入和总支出的对比柱状图。
根据前面的收入和支出记录,生成最近15天的总收入和总支出的对比饼图,以百分比的形式呈现。
得到当前的年月日信息,判断收入日期和支出日期是否在最近15天内,若在,则计算当天收入和支出金额总和,得到“最近15天的收入与支出”信息对比柱状图,生成一个temp.html文件,显示在chart.html页面上。
将最近15天每一天的收入/支出总金额相加,以饼图的形式对比呈现在chart.html页面上。
4.8 系统其他功能实现
计算收入/支出的记录总条数,将其分为一页十条呈现出来。
5 代码实现
5.1代码截图
5.2运行截图
图5.1 用户注册界面
图5.2 用户登录界面
图5.3 个人中心界面
图5.4 首页
图5.5 搜索显示
图5.6 编辑界面
图5.7删除界面
图5.8 柱状图
图5.9 饼图
图5.10 分页样式
6 测试
Django 提供了住专门的命令用来执行测试,命令如下所示:我们可以在项目的 manage.py 文件目录下直接执行此命令,但是该命令会将所有的测试结果都输出,如果你的每个应用下都做了单元测试,这显然会给你造成很错乱的感觉,所以我们可以使用下面的命令进行相关的测试输出:
- 执行 index 应用下的所有测试用例: python manage.py test index。
- 执行 index应用下 tests 模块下定义的测试用例:python manage.py test.index.tests。
- 直接执行 tests.py 文件下测试类:python manage.py test index.tests.ExampleTest。
- 直接执行测试类下某个测试方法:python manage.py test index.tests.ExampleTest.test_view。
用户注册时,upwd1和upwd2用于输入两遍密码,并进行比较,防止误输密码;uemail是一个邮箱输入框;usex是一个select下拉框。然后在register.html中编写forms相关条目。在/viwes.py/文件中完善register()视图,首先两次输入的密码必须相同,验证码也需要输入正确,其次不能存在相同用户名和邮箱,最后如果条件都满足,则创建一个用户实例,然后保存到数据库内。
用户登录时,用户通过login.html中的表单填写用户名和密码,并以POST的方式发送到服务器的/1ogin/地址。服务器通过1ogin/views.py 中的1ogin() 视图函数,接收并处理这一请求。除了需要填写正确的验证码之外,用户名和用户密码也必须要正确,否则都无法登录。
7 总结
本次项目开发带给我最大的感受就是要细心。在编写过程中总是出现一些小bug和因为自己粗心写错的地方,每次都弄得自己莫名其妙,找到并解决之后就会恍然大悟,其实很多是原本认真一点就能避免的。做项目的过程中,遇到问题是很正常的事情,通过查找网页、书籍等方式都有可能解决,在这个过程中最重要的就是要学会找到问题,并解决问题,从中学到之前不懂的知识,加深印象,以防止下次再碰到时束手无策。
在网络如此发达的环境下,学习新知识和新技术的方式有许多。除了通过课堂上老师的讲解,书本上的理解等,这次的项目我还通过b站、百度、询问他人的方法,获取到了自己想要的技术,同时也学到了许多新的知识。
通过使用Django进行开发,我更理解了它为何是高水准的Python编程语言驱动的一个开源模型、视图,控制器风格的Web应用程序框架。在Dj ango框架中,包含了许多功能强大的第三方插件,使得Django具有较强的可扩展性。Django使用自己的Templates模板进行HTML渲染控制,然后我们再通过Django的render()函数给用户返回可视化的图表页面。
在个人收入与支出的对比中,我运用了echarts的条形图和饼图,清晰直观的展现了二者之间的对比。用户的登录验证是通过唯一的用户名,使用Django的ORM去数据库中查询用户数据,如果有匹配项,则进行密码对比,如果没有匹配项,说明用户名不存在。如果密码对比错误,说明密码不正确。增加了message变量,用于保存提示信息。当有错误信息的时候,将错误信息打包成一个字典,然后作为第三个参数提供给render方法。这个数据字典在渲染模板的时候会传递到模板里供你调用。
无论是做什么事情,一定要懂得坚持、遇到困难要懂得自己去寻找答案或者寻求帮助,不害怕不退缩,才能完成自己想要的东西。