项目开发流程及atm+ 购物车代码优化

项目开发流程

# 1.需求分析
产品经理带着开发部门老大,去客户公司寻求客户的需求
见客户之前架构师和研发经理会先大致了解客户的需求然后琢磨出一套比较容易编写的流程,之后在于客户交谈的中引导客户按提前设想好的流程提需求
# 2.架构设计
架构师根据具体的业务需求进行选择  
开发的编程语言
项目的后端框架
项目需要的数据库(主库,从库)
项目组织结构(软件开发目录规范,自定义结构)
项目功能划分(将一个大项目拆分成多个小项目)
项目报价(开发人员数量 天数等:一个程序员按照1500+计算)
# 3.分组开发
将项目拆分后的多个小项目交给不同开发部门下的多个编程人员编写
每个人致谢很小一部分(降低复杂度 提升开发效率缩短开发周期)
# 4.项目测试
交给测试部门全面测试
语法错误千万不要提交到测试部门后才被发现,这样会被扣绩效,甚至有的公司三次之后直接走人
# 5.交付上线
将项目打包给运维人员运行维护
"""
小公司可能需要你一个人完成上面所有的事情
	小公司很累 但是成长速度很快(整体参与)
	大公司轻松 但是成长速度缓慢(只拧螺丝)
"""

ATM项目

需求分析

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

架构设计

'''
根据功能的不同划分不同的文件,类似于大型公司 有很多部门,部门里又有很多小组,拆分成不同的部门、不同的组,让他们各自干各自擅长的事情,目的是为了进行精细化管理,提高效率   
'''
# 大型网站的架构研究
百度:
    百度账户登录 
    	需要获取用户名和密码 然后校验用户名和密码
      	问:在哪里校验?
          	肯定不在你的电脑上(如果在 难道所有人的数据你的电脑上都有?)
        是基于网络将用户名和密码发送到百度的后台进行校验
        		后台去专门存储数据的地方校数据
    # 大致分了三层
    	浏览器	后台 数据库
淘宝:
   	购物结算功能
    	商品价格的最终核算和账户扣款在哪里完成
      	肯定不在你当前计算机上!!!
  	# 大致分了三层
    	浏览器 后台 用户数据库
'''
我们称之为三层架构,或者是‘三明治结构’
第一层用户层只做简单的数据展示   		前端

第二层是整个程序的核心层        	  后端
	做具体业务逻辑
	
第三层是数据存取			  		数据库
'''
基于上述架构分析 我们也应该将ATM分为三层架构
# 展示层
	只展示功能选项 基本逻辑
# 逻辑层
  	所有业务逻辑都写在这里
# 数据层
  	给逻辑层提供数据存取
'''
ATM架构牛逼之处!!!
	程序的扩展性非常的强
  	比如展示层等我们以后学了前端可以直接替换成页面
    	展示层目前是cmd操作 可以换成页面
    核心逻辑层以后学了框架之后替换成框架
    	逻辑层目前是普通的python代码 可以换成django框架
    数据存取层以后学了数据库直接替换成数据库
    	数据层目前是json文件 可以换成MySQL数据库
'''

分组开发

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

代码示例

src.py

from interface import user_interface
from interface import shop_interface
from interface import bank_interface
from lib import common

dic_verify = {'is_login': 'jason'}
user_now = dic_verify.get('is_login')


# print(user_now)

def register():
    username = input('请输入用户名:').strip()
    pwd = input('请输入密码:').strip()
    pwd_second = input('请再次输入密码:').strip()
    if pwd == pwd_second:
        # 密码加密
        pwd = user_interface.pwd_hd5(pwd)
        flag = user_interface.verify_username(username)
        if flag:
            print('用户名已存在')
            return
        else:
            user_interface.creat_user(username, pwd)
            print('用户注册成功')
            res = common.creat_log('注册信息')
            res.debug(f"用户{username}注册成功")
            return
    else:
        print('两次密码不同')


# register()


def login():
    username = input('请输入用户名:').strip()
    pwd = input('请输入密码:').strip()
    # 对密码进行加密
    pwd = user_interface.pwd_hd5(pwd)
    # 校验用户名
    if user_interface.verify_username(username):
        if user_interface.verify_pwd(username, pwd):
            print('登录成功')
            res = common.creat_log('登录信息')
            res.debug(f"用户{username}登录成功")
        else:
            print('密码错误')
    else:
        print('用户名不存在')


# login()

def view_amount():
    amount = user_interface.get_amount(user_now)
    print(f'您当前余额为{amount}元')
    res = common.creat_log('查看余额')
    res.debug(f"用户{user_now}查看了他的余额")


# view_amount()


def get_money():
    pass


def recharge():
    pass


def transfer():
    which_user = input('您希望转给谁:')
    how_many = input('转账金额:')
    if user_interface.transfer_money(user_now, which_user, how_many):
        print(f'您成功的向{which_user}转账{how_many}元')
        res = common.creat_log('转账')
        res.debug(f"用户{user_now}{which_user}进行了转账")
    else:
        print('转账失败')
        res = common.creat_log('转账')
        res.debug(f"用户{user_now}{which_user}转账失败")


# transfer()

