项目开发——ATM购物车

今日总结

一、项目开发流程

# 公司中的项目流程几乎都可以分为以下五个步骤
'''假设我们是一家外包公司 专门给别人编写软件'''
# 1.需求分析
	产品经理带着开发部门老大(架构师、研发经理)去客户公司寻求客户的需求
  	见客户之前架构师和研发经理会先大致了解一下客户的需求
    然后琢磨出一套比较容易编写的流程
    之后在于客户交谈中引导客户按照提前设想好的流程提需求
    ps:这么做的目的是为了防止客户提出一些无厘头的要求!!!
# 2.架构设计
	架构师会根据具体的业务需求选择
  	开发的编程语言、
    项目的后端框架、
    项目所需的数据库(主库、从库)
    项目组织结构(软件开发目录规范、自定义结构)
 		项目功能划分(将一个大项目拆分成多个小项目)
    项目的报价(开发人员数量 天数等:  一个程序员一天按照1500+算)
    	还需要产品经理继续叠加报价(其他部分人员开销等)
# 3.分组开发
	将项目拆分之后的多个小项目交给不同开发部门下的多个编程人员编写
  	每个人可能只会写很小的一部分(降低复杂度 提升开发效率 缩短开发周期)
# 4.项目测试
	交给测试部门全面测试
  	语法错误千万不要提交到测试部门才被发现 这样可能会扣绩效甚至三次之后直接全铺盖走人!!!
  ps:跟测试小姐姐搞好关系 这样的话很多bug都不需要提交报告 私下提醒并修改即可
# 5.交付上线
	将项目打包给运维人员运行维护即可

二、需求分析

# 项目大致需求
  - 额度15000或自定义
  - 支持多账户登录
  - 可以查看账户余额
  - 可以提现(可自定义手续费比例)
  - 提供还款接口
  - 支持账户间转账
  - 记录每月日常消费流水
  - 实现购物商城,买东西加入购物车,调用信用卡接口结账
  - 提供管理接口,包括添加账户、用户额度,冻结账户等
  - ATM记录操作日志
  - 用户认证功能
# 提炼项目功能
  1.用户注册
  2.登录功能
  3.查看余额
  4.余额提现
  5.账户充值
  6.金额转账
  7.查看流水
  8.添加购物车
  9.查看购物车
  10.结算购物车
  11.管理员功能
# 项目大致技术栈
	1.python基础核心编程
  2.函数(装饰器)
  3.常见内置模块(os,sys,json)

三、架构设计

# 研究常见软件架构(非常重要)
	百度:
    百度账户登录 
    1.需要获取用户名和密码 然后校验用户名和密码
    2.是基于网络将用户名和密码发送到百度的后台进行校验
    3.后台去专门存储数据的地方校数据
    第一层>>>>浏览器	
    第二层>>>>后台 
    第三层>>>>数据库
    
    
  淘宝:
   	购物结算功能
    也是从数据库里结算功能肯定不会是在我们自己的计算机上
  	# 大致分了三层
    第一层>>>>浏览器	
    第二层>>>>后台 
    第三层>>>>用户数据库
'''
   很多程序其实都是三层架构
	第一层>>>:用户层只做简单的数据展示
	第二层>>>:是整个程序的核心层——做具体业务逻辑
	第三层>>>:是数据存取


开发项目的固定结构
	第一层其实叫做————前端
	第二层其实叫做————后端
	第三层其实叫做————数据库
'''

基于上述架构分析 我们也应该将ATM分为三层架构
	第一层——展示层
  	只展示功能选项 基本逻辑
	第二层——逻辑层
  	所有业务逻辑
    第三层——数据层
  	给逻辑层提供数据存取
    
  等我们学了前端之后
    展示层cmd操作 —— 可以换成页面
    逻辑层普通Python代码 —— 可以换成django框架
    数据层json文件 —— 可以换成MySQL数据库

四、分组开发

# 1.搭建项目目录
	针对启动脚本文件start.py可以放在bin目录下 也可以直接放在项目根目录
  将第二层分为三个文件(根据功能的不同)
  	start.py  # 操作文件少时,可以直接创建一个star.py文件
    conf  
    	settings.py  # 存放程序的配置文件
    lib
    	common.py  # 放公共的功能
    core
    	src.py  # 存放程序的核心代码
    interface
      user_interface  # 用户接口
      bank_interface  # 银行接口
      shop_interface  # 购物接口
    db  # 存放程序产生的数据
    log  # 记录日志记录
    readme  # 程序的说明
  
# 2.功能框架搭建
	利用空函数
  
# 3.注册功能
	为了能够让你更加清晰的理解 我们先写面条版本 然后拆分!!!

五、ATM购物车

