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数据库。
要求:
  1. 用户管理:设计并实现一个用户管理模块,包括用户注册、登录和个人信息管理等功能。确保用户的密码安全存储,可以使用哈希算法进行加密存储。将用户信息存储到MySQL数据库中,并使用Redis进行缓存,以提高用户登录和信息访问速度。
  1. 支付功能:设计并实现一个支付功能模块,用户可以使用系统内的虚拟账户进行支付。将支付记录存储到MySQL数据库中。
  1. 还款功能:设计并实现一个还款功能模块,将还款记录存储到MySQL数据库中。
  1. 账户管理:设计并实现一个账户管理模块,用户可以查看账户余额、交易记录和提现等操作。确保账户信息的安全性和准确性。将账户信息存储到MySQL数据库中,并使用Redis进行缓存,以提高账户信息查询速度。
  1. 单元测试:编写单元测试用例,验证您实现的各个模块的功能和正确性。确保您的代码能够正确处理各种输入情况,并覆盖不同的边界条件。
  1. 用户界面:可以使用Postman或者Swagger来掩饰。
  1. 还款时间:为每个消费增加还款时间,千分之三利息+罚息(如果过了还款时间)。

分析

ERD(实体关系图)

notion image

流程图

hint:用户注册->用户登陆->信息查询&修改密码->payment(withdrawal)-> repayment -> 账单查询
notion image

说明

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: #如果算上利息超过了额度
    • return "Payment amount exceeds credit limit"
    • else: # 如果算上利息超过了额度
      • 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: #如果算上利息超过了额度
    • return "Withdrawal amount exceeds credit limit"
    • else: # 如果算上利息超过了额度
      • 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模块中,mockpatch都是用来创建假的对象(mock objects)的。
mock是一个类,可以用它来创建任何类型的假对象。例如,我们可以创建一个假的函数:
在这个例子中,fake_func是一个假的函数,它的返回值被我们设置为了 "Hello, world!"。
还可以检查一个Mock对象是否被调用过,以及它被调用的方式:
patch是一个函数,通常用它在with语句或作为装饰器来使用,用来在代码块或函数的执行期间替换掉一些对象。例如:

项目地址

 
我的Obsidian配置分享(1):看板与主页标点转化工具-适用于Readwise图片识别的通用转化脚本
很久不是自己
很久不是自己
我曾试图向别人描述你
公告
type
status
date
slug
summary
tags
category
icon
password
Last edited time
Jun 22, 2023 04:35 PM
💡
能窥见我的一隅,你不高兴吗?
🎉看哪这人🎉
-- 我为什么这样智慧 --
假如一个人粗俗不堪,就算无理也堪称幸福。
-- 我为什么这样聪明 --
当生命要我付出最艰苦的努力时,我反而觉得轻松,甚至非常的轻松。
-- 我为什么写出了这样的好书 --
事实上,我们每个人都不过是在给自己写信。