def buy_history():
    flow = user_interface.history_list(user_now)
    for i in flow:
        print(i)
        res = common.creat_log('查看流水')
        res.debug(f"用户{user_now}查看了字自己的消费记录")


# buy_history()

def add_shop():
    print('1.鸡蛋       1元\n'
          '2.泡面       5元\n'
          '3.老干妈     10元\n'
          '4.笔记本电脑  20000元\n')
    good_choice = input('请输入想要购买物品的编号:')
    good_count = input('请输入您要购买的数量:')
    shop_interface.add_good(user_now,good_choice,good_count)
    print('添加购物车成功')
# add_shop()



def look_shop():
    pass


def clear_shop():
    pass


def admin():
    pass

user_interface.py

from db import db_contor
from lib import common
import hashlib
import datetime
import os

md5 = hashlib.md5()


def verify_username(username):
    info, flag = db_contor.select(username)
    return flag


def verify_pwd(username, pwd):
    # 获取用户信息文件路径
    a = username + '.json'
    path = common.get_path('db', a)
    userinfo = db_contor.read_json(path)
    user_pwd = userinfo['pwd']
    if user_pwd == pwd:
        return True
    else:
        return False


def creat_user(username, pwd):
    userdic = {
        'username': username,
        'pwd': pwd,
        'balance': 15000,  # 初始化金额
        'flow': [],  # 记录用户流水
        'shop_car': {},  # 记录购物车数据
        'is_lock': False,  # 记录账号是否被锁定
        'is_admin': False,  # 记录是否是管理员
    }
    # 获取用户文件目录
    h = username + '.json'
    path = common.get_path('db', h)
    # 创建用户文件
    db_contor.write_json(userdic, path)


# creat_userdic('jason','123')

def pwd_hd5(pwd):
    md5.update(pwd.encode('utf8'))
    pwd_dark = md5.hexdigest()
    return pwd_dark

def get_amount(username):
    a = username + '.json'
    path = common.get_path('db', a)
    userinfo = db_contor.read_json(path)
    amount = userinfo['balance']
    return amount

# print(get_amount('jason'))


def transfer_money(who,which,how):
    # 获取用户信息文件路径
    a = who + '.json'
    path_who = common.get_path('db', a)
    b = which + '.json'
    path_which = common.get_path('db', b)
    if os.path.exists(path_which):
        # 读取转账用户信息对余额进行判断
        userinfo_who_dic = db_contor.read_json(path_who)
        if userinfo_who_dic['balance'] > int(how):
            userinfo_who_dic['balance'] = userinfo_who_dic['balance'] - int(how)

            # 记录流水
            now = datetime.datetime.now()
            buy_info = str(now) + '  ' + '向' + which + '转账' + how + '元'
            flow = userinfo_who_dic['flow']
            # flow = list[flow]
            flow.append(buy_info)
            userinfo_who_dic['flow'] = flow
            # 写入用户信息
            db_contor.write_json(userinfo_who_dic,path_who)

            # 对接收用户信息进行修改
            userinfo_which_dic = db_contor.read_json(path_which)
            userinfo_which_dic['balance'] = userinfo_which_dic['balance'] + int(how)
            # 记录流水
            now = datetime.datetime.now()
            buy_info = str(now) + '  ' + '接收' + who + '的转账' + how + '元'
            flow = userinfo_which_dic['flow']
            # flow = list[flow]
            flow.append(buy_info)
            userinfo_which_dic['flow'] = flow
            # 写入用户信息
            db_contor.write_json(userinfo_which_dic, path_which)
            return True
        else:
            return False

    else:
        return None
# transfer_money('jason','tom','1000')

def history_list(username):
    # 获取用户文件路径
    a = username + '.json'
    path = common.get_path('db',a)
    # 获取用户信息
    userinfo = db_contor.read_json(path)
    # 获取流水列表
    flow = userinfo['flow']
    return flow

shop_interface.py

from db import db_contor
from lib import common
import hashlib
import datetime
import os
def add_good(username,choice,goodcount):
    good_price_dic = {'1': 1, '2': 5, "3": 10, "4": 20000}
    good_name_dic = {'1':'鸡蛋','2':'泡面','3':'老干妈','4':'笔记本电脑'}
    goodprice = good_price_dic[choice]
    goodname = good_name_dic[choice]
    # 打开用户信息存储文件,获取购物车字典,并进行修改
    a = username + '.json'
    path = common.get_path('db',a)
    userinfo = db_contor.read_json(path)
    good_dic = userinfo['shop_car']
    good_dic[goodname] = [goodcount,goodprice]
    # 修改用户信息字典
    userinfo['shop_car'] = good_dic
    # 修改用户信息文件
    db_contor.write_json(userinfo,path)

common.py

import os
from conf import setting
import logging.config

def get_path(*args):
    '''
    传入的参数将会与项目根目录的路径进行拼接
    '''
    a = os.path.dirname(os.path.dirname(__file__))
    b = os.path.join(a, *args)
    return b


def creat_log(msg):
    logging.config.dictConfig(setting.LOGGING_DIC)  # 自动加载字典中的配置
    logger1 = logging.getLogger(msg)
    return logger1
posted @   名字只需六字  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示