1、搭建一个项目目录

	针对启动脚本文件start.py可以放在bin目录下 也可以直接放在项目根目录
  将第二层分为三个文件(根据功能的不同)
  	start.py  
    conf  
    	settings.py  
    lib
    	common.py 
    core
    	src.py  
    interface
      user_interface  
      bank_interface  
      shop_interface  
    db  
    log  
    readme  

qqj4pQ.jpg

2、搭建一个功能框架

# 用户注册
def register():
    pass
# 用户登录
def login():
    pass

# 查看余额
def look_balance():
    pass
  
# 余额提现
def Withdraw():
    pass

# 账户充值
def pay():
    pass

# 转账
def tranfer():
    pass

# 查看流水
def cheak_water():
    pass

# 添加购物车
def add_shop_car():
    pass


# 查看购物车
def view_shop_car():
    pass


# 结算
def clear_shop_car():
    pass

# 管理员
def admin():
    pass

# 功能字典
func_dict = {
    '1': register,
    '2': login,
    '3': look_balance,
    '4': Withdraw,
    '5': pay,
    '6': tranfer,
    '7': cheak_water,
    '8': add_shop_car,
    '9': view_shop_car,
    '10': clear_shop_car,
    '11': admin


}



while True:
    print("""
      1.用户注册
      2.登录功能
      3.查看余额
      4.余额提现
      5.账户充值
      6.金额转账
      7.查看流水
      8.添加购物车
      9.查看购物车
      10.结算购物车
      11.管理员功能
    """)

    choice = input('请输入功能编号>>>:').strip()
    if choice in func_dict:
        func_name = func_dict.get(choice)
        func_name()
    else:
        print('好好输!')
        
   
# 调用start.py文件
import os
import sys

# sys.path.append(os.path.dirname(__file__))  # 等于 base = os.path.dirname(__file__)   sys.path.append(base_dir)


base_dir = os.path.dirname(__file__)
sys.path.append(base_dir)

# 从core里面调src
from core import src

# 简易使用脚本的方式
if __name__ == '__main__':
    src.run()

3、用户注册

3.1、展示层

from ATM.interface import user_lnterface
def register():
    # 获取用户  (第一层)可以给用户看,所以说不需要拆走
    username = input('请输入用户名>>>:').strip()
    password = input('请输入密码>>>:').strip()
    again_pwd = input('请确认密码>>>:').strip()
    # 验证两次密码是否一致  也可以给用户看
    if not password == again_pwd:
        print('两次密码不一致')
        return
    #  需要验证用户是否已存在
    res = user_lnterface.check_user_interface(username)
    if res:
        print(res)
        return
    # 分好之后。我们只需要把想要的调过来使用就可以了
    msg = user_lnterface.register_interface(username, password)
    print(msg)

3.2、逻辑层

from ATM.db import db_handler  # 调用handler
def register_interface(username, password):  # 这里我们就需要传两个参数
    #  用户字典就不能给用户看到,防止修改
    user_dict = {
        'username': username,
        'password': password,
        'balance': 0,  # 默认起始金额o
        'flow': [],  # 记录流水
        'is_Admin': False,  # 验证是不是管理员
        'shop_car': {},  # 购物车
        'is_lock': False  # 用户是否被冻结
    }
    db_handler.save(user_dict)
    return f'用户{username}注册成功'

def check_user_interface(username):
    res = db_handler.select(username)
    if res:
        return '用户已存在'

3.3、数据处理层

# 数据存取层里面,专门处理存储数据
import os
import json
from ATM.conf import setting

def save(user_dict):
    username = user_dict.get('username')
    file_path = os.path.join(setting.DB_DIR, f'{username}.json')  # 拼接路径
    with open(file_path, 'w', encoding='utf8')as f:
        json.dump(user_dict, f)

def select(username):
    file_path = os.path.join(setting.DB_DIR, f'{username}.json')
    if os.path.exists(file_path):  # 判断
        with open(file_path, 'r', encoding='utf8')as f:
            return json.load(f)

4、用户登录

  • 展示层

    
    # 用户登录
    def login():
        username = input('请输入用户名>>>:').strip()
        password = input('请输入密码>>>:').strip()
        flag, data = user_lnterface.login_interface(username)
        if flag:
            if password == data.get('password'):
                print(f'用户{username}登录成功')
                is_login['username'] = username
            else:
                print('用户名或密码错误')
        else:
            print(data)
    
    
  • 逻辑层

    from ATM.db import db_handler  # 调用
    def login_interface(username):
        res = db_handler.select(username)
        if res:
            return True, res
        else:
            return False, '用户名不存在'
    
  • 处理层

    import os
    import json
    from ATM.conf import setting
    def select(username):
        file_path = os.path.join(setting.DB_DIR, f'{username}.json')
        if os.path.exists(file_path):  # 判断
            with open(file_path, 'r', encoding='utf8')as f:
                return json.load(f)
    

qqzRk6.jpg

posted @   未月  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示