luffy商城项目(一)

企业项目类型

# 1 面向互联网用户:商城类项目
    -微信小程序商城
    
# 2 面向互联网用户:二手交易类的
    -咸鱼
    -转转
  
# 3 公司内部项目:python写的重点
    -oa系统
    -打卡系统工资核算系统
    -第三方公司做的:
        -给医院 互联网,内部的项目
        -银行 内部系统
        -政府 
        -钢材市场,商户
    - 微信小程序订餐
        -二维火 餐饮行业
    -零售行业
    -问卷网
    -考试系统
    -django+simpleui:二次定制
    
# 4 个人博客

# 5 内容收费站
    -掘金
    
# 6 房屋租赁
    -青客
    -蛋壳
    -自如

 企业项目开发流程

开发流程 

    1.-立项
    2.-需求分析
        # 互联网项目
            -需求调研和分析:产品经理设计出来的
        # 传统软件
            -需求调研和分析:市场人员跟客户对接
    
    3.-原型设计:产品经理 
        -懂业务
    4.-分任务开发
        4.1-前端团队
            -UI设计
            -前端写代码(pc,小程序,移动端)
        4.1-后端团队
            -架构,数据库设计
            -分任务开发:用户,商品板块
           
        4.2-联调测试
        
    5.-项目上线

 

如果在面试的时候被问到你在公司开发流程是什么?可以按照下面的流程来

新项目

开新项目,先开会,设计技术选型,数据库设计
        -产品经理,原型图做好了
        -老大在项目管理平台(禅道)分配任务给我
        -进入到管理平台就能看到任务,相关功能的原型图
            -需求,原型图,实现的效果
        -开发---有不明白的需求,找产品对接----》自测
        -提交到版本仓库(git,svn)
        -所有都开发完了,分支合并
        -跟前端联调
        -发版:

老项目 

-老大在项目管理平台(禅道)分配任务给我
-进入到管理平台就能看到任务,相关功能的原型图
   -需求,原型图,实现的效果
-开发---有不明白的需求,找产品对接----》自测
-提交到版本仓库(git,svn)

-所有都开发完了,分支合并
-跟前端联调
-发版:

路飞项目需求

路飞项目就是一个线上销售课程的web

  -商城
       -知识付费类

需求

-首页功能
        -轮播图接口
        -推荐课程接口
-用户功能
    -用户名密码登录
    -手机号验证码登录
    -发送手机验证码
    -验证手机号是否注册过
    -注册接口

-课程列表功能
    -课程列表接口
    -排序,过滤,分页

-课程详情
    -课程详情接口
    -视频播放功能
    -视频托管(第三方,自己平台)

-下单功能
    -支付宝支付:生成支付链接,付款,回调修改订单状态
    -购买成功功能

路飞首页 

 

路飞登录注册页

 

 

 

 

 

pip换源

python中下载第三方模块

pip3 install django -i 源地址

永久换源

执行下面的配置后我们再输入pip3 install django  就会取配好的国内镜像下载

1、文件管理器文件路径地址栏敲:%APPDATA% 回车,快速进入 C:\Users\电脑用户\AppData\Roaming 文件夹中(C:\Users\admin\AppData\Roaming)
2、新建 pip 文件夹并在文件夹中新建 pip.ini 配置文件
3、新增 pip.ini 配置文件内容
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple
    [install]
    use-mirrors =true
    mirrors =https://mirrors.aliyun.com/pypi/simple
    trusted-host =mirrors.aliyun.com 

虚拟环境

Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,因为应用程序可能需要修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。
  这意味着一个Python安装可能无法满足每个应用程序的要求。如果应用程序A需要特定模块的2.0版本但应用程序B需要3.0版本,则需求存在冲突,安装版本2.0或3.0将导致某一个应用程序无法运行。

什么是虚拟环境,为什么要有它?它解决了什么问题
    -操作系统装了python3.8
        -使用django 2.2.2开发了一个项目
        -使用django 3.x 开发了一个i项目
        -把两个项目都打开,同时开发
    -每个项目都用自己独立的环境,装的模块相互不影响
    -两种解决方案:
        Virtualenv
        pipenv 

