type
status
date
slug
summary
tags
category
icon
password
Last edited time
Mar 30, 2024 02:05 PM
AI生成:该项目使用Python编程语言,集成MySQL和Redis数据库,实现了用户管理、支付、还款、账户管理等功能。使用了ERD实体关系图和流程图进行分析,使用了redis缓存和Alembic数据库迁移,编写了单元测试用例,使用Mock对象和patch函数进行了测试。项目地址:https://github.com/wuqicyber/payment_system_credit_card。
题目描述
负责设计和实现一个支付系统。该系统需要使用Python编程语言,并集成MySQL和Redis数据库。
要求:
- 用户管理:设计并实现一个用户管理模块,包括用户注册、登录和个人信息管理等功能。确保用户的密码安全存储,可以使用哈希算法进行加密存储。将用户信息存储到MySQL数据库中,并使用Redis进行缓存,以提高用户登录和信息访问速度。
- 支付功能:设计并实现一个支付功能模块,用户可以使用系统内的虚拟账户进行支付。将支付记录存储到MySQL数据库中。
- 还款功能:设计并实现一个还款功能模块,将还款记录存储到MySQL数据库中。
- 账户管理:设计并实现一个账户管理模块,用户可以查看账户余额、交易记录和提现等操作。确保账户信息的安全性和准确性。将账户信息存储到MySQL数据库中,并使用Redis进行缓存,以提高账户信息查询速度。
- 单元测试:编写单元测试用例,验证您实现的各个模块的功能和正确性。确保您的代码能够正确处理各种输入情况,并覆盖不同的边界条件。
- 用户界面:可以使用Postman或者Swagger来掩饰。
- 还款时间:为每个消费增加还款时间,千分之三利息+罚息(如果过了还款时间)。
分析
ERD(实体关系图)
流程图
hint:用户注册->用户登陆->信息查询&修改密码->payment(withdrawal)-> repayment -> 账单查询
说明
User Service
- Register:用户注册需要提供username,password,credit_limit这三个参数。为每个用户自动创建账户,余额(balance)为0。两个Exception:用户名已存在,用户已注册。
- login:输入正确的用户名与密码之后登陆。
- Get Info:目前存储的用户信息是用户的balance和credit_limit。
- Update Password:修改密码操作。
Transaction Service
- Payment :创建类型为“payment”的交易。
- if balance - amount of payment - interest_amount of payment < - credit_limit: #如果算上利息超过了额度
- else: # 如果算上利息超过了额度
return "Payment amount exceeds credit limit"
create payment
interests_and_penalties这张表格要更新利息
remained_unpaid_amount = amount of payment + interest_amont of payment
balance -= remained_unpaid_amount
repayment_status = 0
update db
- Withdrawal :创建类型为“withdrawal”的交易。
- if balance - amount of withdrawal - interest_amount of withdrawal < - credit_limit: #如果算上利息超过了额度
- else: # 如果算上利息超过了额度
return "Withdrawal amount exceeds credit limit"
create withdrawal
interests_and_penalties这张表格要更新利息
remained _unpaid_amount = amount of withdrawal + interest_amount of withdrawal
balance -= remained_unpaid_amount
repayment_status = 0
update db
- Repayment: 创建类型为“Repayment”的交易。
- Create repayment
- 对于每一个 repayment_status 为 0 的交易(payment,withdrawal),按照交易时间排序,一个一个计算total_amount:
- Total_amount = 罚息 + remained_unpaid_amount 罚息 = remained_unpaid_amount * 0.003 , 如果有罚息,那么interests_and_penalties这张表格要更新
- 如果repayment 的amount 够还这笔交易,那么 amount of repayment -= total_amount, repayment_status = 1
- 如果repayment 的amount 不够还这笔交易,那么 remained _unpaid_amount = total_amount - amount of repayment
- 更新balance,balance += rapayment amount
- Update db
- Get transactions: 获取交易记录
- 增加limit 与skip 两个查询参数,可分页返回结果
- 如果该用户的交易存在,那么返回交易记录。如果交易不存在,则提示不存在该用户的交易记录。
其他
- redis缓存:使用redis 对交易记录的查询以及用户信息的查询进行缓存
- Alembic 数据库迁移
- Unit test
使用了
Mock
对象来模拟数据库查询的结果,使用了patch
来替换掉datetime.now
函数和数据库查询对象的方法下为示例用法:
在Python的
unittest
模块中,mock
和patch
都是用来创建假的对象(mock objects)的。mock
是一个类,可以用它来创建任何类型的假对象。例如,我们可以创建一个假的函数:在这个例子中,
fake_func
是一个假的函数,它的返回值被我们设置为了 "Hello, world!"。还可以检查一个
Mock
对象是否被调用过,以及它被调用的方式:patch
是一个函数,通常用它在with
语句或作为装饰器来使用,用来在代码块或函数的执行期间替换掉一些对象。例如:项目地址
- 作者:很久不是自己
- 链接:https://weibo.com/article/project-1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章