项目开发基础概念
1. 项目开发基础概念
1.1 企业的wed项目类型
-
1.1 B2C 直销商城 商家与会员直接交易 ( Business To Customer ),路飞等。
1.2 B2B 批发商城 商家与商家直接交易,阿里巴巴
1.3 B2B2C 购物平台 商家和会员在另一个商家提供的平台上面进行交易,京东、天猫
1.4 C2B 定制商城 会员向商家发起定制商品的需求,商家去完成,小米手机中就有个私人定制过程,它是发起投票,让大家对需求有一定的定制性,人数多的需求它就开发上,还有一些互联网+计划,定制农场之类的。
1.5 O2O 线上线下交易平台:12306、美团、饿了么等
1.6 C2C 二手交易平台 : 早起淘宝、闲鱼、人人车,产品不是这个网站自己的,是另外一个客户的
-
门户网站[企业站和门户站] 腾讯、网易、搜狐、新浪,www.qq.com (腾讯所有网站的大厅,就是门户网站,还有一些小型门户站,比如公司官网,展示自己公司信息)
-
社交网络:可以留言,评论之类的,聊天对话
-
资讯论坛:贴吧,新闻平台等
-
内部系统 :OA,TA,CRM等
-
个人博客:博客园、CSDN、51等
-
内容收费站:爱奇艺、优酷、B站、一些小说图片网站等
1.2 企业项目开发流程
前段技术博客:https://www.zhangxinxu.com/
原型出来以后,会有公司的设计人员对原型进行一些美化(ps等)和修饰,然后出设计稿,一般里面都是一些png类型图片,设计稿会再交给公司或者产品经理进行审核,审核通过之后再交给我们的前端工作人员进行静态页面的开发,并且同时其实我们的后端人员也会拿到原型之后,后端就知道前端需要什么数据了,那么后端就开始搭建服务器,进行网站架构设计,技术选型,域名申请等,服务器所需环境准备好(也就是项目代码运行环境,一些软件之类的安装),然后进行数据库设计,比如我们如果用的django,那么就需要进行models类的设计,然后进行数据库迁移指令,数据库设计的好不好,直接影响业务层面的开发和运行效率,所以很重要,并且要求比较高。然后我们需要通过后端的代码程序完成数据库数据的获取和加工,然后交给前端,完成动态数据展示。
那么在项目的功能开发的时候,我们需要记录项目开发的过程,代码的逻辑,进度等等,还需要测试我们的代码功能是不是有bug、漏洞等,我们在开发的过程中不仅仅开发人员自己要测试,还有专业的人员进行测试,一般称为QA(QA(QUALITY ASSURANCE),中文意思是“质量保证”),也就是测试部门的人。其中有单元测试(将代码中的一个函数或者一套逻辑作为一个整体来进行测试,测试一下参数或者返回值等是否有问题)QA人员是需要写代码的,往往有公司称之为测试开发人员。需要编写测试用例。
项目的在开发的过程中,可能有很多的功能,那么一个项目可能有好多人来开发,每个人开发一部分功能,然后不停的进行代码的整合、测试、使用等,那么我们就会用到代码管理和整合工具,也就是git、svn等。然后会有另外一批人,叫做集成测试人员,这些人不需要懂代码,就是拿着工具去测一下我们项目的运行效果是什么样的,能够承受多大并发量等等,就是经常说的什么性能测试、压力测试、容量测试等等,看一些我们项目运行的边界在哪里,什么时候会支撑不住,他们就是各种软件花里胡哨的用,直到测试通过了我们的立项标准才表示项目合格,然后再交给运维人员将我们的项目迁移到线上服务器,可能也会借助一些工具来进行代码部署上线,然后运维人员就需要他们借助专业知识来保证项目7*24小时不间断的运行。
1.3 立项申请阶段
立项其实就是对产品项目能不能做和怎么做,提出理论基础。大的互联网公司都有比较正规的立项流程。
立项其实就是对产品项目能不能做和怎么做,提出理论基础。大的互联网公司都有比较正规的立项流程。
产品项目立项报告一般包含以下内容:
项目概述
需求市场
需求分析和项目建设的必要性
业务分析
总体建设方案
项目风险和风险管理
可行性分析阶段
参考资料:https://blog.csdn.net/m0_37370820/article/details/81077886
2. 需求分析
但是我们现在只需要完成视频销售和视频播放这两块流程,大概有下面九个页面。
2.1 首页
功能:导航菜单、轮播图、退出登录
2..2 登录注册
功能:用户登录、极验验证码、多条件登录、记住密码、短信发送、短信冷却倒计时、jwt认证
2.3 课程列表
功能:课程分类、课程列表、课程多条件筛选展示(难点1)、课程分类展示、课程分页展示、课程章节课时展示、课程优惠策略(难点2)
2.4 课程详情
功能:课程信息展示、视频播放、富文本编辑器
2.5 购物车
功能:购物车商品列表、添加商品、删除商品、勾选商品状态、商品结算、订单生成、唯一订单号生成
2.6 商品结算
功能:订单商品信息列表、订单信息展示、积分计算功能、优惠券策略(难点)、课程有效期计算、第三方支付平台接口
2.7 购买成功
2.8 个人中心
功能列表:我的订单、订单状态改变
2.9 视频播放
功能:视频加密播放
3. 环境搭建
外部依赖
-
-
注册容联云短信接口平台的账号[https://www.yuntongxun.com/?ly=baidu-pz-p&qd=cpc&cp=ppc&xl=null&kw=10360228]
-
注册保利威视频服务平台的账号[暂时别注册,因为有个7天免费测试期,如果到时候过期了就没法用了,网址:http://www.polyv.net/?f=baiduPZ&utm_term=%E4%BF%9D%E5%88%A9%E5%A8%81]
-
注册gitee[码云]的账号
-
注册阿里云账号,如果可以购买一个服务器和域名, 或者第一次使用的可以申请一个免费外网服务器
-
如果有条件的,可以申请一个域名进行备案[ICP备案和公安部备案],如果没有的话, 可以注册natapp[内网穿透]
依赖包安装
pip3 install django -i https://pypi.douban.com/simple/ #注意:在虚拟环境中安装第三方包的时候,不要使用sudo,因为sudo是以管理员身份来安装,会将安装的东西安装到全局中去,而不是在虚拟环境中,并且在linux系统下不要出现中文路径 pip3 install djangorestframework -i https://pypi.douban.com/simple/ pip3 install PymySQL -i https://pypi.douban.com/simple/ pip3 install Pillow -i https://pypi.douban.com/simple/ pip3 install django-redis -i https://pypi.douban.com/simple/
4. 搭建项目
4.1 创建项目
cd ~/Desktop mkdir luffy cd luffy django-admin startproject luffyapi
效果:
4.2 打开项目
在pycharm中打开项目
先使用127.0.0.1:8000的网址来运行项目。
4.3 调整目录
luffy/ ├── docs/ # 项目相关资料保存目录 ├── luffycity/ # 前端项目目录 ├── luffyapi/ # 后端项目目录 ├── logs/ # 项目运行时/开发时日志目录 ├── manage.py ├── luffyapi/ # 项目主应用,开发时的代码保存 │ ├── apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存(包) │ ├── libs/ # 第三方类库的保存目录[第三方组件、模块](包) │ ├── settings/ #(包) │ ├── dev.py # 项目开发时的本地配置 │ ├── prod.py # 项目上线时的运行配置 │ ├── test.py # 测试人员使用的配置(咱们不需要) │ ├── urls.py # 总路由(包) │ ├── utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件] └── scripts/ # 保存项目运营时的脚本文件
在编辑中开发项目时,必须指定项目目录才能运行,例如,开发后端项目,则必须选择的目录是luffyapi
上面的目录结构图,使用Ubuntu的命令tree输出的。
如果没有安装tree,可以使用 sudo apt install tree,就有了。
注意:创建文件夹的时候,是创建包(含init.py文件的)还是创建单纯的文件夹,看目录里面放的是什么,如果放的是py文件相关的代码,最好创建包,如果不是,那就创建单纯的文件夹。
4.3.1 分不同环境进行项目配置
-
在项目主应用下,创建一个settings的配置文件存储目录
-
根据线上线下两种情况分别创建2个配置文件 dev.py和prod.py
-
把原来项目主应用的 settings.py配置内容复制2份到dev.py和prod.py里面
-
把原来的settings.py配置文件修改文件名或者删除
新的目录settings:
接下来,就可以根据在manage.py中根据不同的情况导入对应的配置文件了.
4.4 创建代码版本
cd 目录路径 git init
4.4.1 配置用户名和邮箱
git config --global user.name 'xxx' git config --global user.email 'xxx@163.com'
4.5 在gitee平台创建工程
常用的代码管理平台:github、gitee(码云)、codepen
如果公司自己搭建的代码管理平台,gitlab框架
1) 创建私有项目库
创建私有空仓库以后的界面:
注意:
我们当前项目不需要这个步骤
这个步骤是 当以后我们进入公司里面,参与人家已经在做的项目时,别人已经有仓库了,但是我们是新人加入项目中的,那么我们不需要在自己本地进行git init,直接git clone 复制别人的仓库代码
git clone 仓库地址
注意,如果当前目录下出现git仓库同名目录时,会克隆失败。
3)创建并切换分支到dev
# git branch dev # 创建本地分支dev,dev是自定义 # git checkout dev # 切换本地分支代码 git checkout -b dev # 这里是上面两句代码的简写
git提交
git add 代码目录 # 添加代码到上传队列 git status # 查看当前项目的版本状态 git commit -m '添加项目代码' # 提交代码到本地仓库, -m 表示本次提交的描述
推送到远端
git push origin dev:dev
如果推送代码,出现以下提示: git pull ....,则表示当前本地的代码和线上的代码版本不同.
1. 把线上的代码执行以下命令,拉取到本地,进行同步 git pull 2. 根据提示,移除多余的冲突的文件,也可以删除. 完成这些步骤以后,再次add,commit,push即可.
接下来,我们就把上面创建好的本地项目提交到gitee码云上面
# .表示当前目录下所有的文件或目录提交到上传队列[上传队列也叫"暂存区"] git add . # 把本地上传队列的代码提交到本地仓库 git commit -m "项目初始化搭建" # 给本地的git版本控制软件设置项目的远程仓库地址 git remote add origin https://gitee.com/mooluo/luffyproject.git # 提交代码给远程仓库 git push -u origin master
扩展: 1. 通过 git status 可以查看当前项目的代码版本状态 2. 通过 git reflog 可以查看代码版本日志[简单格式] 3. 通过 git log 可以查看代码版本日志[详细格式] 4. 删除分支 git branch -D 分支名称 注意,不能删除当前所在分支,必须切换到别的分支上才能进行删除
最终,成功提交了代码版本到gitee平台。效果:
所以,我们针对一些不需要的文件,可以选择从代码版本中删除,并且使用.gitignore
把这些垃圾文件过滤掉。
git rm 文件 # 删除单个文件 git rm -rf 目录 # 递归删除目录 # 以下操作建议通过终端来完成,不要使用pycharm提供,否则删除.idea还会继续生成。 git rm -rf .idea git rm db.sqlite3 # 注意,上面的操作只是从项目的源代码中删除,但是git是不知情的,所以我们需要同步。 git add . git commit -m "删除不必要的文件或目录" git push -u origin master
vim .gitignore index.html .gitignore ./lyapi/idea ./lyapi/idea/* ./git ./lyapi/db.sqlite3
开发时我们经常会使用pycharm的提供的git管理工具来完成代码的拉取和推送。
4.6 日志配置
django官方文档
在settings/dev.py文件中追加如下配置:
# 日志配置 LOGGING = { 'version': 1, #使用的python内置的logging模块,那么python可能会对它进行升级,所以需要写一个版本号,目前就是1版本 'disable_existing_loggers': False, #是否去掉目前项目中其他地方中以及使用的日志功能,但是将来我们可能会引入第三方的模块,里面可能内置了日志功能,所以尽量不要关闭。 'formatters': { #日志记录格式 'verbose': { #levelname等级,asctime记录时间,module表示日志发生的文件名称,lineno行号,message错误信息 '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': { #在debug=True下产生的一些日志信息,要不要记录日志,需要的话就在handlers中加上这个过滤器,不需要就不加 '()': 'django.utils.log.RequireDebugTrue', }, 'require_debug_false': { #和上面相反 '()': 'django.utils.log.RequireDebugFalse', }, }, 'handlers': { #日志处理方式,日志实例 'console': { #在控制台输出时的实例 'level': 'DEBUG', #日志等级;debug是最低等级,那么只要比它高等级的信息都会被记录 'filters': ['require_debug_true'], #在debug=True下才会打印在控制台 'class': 'logging.StreamHandler', #使用的python的logging模块中的StreamHandler来进行输出 'formatter': 'simple' }, 'file': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 日志位置,日志文件名,日志保存目录必须手动创建 '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': { #和django结合起来使用,将django中之前的日志输出内容的时候,按照我们的日志配置进行输出, 'handlers': ['console', 'file'], #将来项目上线,把console去掉 'propagate': True, #冒泡:是否将日志信息记录冒泡给其他的日志处理系统,工作中都是True,不然django这个日志系统捕获到日志信息之后,其他模块中可能也有日志记录功能的模块,就获取不到这个日志信息了 }, } }
4.7 异常处理
新建utils/exceptions.py
from rest_framework.views import exception_handler from django.db import DatabaseError from rest_framework.response import Response from rest_framework import status import logging logger = logging.getLogger('django') def custom_exception_handler(exc, context): """ 自定义异常处理 :param exc: 异常类 :param context: 抛出异常的上下文 :return: Response响应对象 """ # 调用drf框架原生的异常处理方法 response = exception_handler(exc, context) if response is None: view = context['view'] if isinstance(exc, DatabaseError): # 数据库异常 logger.error('[%s] %s' % (view, exc)) response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE) return response
settings/dev.py配置文件中添加
REST_FRAMEWORK = { # 异常处理 'EXCEPTION_HANDLER': 'luffyapi.utils.exceptions.custom_exception_handler', }
4.8 创建数据库
create database luffy default charset=utf8mb4; -- utf8也会导致有些极少的中文出现乱码的问题,mysql5.5之后官方才进行处理,出来了utf8mb4,这个是真正的utf8,能够容纳所有的中文,其实一般情况下utf8就够用了。
为当前项目创建数据库用户[这个用户只能看到这个数据库]
create user luffy_user identified by 'luffy'; grant all privileges on luffy.* to 'luffy_user'@'%'; flush privileges; mysql -u luffy_user -pluffy select user(); #luffy_user
4.9 配置数据库连接
打开settings/dev.py文件,并配置
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "HOST": "127.0.0.1", "PORT": 3306, "USER": "luffy_user", "PASSWORD": "luffy", "NAME": "luffy", } }
import pymysql pymysql.install_as_MySQLdb()
调整错误
数据库版本检测导致的错误
数据库的版本检测代码注释掉。
新增一行代码,把query查询结果转换格式为 bytes类型
luffyapi项目后端基本就配置完了,下面搞一下前端客户端。
5. 搭建前端项目
5.1 创建项目目录
cd 项目目录 vue init webpack lufei_pc
例如,我要把项目保存在~/Desktop桌面目录下,可以如下操作:
cd ~/Desktop vue init webpack lufei_pc
5.2 前端初始化全局变量和全局方法
在src目录下创建settings.js站点开发配置文件:
export default { Host:"http://127.0.0.1:8080", }
在main.js中引入
import settings from "./settings" Vue.prototype.$settings = settings; #将settings中的内容作为vue的属性,以后就不用每次都导包了
reset.css
body{ margin: 0; padding: 0; } ul{ list-style: none; padding: 0; margin: 0; } li{ list-style: none; } /*.el-header{*/ /* width: 1200px;*/ /*}*/ input,select,textarea{ border: none; outline: none; } a{ text-decoration: none; color: #4a4a4a; }
main.js
import "../static/css/reset.css";