Virtualenv如何创建虚拟环境 

关于环境变量

    	-作用?一个可执行文件的路径如果加入到环境变量,以后再任意路径敲这个命令都能找到
        -系统环境变量和用户环境变量
        	-操作系统多用户
            -如果设置成系统环境变量,所有用户都能用到这个配置
            -设置成用户环境变量,只针对与当前用户(咱么设这个即可

1.  win下安装(linux和mac装virtualenvwrapper)

pip3 install virtualenv
pip3 install virtualenvwrapper-win

2. 配置环境变量

控制面板 => 系统和安全 => 系统 => 高级系统设置 => 环境变量 => 用户变量 => 点击新建 => 填入变量名与值
    变量名:WORKON_HOME  变量值:自定义存放虚拟环境的绝对路径
    eg: WORKON_HOME: D:\Virtualenvs

    去d盘根路径创建出 Virtualenvs 文件夹

 

3.  同步配置信息 

 同步配置信息:bat只是win的批处理文件,linux和mac  .sh
        去向Python3的安装目录 => Scripts文件夹 => virtualenvwrapper.bat => 双击 

4. 使用虚拟环境

确认好装在哪个解释器下

# 1、创建虚拟环境到配置的WORKON_HOME路径下
    # 选取默认Python环境创建虚拟环境:
        -- mkvirtualenv 虚拟环境名称
    # 基于某Python环境创建虚拟环境:并进入
        -- mkvirtualenv -p python2.7 虚拟环境名称
        -- mkvirtualenv -p python3.8 虚拟环境名称

    # 2、查看已有的虚拟环境
        -- workon

    # 3、使用某个虚拟环境
        -- workon 虚拟环境名称

    # 4、进入|退出 该虚拟环境的Python环境
        -- python | exit()

    # 5、为虚拟环境安装模块
        -- pip或pip3 install 模块名

    # 6、退出当前虚拟环境
        -- deactivate

    # 7、删除虚拟环境(删除当前虚拟环境要先退出)
        -- rmvirtualenv 虚拟环境名称

pycharm创建虚拟环境 

 

路飞后台创建目录调整

# 创建项目,需要选择咱们的虚拟环境创建

        -进入到虚拟环境,安装django,指定版本
        -django-admin startproject 项目名

# 使用虚拟环境创建路飞项目前,一定要先安装django,否则会以最新django创建

 

调整路飞后端项目的目录

├── luffyapi
    ├── logs/                # 项目运行时/开发时日志目录 - 包
    ├── manage.py            # 脚本文件
    ├── luffyapi/              # 项目主应用,开发时的代码保存 - 包
         ├── apps/              # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
         ├── libs/              # 第三方类库的保存目录[第三方组件、模块] - 包
         ├── settings/          # 配置目录 - 包
             ├── dev.py       # 项目开发时的本地配置
             └── prod.py      # 项目上线时的运行配置
         ├── urls.py            # 总路由
         └── utils/             # 多个模块[子应用]的公共函数类库[自己开发的组件]
    └── scripts/               # 保存项目运营时的脚本文件 - 文件夹 

dev和prod两个py文件都是有原来的settings.py文件复制而来 

 

创建app,需要来到apps目录下--->以后创建的app,就在apps目录下了
cd luffy_api/apps
python ../../manage.py startapp user

注册app
    -我们想,创建了app,以后只要在配置文件中注册app名字即可
    -需要把 apps目录,加入环境变量
    -sys.path 加入 

# 在settings中加入 
    import sys
    import os
    path = os.path.join(BASE_DIR, 'luffy_api', 'apps')
    sys.path.insert(0, path)
    print(sys.path)

-运行项目跑不起来了---》原因是--》项目运行,需要先找到配置文件,现在找不到了
    -修改 manage.py 内的代码
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.dev')
    -以后项目上线,不是使用manage.py 跑,而使用wisg.py 跑,现在先改好【目前用不到】
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.pro')
    -asgi.py 也改好【目前用不到】
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.pro') 

配置文件改了路径,BASE_DIR也就跟着变了,不是项目根路径了,修改如下
from pathlib import Path
import sys
import os

# BASE_DIR已经不是项目根路径了---》项目路径下的 luffy_api---》把小luffy_api和apps都加入到了环境变量
# 现在环境变量里有:项目根路径,把小luffy_api和apps----》以后导入模块,可以从下面三个目录下导起
BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(BASE_DIR))
path = os.path.join(BASE_DIR, 'apps')
sys.path.insert(0, path) 

