家庭资产管理系统CLI版
最近学习Python提交了第一份基础阶段个人项目,拿此拙作出来分享一下,希望能达到大佬们的批评意见。
1.项目背景
随着经济社会的发展以及人民生活水平的提高,城市居民家庭支出在购买生活必需品之外有了新的延伸,呈现出多元化特征。由于居民间理财观念和财产管理能力的差异,居民有效消费水平不足并存在较高的超前消费风险,实际上限制了居民生活水平的提升,这与提高居民收入水平,刺激社会消费,实现内循环的战略目标存在一定的偏差。为了向社会普及理财观念,并培养居民的财产管理意识,提供合适的管理工具,因而推出家庭资产管理系统1.0版本。该系统将有助于使用者了解家庭资产状况,并根据诊断分析做出判断,从而使家庭资产利用效率最优化,在现有经济水平上实现生活水平的提升。
对家庭资产的有效管理将帮助使用者清晰地认识自身经济水平,作出合理的财务决策。同时,也有助于社会消费结构的合理化,缓解过度消费和消费不足两种极端现象的发生。
2.功能结构
本系统主要由如下5个模块构成:(1)菜单模块,作为系统入口主界面为用户提供菜单指南,并跳转至相应的功能模块,在相应功能执行完毕后返回该界面;(2)录入模块,用户通过该模块可增加资产信息;(3)查询模块,用户可获得存储数据中的全部资产信息,并选择增删或退出操作;(4)数据存储模块,该部分用于存储用户数据,便于下次查询修改调用;(5)分析模块,可根据家庭资产占比数据对家庭资产布局健康状况进行简单判断。
功能结构图如下所示。
3.项目功能描述
3.1菜单模块
系统主界面,为用户使用该系统提供菜单指南,用户输入对应的数字0~3,分别对应退出系统、录入数据、查询数据、分析数据,并能识别非指定输入,提醒用户重新输入。在用户选择对应操作后跳转至相应功能模块,并在执行完操作后返回主界面。
========家庭资产管理系统 v1.0=========
【1】 录入数据
【2】 查询数据
【3】 财务分析
【0】 退出系统
------------------------------
请输入您想要进行的操作对应编码:
3.2录入模块
录入模块初始页面由“开始录入”和“退出至主界面”两个选项构成,用户分别输入1和0完成对应操作。在用户选择“开始录入”后,显示资产分类菜单,按照“不动产”、“现金资产”和“负债”的顺序进入数据录入界面。在进入到对应的资产分类界面后,用户可根据提示,依次输入资产名称以及对应的货币价值,每完成一项输入后询问用户是否继续输入。在用户确定完成所有录入工作后,自动调用数据存储模块,并返回主界面。
请输入您想要进行的操作对应编码:1
请选择您的操作:【1】开始录入 【0】退出至主界面 1
******************************
若所进行的分类财产无录入信息,请输入"无"
现在进行的是不动产数据录入
请输入项目名称:无
------------------------------
现在进行的是现金资产数据录入
请输入项目名称:无
------------------------------
现在进行的是负债数据录入
请输入项目名称:房贷
请输入项目货币价值(元):200
是否在该分类下继续添加新项目?【1】是 【0】否 0
------------------------------
+++++++++++++保存成功+++++++++++++
******************************
========家庭资产管理系统 v1.0=========
【1】 录入数据
【2】 查询数据
【3】 财务分析
【0】 退出系统
------------------------------
请输入您想要进行的操作对应编码:0
【欢迎再次使用!】
按回车键退出系统
3.3查询模块
查询模块初始页面由“开始查询”和“退出至主界面”两个选项构成,用户分别输入1和0完成对应操作。在用户选择“开始查询”后,以“编号-分类-资产名称-货币价值”的格式显示存储的资产数据清单,并在下一步末尾显示操作指南,输入1执行修改操作,进入修改子模块,输入2执行分析模块功能,输入0则返回主界面。与录入模块类似,在修改界面用户只需按提示替换或删除相应信息即可,最后自动进行存储。在执行完上述所有操作后,返回主界面。
请输入您想要进行的操作对应编码:2
请选择您的操作:【1】开始查询 【0】退出至主界面 1
******************************
编号 分类 资产名称 货币价值
------------------------------
1 不动产 别墅 1000.0
2 不动产 店铺 600.0
3 不动产 SUV 800.0
4 现金资产 银行存款 300.0
5 负债 贷款 200.0
------------------------------
请选择您的下一步操作?【1】修改记录 【0】退出至主界面 1
------------------------------
请输入您要修改的项目所处类别:不动产
请输入您要修改的项目名称:别墅
------------------------------
请选择您的操作:【1】修改价格 【2】删除 【0】取消操作 1
请输入该项目的更新货币价值(元):1200
是否继续进行修改操作?【1】是 【0】否 1
------------------------------
请输入您要修改的项目所处类别:店铺
请输入您要修改的项目名称:不动产
------------------------------
店铺-不动产不在记录数据中,请确认后重新输入
------------------------------
请输入您要修改的项目所处类别:不动产
请输入您要修改的项目名称:店铺
------------------------------
请选择您的操作:【1】修改价格 【2】删除 【0】取消操作 2
是否继续进行修改操作?【1】是 【0】否 0
+++++++++++++保存成功+++++++++++++
******************************
请选择您的操作:【1】开始查询 【0】退出至主界面 1
******************************
编号 分类 资产名称 货币价值
------------------------------
1 不动产 别墅 1200
2 不动产 SUV 800.0
3 现金资产 银行存款 300.0
4 负债 贷款 200.0
------------------------------
3.4数据存储模块
数据存储是本系统中唯一无需用户主动操作的功能模块,在用户完成数据录入或修改操作后,自动跳转至该模块,通过覆盖原有数据的方式完成数据的更新。
3.5分析模块
分析模块通过家庭资产负率、现金资产占比以及理财产品占比,分析家庭潜在财务风险状况以及资产布局是否合理,并根据“财务风险>资产布局合理性”的规则,对家庭资产健康度进行“优”、“良”、“合格”以及“差”的分级评定。如果用户在进行分析操作时没有存储数据,则会弹出“未查询到资产信息”的警示信息,结束功能操作,返回主界面。
请输入您想要进行的操作对应编码:3
请选择您的操作:【1】开始分析 【0】退出至主界面 1
经统计您的家庭资产总额为2300.0元。
其中不动产2000.0元,占比86.96%;现金资产300.0元,占比13.04%。资产流动性好,短期内可能不存在现金周转风险
长期资产负债率为8.7%,处于正常水平,未来存在资不抵债风险的可能性较低
短期资产负债率为66.67%,处于正常水平,短期偿债压力较小
您的家庭资产状况评价为优秀
++++++++++++++++++++++++++++++
4.不足与展望
4.1数据需要手动登记,依赖使用者的操作习惯
未来可通过绑定使用者主要收入和支付账户,自动填取数据,并根据支出发生情况提醒使用者对支出情况进行备注。
4.2相较于图形化界面,交互指令界面稍显枯燥
后期可将现有功能进行改善,并形成图形操作界面,改善用户使用体验。
4.3分析功能较为单一,参考价值有限
可加入证券平台和电商平台爬虫程序,利用线上数据丰富分析内容,或搭建咨询平台,雇佣相关专家提供付费服务。
4.4资产分类选择较为单一
4.2相较于图形化界面,交互指令界面稍显枯燥
后期可将现有功能进行改善,并形成图形操作界面,改善用户使用体验。
4.3分析功能较为单一,参考价值有限
可加入证券平台和电商平台爬虫程序,利用线上数据丰富分析内容,或搭建咨询平台,雇佣相关专家提供付费服务。
4.4资产分类选择较为单一
可参考企业财务报表格式扩充这部分内容。
附录:源代码
fams_main.py
"""
主程序为用户提供操作指南,搭建系统框架
"""
# 引入工具函数模块
from fams_tools import *
# 主程序根据用户选择调用工具程序
def main():
while True:
# 显示菜单界面
start_title = "家庭资产管理系统 v1.0"
print(f"{start_title:=^30}")
main_menu = ['录入数据', '查询数据', '财务分析']
n = 1
for i in main_menu:
print(f"【{n}】\t\t{i}")
n += 1
print("\n【0】\t\t退出系统\n")
print("-"*30)
# 用户进行操作选择
action = input("请输入您想要进行的操作对应编码:")
if action == "0":
print("【欢迎再次使用!】")
input("按回车键退出系统")
break
elif action == "1":
signin()
elif action == "2":
search()
elif action == "3":
analyze()
else:
print(f"【{action}】不是系统可识别操作符,请重试")
# 启动主函数
if __name__ == "__main__":
main()
fams_tools.py
"""
工具函数模块用于存放系统功能函数,便于主函数调用
"""
from sub_tools import *
# 数据录入函数
def signin():
while True:
action = input("请选择您的操作:【1】开始录入\t【0】退出至主界面\t")
print("*"*30)
if action == "0":
break
elif action == "1":
temp_dict = {'不动产': {}, '现金资产': {}, '负债': {}}
print('若所进行的分类财产无录入信息,请输入"无"')
for item in temp_dict:
print(f"现在进行的是{item}数据录入")
detail_key = []
detail_value = []
ask = "1"
while True:
if ask != "0":
name = input("请输入项目名称:")
if name == "无":
break
else:
detail_key.append(str(name))
while True:
try:
price = float(input("请输入项目货币价值(元):"))
detail_value.append(str(price))
break
except Exception as e:
print(f"非法数据输入{e},请重新输入")
continue
else:
break
while True:
ask = input("是否在该分类下继续添加新项目?【1】是\t【0】否\t")
if ask == "0":
detail_dict = dict(zip(detail_key, detail_value))
temp_dict[item] = detail_dict
break
elif ask == "1":
break
else:
print(f"【{ask}】不是系统可识别操作符,请重试")
continue
print("-"*30)
store(temp_dict)
print("保存成功".center(30, "+"))
print("*"*30)
break
else:
print(f"【{action}】不是系统可识别操作符,请重试")
continue
# 数据查询函数
def search():
while True:
action = input("请选择您的操作:【1】开始查询\t【0】退出至主界面\t")
if action == "1":
pass_list = {}
record_list = update(pass_list)
print("*"*30)
print("编号\t\t分类\t\t资产名称\t\t货币价值")
print("-"*30)
i = 1
for kind in record_list:
for item in record_list[kind]:
price = record_list[kind][item]
print(i, end=" "*(9 - len(str(i))))
print(kind, end=" "*(9 - len(kind)))
print(item, end=" "*(9 - len(item)))
print(price, end="\n")
i += 1
print("")
print("-"*30)
while True:
ask = input("请选择您的下一步操作?【1】修改记录\t【0】退出至主界面\t")
if ask == "1":
temp_dict = {}
change(temp_dict)
print("保存成功".center(30, "+"))
print("*" * 30)
break
elif ask == "0":
break
else:
print(f"【{ask}】不是系统可识别操作符,请重试")
continue
elif action == "0":
break
else:
print(f"【{action}】不是系统可识别操作符,请重试")
continue
# 财务分析函数
def analyze():
while True:
action = input("请选择您的操作:【1】开始分析\t【0】退出至主界面\t")
if action == "1":
pass_list = {}
record_list = update(pass_list)
if len(record_list) == 0:
print("未查询到您的资产信息")
break
else:
analyze_list = []
if len(record_list) == 3:
for kind in record_list:
sum_price = 0
for item in record_list[kind]:
price = float(record_list[kind][item])
sum_price += price
analyze_list.append(sum_price)
real_estate = analyze_list[0]
cash = analyze_list[1]
debt = analyze_list[2]
total_assets = real_estate + cash
try:
real_estate_ratio = round((real_estate / total_assets) * 100, 2)
liquid_ratio = round((cash / total_assets) * 100, 2)
long_leverage = round((debt / total_assets) * 100, 2)
short_leverage = round((debt / cash) * 100, 2)
except ZeroDivisionError:
print("无资产可用于抵债,准备跑路吧~")
print(f"经统计您的家庭资产总额为{total_assets}元。\n其中不动产{real_estate}元,占比{real_estate_ratio}%;"
f"现金资产{cash}元,占比{liquid_ratio}%。", end="")
score = 0
if liquid_ratio <= 0.4:
print("资产流动性较低,可能存在现金周转风险")
else:
print("资产流动性好,短期内可能不存在现金周转风险")
score += 1
if long_leverage > 120:
print(f"长期资产负债率为{long_leverage}%,处于较高水平,未来可能存在资不抵债风险")
else:
print(f"长期资产负债率为{long_leverage}%,处于正常水平,未来存在资不抵债风险的可能性较低")
score += 2
if short_leverage > 80:
print(f"短期资产负债率为{short_leverage}%,处于较高水平,可能面临较大的短期偿债压力")
else:
print(f"短期资产负债率为{short_leverage}%,处于正常水平,短期偿债压力较小")
score += 3
level = ""
if score >= 5:
level = "优秀"
elif score == 3:
level = "良好"
elif score >= 1:
level = "合格"
elif score == 0:
level = "差"
print(f"您的家庭资产状况评价为{level}")
print("+"*30)
break
else:
print("分析资产需记录数据中包含所有类别信息,请先进入【录入数据】界面补充完整")
break
elif action == "0":
break
else:
print(f"【{action}】不是系统可识别操作符,请重试")
continue
sub_tools.py
"""
子工具模块用于存放工具模块需要调用的函数
"""
# 数据更新函数
def update(info_dict):
record_dict = {}
f = open(r".\data\record.txt", "r", encoding="utf-8")
try:
content = f.readlines()
if len(content) == 0:
record_dict = info_dict
else:
for line in content:
temp_dict = {}
line = line.replace("\n", "")
if len(line) == 0:
pass
else:
info_list = line.split("-")
kind_name = info_list[0]
kind_info = info_list[1].split(";")
for item in kind_info[0:-1]:
item_info = item.split(":")
item_name = item_info[0]
item_price = item_info[1]
temp_dict[item_name] = item_price
record_dict[kind_name] = temp_dict
for kind in info_dict:
if kind in record_dict:
for item in info_dict[kind]:
if item in record_dict[kind]:
old_price = float(record_dict[kind][item])
add_price = float(info_dict[kind][item])
new_price = str(old_price + add_price)
record_dict[kind][item] = new_price
else:
record_dict[kind].update({item: info_dict[kind][item]})
else:
record_dict.update({kind: info_dict[kind]})
return record_dict
except Exception as e:
print(f"程序出现错误{e}")
finally:
f.close()
# 数据更新存储函数
def store(info_dict):
pass_list = info_dict
record_dict = update(pass_list)
b = open(r".\data\record.txt", "w", encoding="utf-8")
for kind in record_dict:
b.write("\n" + kind + "-")
for info_name in record_dict[kind]:
b.write(info_name + ":" + record_dict[kind][info_name] + ";")
b.close()
# 数据修改函数
def change(info_list):
record_list = update(info_list)
ask = "1"
while True:
if ask != "0":
print("-"*30)
kind = input("请输入您要修改的项目所处类别:")
name = input("请输入您要修改的项目名称:")
print("-" * 30)
if (kind in record_list) and (name in record_list[kind]):
while True:
action = input("请选择您的操作:【1】修改价格\t【2】删除\t【0】取消操作\t")
if action == "1":
record_list[kind][name] = input("请输入该项目的更新货币价值(元):")
break
elif action == "2":
record_list[kind].pop(name)
break
elif action == "0":
break
else:
print(f"【{action}】不是系统可识别操作符,请重试")
continue
else:
print(f"{kind}-{name}不在记录数据中,请确认后重新输入")
continue
while True:
ask = input("是否继续进行修改操作?【1】是\t【0】否\t")
if ask == "1":
break
elif ask == "0":
break
else:
print(f"【{ask}】不是系统可识别操作符,请重试")
continue
else:
break
c = open(r".\data\record.txt", "w", encoding="utf-8")
for kind in record_list:
c.write("\n" + kind + "-")
for info_name in record_list[kind]:
c.write(info_name + ":" + record_list[kind][info_name] + ";")
c.close()