type
status
date
slug
summary
tags
category
icon
password
Last edited time
Jul 8, 2023 07:45 AM
仅作思路整理,比较乱。AI summary:本文介绍了基于FastAPI开发一个简单的信用卡支付系统的思路和实现。包括用户服务、支付服务、还款服务、交易记录查询、Redis缓存和后台定时任务等功能。具体实现包括ERD与表结构设计、计算需要还款的金额、查询所有需要支付的账单、对指定账单进行付款、查询还款记录、后台定时任务等。项目地址为 https://github.com/wuqicyber/credit_card
Credit Card Payment System
问题描述
1. 用户管理:设计并实现一个用户管理模块,包括用户注册、登录和个人信息管理等功能。确保用户的密码安全存储,可以使用哈希算法进行加密存储。将用户信息存储到MySQL数据库中,并使用Redis进行缓存,以提高用户登录和信息访问速度。
2. 支付功能:设计并实现一个支付功能模块,用户可以使用系统内的虚拟账户进行支付。确保支付过程安全可靠,可以使用加密技术和数字签名进行验证。将支付记录存储到MySQL数据库中
3. 还款功能:设计并实现一个还款功能模块,将还款记录存储到MySQL数据库中
4. 账户管理:设计并实现一个账户管理模块,用户可以查看账户余额、交易记录等操作。确保账户信息的安全性和准确性。将账户信息存储到MySQL数据库中,并使用Redis进行缓存,以提高账户信息查询速度。
5. 单元测试:编写单元测试用例,验证您实现的各个模块的功能和正确性。确保您的代码能够正确处理各种输入情况,并覆盖不同的边界条件。
6. 用户界面:可以使用Postman或者Swagger来掩饰。
- 还款时间:为每个消费增加还款时间,千分之三利息+罚息(如果过了还款时间)。
- 用户需要出账日,最终还款日,过了最终还款日需要收取利息和罚息
- 付款日------出账日---10天---最终还款日--------
- 出账日在用户第一次创建账户的30天后,30天一循环,最终还款日在出账日的后10天
- 利息 = 天数 * r * 本金
- 罚息 = 逾期天数 * r * 本金
- 如果最终还款日之前还款,那么不需要利息,当然也就没有罚息;如果在最终还款日之后还款,那么还需要支付利息加罚息
- 必须一次还清,repayment函数需要给出相应的还款的金额
思路整理:
用户创建,创建的时候自动绑定账户,有一个授信额度(credit_limit),不用前面的余额(balance),后续直接在这个授信额度上加减。创建用户之后自动增加出账日,在该创建日的下一个月,以每一个月一期。出账日后的10天为最终还款日。当进行新的支付时,该笔账单的最终还款日为该用户的出账日+10天。因此出账日需要自动更新。用户进行payment操作时不能超过额度。repayment函数则返回用户每一次付款操作的本金加利息加罚息的和。
如果当前日期在出账日和最后还款日之间,返回总计需要还款的金额,让用户进行还款。如果这个时候有逾期账单,那么逾期账单需要根据公式计算利息加罚息。
如果当前日期不在出账日和最后还款日之间,若当前没有逾期账单(需要一个字段来检测是否逾期),那么返回您当前不需要还款。若当前存在逾期账单,则只需要返回逾期账单需要还款的金额(根据公式计算),让用户进行还款。
考虑:将payment和repayment分别建一张表,repayment依赖于payment
ERD与表结构设计
这个表结构包含了三个类,分别是 User、Payment 和 Repayment,它们分别对应数据库中的 "users"、"payments" 和 "repayments" 三个表。
- User 类:这个类代表了一个用户,它包含了以下字段:
-
id
:用户的唯一标识符,是主键,也用于索引。-
username
:用户名,是唯一的,也用于索引。-
hashed_password
:用户的哈希密码,不允许为空。-
credit_limit
:用户的信用额度,默认值为 1000.0。-
next_billing_date
:用户的下一个出账日,可以为空。-
payments
:与 Payment 类的关系,表示用户可以有多个支付记录。-
repayments
:与 Repayment 类的关系,表示用户可以有多个还款记录。- Payment 类:这个类代表了一个支付记录,它包含了以下字段:
-
id
:支付记录的唯一标识符,是主键,也用于索引。-
principal
:支付的本金,不允许为空。-
user_id
:与 User 类的外键,表示这个支付记录属于哪个用户,不允许为空。-
timestamp
:支付的时间戳,服务器默认为当前时间。-
repayment_due_date
:还款的截止日期。-
is_overdue
:表示是否逾期,默认为 False。-
is_paid
:表示是否已还款,默认为 False。-
user
:与 User 类的关系,表示这个支付记录属于哪个用户。- Repayment 类:这个类代表了一个还款记录,它包含了以下字段:
-
id
:还款记录的唯一标识符,是主键,也用于索引。-
payment_id
:与 Payment 类的外键,表示这个还款记录对应哪个支付记录,不允许为空。-
repayment_amount
:还款金额。-
repayment_date
:还款日期,服务器默认为当前时间。-
user_id
:与 User 类的外键,表示这个还款记录属于哪个用户,不允许为空。-
user
:与 User 类的关系,表示这个还款记录属于哪个用户。-
payment
:与 Payment 类的关系,表示这个还款记录对应哪个支付记录。User Services
用户服务包括用户注册,用户登陆,用户信息查询与密码修改。
Payment Services
支付服务包括创建payment,根据payment_id查询payment和根据user_id查询payments。
Repayment Services
还款服务包括计算需要还款的金额,查询所有需要支付的账单,提供user_id与payment_id对指定的payment进行付款和查询repayments。
- 计算需要还款的金额
函数
calculate_due_amount
是用来计算一个支付记录(Payment)的应还金额的。具体流程如下:- 函数接收一个 Payment 对象作为参数。
- 首先,检查该支付记录是否已经逾期(
is_overdue
):
- 如果已经逾期,那么计算逾期天数(当前日期与还款截止日期之间的天数)和贷款天数(当前日期与支付时间截止日期之间的天数)。
- 假设日利率(r)为0.003,利息(interest)为贷款天数乘以日利率乘以本金,罚金(penalty)为逾期天数乘以日利率乘以本金。
- 应还金额为本金加上利息和罚金。
- 如果没有逾期,那么应还金额就是本金。
- 查询所有需要支付的账单
- 查询所有未支付的账单
- 查询出已经逾期的账单
- 查询出在出账日和最终还款日之间的账单
- 对指定账单进行付款
- 输入
user_id
和payment_id
。 - 查询该账单是否需要还款:
- 检查账单是否已经逾期 (
is_overdue
): - 检查当前日期是否在最后还款日的前十天内:
- 如果
is_paid
已经为 True,那么返回 "你已经付费了,不需要还款。"- 如果
is_paid
为 False,继续下一步。- 如果
is_overdue
为 True,进行还款操作,计算需要还款的金额,返回 "你已经支付了<计算需要还款的金额>。" 同时,将 is_paid
设置为 True,并更新 credit_limit
。- 如果
is_overdue
为 False,继续下一步。- 如果在,进行还款操作,计算需要还款的金额,返回 "你已经支付了<计算需要还款的金额>。" 同时,将
is_paid
设置为 True,并更新 credit_limit
。- 如果不在,返回 "还未到出账日,你当前不需要还款。"
- 查询还款记录
- 输入user_id,返回还款记录。
Others
Get Transactions
- 根据时间戳返回Payments和Repayments的交易记录。
Redis 缓存
- 对查询payments,repayments, transactions的操作进行缓存。
- 如果新增payment,那么清除查询payments和transactions的缓存
- 如果新增repayment,那么清除查询repayments和transactions的缓存
后台定时任务
- 使用
BackgroundScheduler
用于后台定时任务。来自apscheduler
这个库。
- 任务:
- 查询所有已过账单日期的用户(
next_billing_date
小于当前日期),并将他们的 next_billing_date
延后30天。- 查询所有已逾期且未支付的支付记录(
is_paid
为 False,且 repayment_due_date
小于当前日期),并将他们的 is_overdue
设置为 True。- 创建了一个后台定时任务调度器
scheduler
,并添加了任务,任务每分钟执行一次 。启动调度器。
项目地址
- 作者:很久不是自己
- 链接:https://weibo.com/e5b54a743b20438a81ee4c8efbf355ee
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。