如果项目不能运行了
    -先用命令运行看看:python manage.py runserver
    -如果他也不能运行,就是有问题---》就要解决问题
    -如果命令能运行,绿色箭头运行不了
        -删除,再重新建一个即可 

后端数据库创建

# 数据库使用mysql,配置mysql

之前使用root用户作为项目的数据库用户,权限太高了,一般公司里,给项目单独建立一个用户,这个用户只对当前库有权限

# mysql 创建用户并授权---》5.7
    1.管理员连接数据库
    >: mysql -uroot -p1234

    2.创建数据库
    >: create database luffy default charset=utf8;

    3.查看用户
    >: select user,host from mysql.user;
    
    4.创建用户  设置权限账号密码
    # 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'

    4.1 配置任意ip都可以连入数据库的账户
    >: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
    4.2 由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
    >: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
    
    flush privileges; #刷新权限
    #如果加root用户允许远程链接
    grant all privileges on *.* to 'root'@'%' identified by '1234';
    
    5.使用新创建的用户,登录mysql
        mysql -uluffy -p:Luffy123?

后端user表

# 用户表使用 auth的user表,现在扩写 user表

###### 1 配置使用mysql数据库
# 保护用户名密码
# os.environ  # 机器系统的环境变量
# user = os.environ.get('MS_USER')
# pwd = os.environ.get('MS_PWD')
###如果取不到,用后面的
user = os.environ.get('MS_USER','luffy')
pwd = os.environ.get('MS_PWD','Luffy123?')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',
        'USER': user,
        'PASSWORD': pwd,
        'HOST': 'localhost',
        'PORT': 3306
    }
}
# 可以使用pymysql,但是需要 打补丁
# 直接使用mysqlclient,就不需要任何操作  pip install mysqlclient

#### 2 创建user表
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True)
    # 需要pillow包的支持  pip install pillow
    icon = models.ImageField(upload_to='icon', default='icon/default.png')

    class Meta:
        db_table = 'luffy_user'  # 修改表名
        verbose_name = '用户表'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

### 3 配置文件配置
###配置用户表
AUTH_USER_MODEL = 'user.User'


###4 迁移:---一定不要忘了注册app    有可能会找不到manage.py 快捷工具
python manage.py makemigrations
python manage.py migrate

后端配置

导包报红问题

# 1 把三个目录加入到环境变量了---》项目根路径,小luffy_api,apps
    以后导入模块,可以从上述任意一个路径导入起
     from luffy_api.apps.user.models import User
     from apps.user.models import User
    from user.models import User  #这样写没问题---》但是pycharm提示错误--》让pycharm不报错
    
#2 解决Pycharm 导包爆红问题
    -在文件夹上点右键---》做成source root
    
  
# 3 总结
    # 如果在app内部,就用相对导入
    # 如果在app外部,就从apps路径导起---最短路径

封装logger

# 1 项目肯定要记录日志
    -logru
    -python内置的logging模块---》以它为例讲
    
# 2 只需要按步骤配置即可
    -1 配置文件加入:
    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用ERROR
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建,注:这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}
    -2 在utils中写common_logger.py
    import logging
    logger = logging.getLogger('django')    
    -3 以后再用的位置:
    from utils.common_logger import logger
    class TestLoggerView(APIView):
        def get(self, request):
            logger.info("info级别")
            logger.error('error级别')
            return Response('测试日志')

