家庭资产管理系统CLI版

家庭资产管理系统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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通辽汗国工部尚书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值