封装项目异常处理

from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from .common_logger import logger


def exception_handler(exc, context):
    # 只要执行到这,一定意味着程序出了异常,记录日志
    resquest = context.get('request')
    user = resquest.user.id or '未登录用户'
    path = resquest.get_full_path()
    view = str(context.get('view'))
    ip = resquest.META.get('REMOTE_ADDR')
    error = str(exc)
    logger.error('用户:[%s],访问路径:[%s],视图类是:[%s],客户端地址:[%s],出错了,错误信息是:[%s]' % (user, path, view, ip, error))  # 尽量详细

    res = drf_exception_handler(exc, context)
    # 后续咱们可以更新细粒度的区分异常:  887   886  833 分别代表什么
    if res:  # drf 异常
        detail = res.data.get('detail') or res.data or '系统异常,请稍后再试'
        return Response({'code': 999, 'msg': detail})
    else:  # 非drf异常
        return Response({'code': 888, 'msg': '系统异常:%s' % str(exc)})


REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/335334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue+ElementUI技巧分享:el-table 中实现灵活的文本换行

文章目录 前言一、使用 CSS 选择器实现换行二、使用 HTML 标签和 CSS 类实现换行三、利用数组实现每项数据单独一行四、动态生成带换行文本的表格五、完整代码演示总结 前言 Element UI 是 Vue.js 的一个流行组件库,广泛应用于构建企业级前端界面。在数据密集型的应…

Go语言基础快速上手

1、Go语言关键字 2、Go数据类型 3、特殊的操作 3.1、iota关键字 Go中没有明确意思上的enum(枚举)定义,不过可以借用iota标识符实现一组自增常亮值来实现枚举类型。 const (a iota // 0b // 1c 100 // 100d // 100 (与上一…

图像比特级置乱加密的安全性

一、概述 Liu等人[1] 提出一种冗余空间转移(简称:RST)加密算法。RST加密中,用户首先将图像分解为8个位平面,根据位平面置乱秘钥置乱图像的位平面以改变图像的像素值。接着,将位平面置乱图像分块&#xff0…

【第七在线】利用大数据与AI,智能商品计划的未来已来

随着科技的快速发展,大数据和人工智能(AI)已经成为各行各业变革的重要驱动力。在服装行业,这两大技术的结合正在深刻改变着传统的商品计划方式,引领着智能商品计划的未来。 一、大数据与AI在智能商品计划中的角色 大数据为智能商品计划提供了…

go语言(十)---- 面向对象封装

面向对象的封装 package mainimport "fmt"type Hero struct {Name stringAd intLevel int }func (this Hero) Show(){fmt.Println("Name ", this.Name)fmt.Println("Ad ", this.Ad)fmt.Println("Level ", this.Level)}func (thi…

数据结构——Java实现栈和队列

一、栈 Stack 1.特点 (1)栈是一种线性数据结构 (2)规定只能从栈顶添加元素,从栈顶取出元素 (3)是一种先进后出的数据结构(Last First Out)LIFO 2.具体实现 Java中可…

Python 并发编程

文章目录 Python 并发编程1. 基本概念1.1 CPU 密集型计算1.2 IO 密集型计算1.3 多线程,多进程,多协程的对比1.4 怎么根据任务选择对应的技术? 2. 全局解释器锁 GIL2.1 Python 速度慢的两大原因2.2 GIL 是什么?2.3 为什么有 GIL ?2.4 怎样规…

蓝桥杯备战 每日一题 (2)

今天的题目是回忆迷宫 这个题目我们来熟悉一下 弗洛伊德算法 的代码模板 弗洛伊德算法用来处理最短路径问题 弗洛伊德算法(Floyd’s algorithm)用于解决图中所有节点对之间的最短路径问题。算法的基本思路是通过逐步迭代更新节点对之间的最短路径长度&a…

力扣日记1.19-【二叉树篇】538. 把二叉搜索树转换为累加树

力扣日记:【二叉树篇】538. 把二叉搜索树转换为累加树 日期:2023.1.19 参考:代码随想录、力扣 ps:因为准备组会汇报又搁置了好久(其实就是懒逃避T^T),但这是最后一道二叉树啦啊啊啊!&#xff01…

串口通信自用

定义 串口(Serial Port)是一种用于数据通信的接口标准,它通过物理线路将数据以逐位的方式传输。串口通信可以在计算机和外部设备之间进行数据交换,常用于连接调制解调器、打印机、传感器、嵌入式系统等设备。常用的通信协议协议有…

day02:列表、表格、表单

01-列表 作用&#xff1a;布局内容排列整齐的区域。 列表分类&#xff1a;无序列表、有序列表、定义列表。 无序列表 作用&#xff1a;布局排列整齐的不需要规定顺序的区域。 标签&#xff1a;ul 嵌套 li&#xff0c;ul 是无序列表&#xff0c;li 是列表条目。 <ul>…

【信号与系统】【北京航空航天大学】实验四、幅频、相频响应和傅里叶变换

一、实验目的 1、 掌握利用MATLAB计算系统幅频、相频响应的方法&#xff1b; 2、 掌握使用MATLAB进行傅里叶变换的方法&#xff1b; 3、 掌握使用MATLAB验证傅里叶变换的性质的方法。 二、实验内容 1、 MATLAB代码&#xff1a; >> clear all; >> a [1 3 2]; …

rabbitmq的介绍、使用、案例

1.介绍 rabbitmq简单来说就是个消息中间件&#xff0c;可以让不同的应用程序之间进行异步的通信&#xff0c;通过消息传递来实现解耦和分布式处理。 消息队列&#xff1a;允许将消息发到队列&#xff0c;然后进行取出、处理等操作&#xff0c;使得生产者和消费者之间能够解耦&…

C++初阶--自我实现vector

实现模板 #include<assert.h> #include<string.h> #include<iostream> #include<list> using namespace std; namespace fnc {template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//构造函数vector(){…

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

递归、搜索与回溯算法(专题一:递归)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 接下来我会用几道题&#…

【深度学习每日小知识】Artificial Intelligence 人工智能

人工智能 (AI) 是一个快速发展的领域&#xff0c;有潜力改变我们的生活和工作方式。人工智能已经为从自动驾驶汽车到个性化医疗等各个行业做出了重大贡献。然而&#xff0c;与任何新技术一样&#xff0c;人工智能也存在许多问题和担忧。在这里&#xff0c;我们将探讨有关人工智…

【Qt开发】初识Qt

文章目录 1. Qt的背景1.1 Qt是什么1.2 Qt的发展史1.3 Qt支持的平台 2. Qt开发环境的搭建2.1 Qt SDK下载2.2 Qt SDK的安装 3. 一个简单的Qt模板程序的创建4. Qt模板程序的代码讲解4.1 main.cpp4.2 widget.h4.3 widget.cpp4.4 widget.ui4.5 test_1_18.pro4.6 一些中间文件 5. Qt在…

算法训练 day24 | 77. 组合

77. 组合 题目链接:组合 视频讲解:带你学透回溯算法-组合问题 回溯其实和递归是密不可分的&#xff0c;解决回溯问题标准解法也是根据三部曲来进行的。 1、递归函数的返回值和参数 对于本题&#xff0c;我们需要用一个数组保存单个满足条件的组合&#xff0c;还需要另一个结果数…

分布式搜索引擎ElasticSearch——深入elasticSearch

分布式搜索引擎ElasticSearch——深入elasticSearch 文章目录 分布式搜索引擎ElasticSearch——深入elasticSearch数据聚合聚合的分类DSL实现Bucket聚合DSL实现Metric聚合RestAPI实现聚合 自动补全DSL实现自动补全查询修改酒店索引库数据结构RestAPI实现自动补全查询实现酒店搜…
最新文章