项目概述
课程内容:
- 软件开发整体介绍
- 瑞吉点餐项目介绍
# 项目概况
# 项目背景
时间:某年寒假
地点:菩提阁餐厅
人物:软件工程专业大学生小王,菩提阁餐厅老板老王,父子关系
事件:小王在寒假期间帮忙打理父亲的餐厅,发现每天客户订餐量非常大,但是餐厅还是传统的电话接单方式,效率低下而且容易漏单,所以决定利用学校所学知识开发一套在线订餐系统,并且系统开发完成后,还可以推销给其他餐厅,可以赚点外快
问题:由于小王在学校学习的知识以后端开发为主,对于前端页面的编写并不熟练,所以决定联系一下在软件公司做前端开发的表姐帮忙来编写页面
项目背景理解
该项目是大学生小王,为了提高父亲老王经营餐厅的效益,利用自己大学学到的编程知识,开发的一套在线订餐系统。
# 项目效果
- 用户端
- 系统后台管理端
# 实施计划
- 第一阶段:整体完成系统功能,由0至1;
- 第二阶段:优化、扩展系统功能,由1至100。
注意
在项目实战开始前,我们还需要再了解两部分内容:
- 企业软件开发整体介绍
- 瑞吉外卖项目介绍
# 软件开发整体介绍
作为一名软件开发工程师,我们需要了解软件开发过程中的流程,以及涉及到的岗位角色分工,并要了解软件开发中涉及到的三种软件环境。那么这一小节,我们将从软件开发流程、角色分工、软件环境三个方面来整体学习一下企业软件开发。
- 企业软件开发流程
- 项目组成员角色分工
- 软件环境介绍
# 软件开发流程
- 第一阶段:需求分析,完成产品原型、需求规格说明书的编写。
产品原型,一般是通过网页(HTML
)的形式展示项目的功能,比如,每个页面展示什么样的数据,页面的布局是什么样子,点击某个菜单,打开什么页面,点击某个按钮,出现什么效果,都可以通过产品原型看到。
需求规格说明书,一般来说就是使用Word文档来描述当前项目有哪些功能,每一项功能的需求及业务流程是什么样子的,这些都会在文档中描述。
- 第二阶段:设计
设计的内容包括产品设计、UI界面设计、概要设计、详细设计、数据库设计等。
在设计阶段,会产出相关的UI界面和设计文档。比如,数据库设计,需要设计当前项目中涉及到哪些数据库,每一个数据库里面包含哪些表,这些表之间的关系如何,表中包含哪些字段,字段类型都会在文档中描述清楚。
- 第三阶段:编码
编写项目代码、并完成单元测试。
作为开发工程师,主要工作就是在该阶段,对分配给我们的模块功能,进行编码实现。编码实现完毕后,进行单元测试,单元测试通过后才能进入到下一阶段--测试阶段。
- 第四阶段:测试
在该阶段主要由测试人员,对部署在测试环境的项目进行业务测试,并产出测试报告。
- 第五阶段:上线运维
在项目上线之前,会由运维工程师准备服务器上线的运行环境,比如操作系统、JDK、数据库等,然后再将开发好的项目编译打包,部署在服务器上运行。
作为开发工程师,我们主要的任务是在编码阶段,不过在一些小的项目组中,也会涉及到数据库的设计、测试等方面的工作。
# 角色分工
了解完软件开发的流程之后,下面我们在介绍一下整个软件开发过程中涉及到的岗位角色,以及各个角色的职责分工。
岗位/角色 | 职责/分工 |
---|---|
项目经理 | 对整个项目负责,任务分配、把控进度 |
产品经理 | 进行需求调研,输出需求调研文档、产品原型等 |
UI设计师 | 根据产品原型输出界面效果图 |
架构师 | 项目整体架构设计、技术选型等 |
开发工程师 | 功能代码实现 |
测试工程师 | 编写测试用例,输出测试报告 |
运维工程师 | 软件环境搭建、项目上线 |
上述的角色分工,是在一个项目组中比较标准的角色冯巩,但是在实际的项目中,有一些项目中由于人员配置紧张,可能并没有专门的架构师或测试人员,这个时候可能需要有项目经理或程序员兼任。
# 软件环境
在日常软件开发中,我们一般会接触到三套环境,分别是:开发、测试、生产环境。下面我们就分别来介绍一下这三套环境的特点和作用。
- 开发环境(development)
这个环境是开发人员在开发阶段使用的环境,一般外部用户无法访问。比如,开发中使用的MySQL数据库和其他的一些常用软件,开发者可以将这些软件安装在本地,也可以安装在一台专门的服务器上,它们仅仅在软件开发过程中使用,项目测试、上线时,不会使用这套环境,这个环境就是开发环境。
- 测试环境(testing)
当开发者将项目的业务功能开发完成,并且单元测试通过后,就需要将项目编译打包部署到测试服务器上,交由测试人员对项目进行测试。这套环境就是专门给测试人员使用的环境,也就是测试环境,主要用于项目测试,一般外部用户无法访问。
- 生产环境(production)
项目开发完成,并由测试人员测试通过后,就可以上线了。此时需要将项目部署到线上环境,并正式对外提供服务,这个线上环境也称之为生产环境。
拓展
准生产环境:有的企业,项目开发完成并测试通过后,并不是直接上生产环境。他们为了保证项目上线之后不出问题,一般需要将项目部署到真实的环境中,测试一下是否完全符合要求,这时就诞生了准生产环境,它其实就是生产环境的克隆,准生产环境的服务器配置、JDK、Tomcat、数据库、中间件等应用软件和生产环境的版本都是一样的,准生产环境也称为仿真环境。
是否需要准生产环境,是和项目的性质、类型有关的,并不是每个项目都有准生产环境。
# 项目需求分析
上面我们已经了解企业软件开发涉及到的流程、角色、环境等信息,下面我们就结合企业软件开发场景来介绍下瑞吉点餐这个项目。
咱们回归到瑞吉点餐这个项目的项目背景,小王计划开发一个在线点餐系统,但是他意识到无法一个人将该项目开发完成,此时他就找到了曾在软件企业担任过开发经理的老师,也就是我来支持他的工作。
我接到小王的请求后,计划以企业软件开发流程的五个阶段来协助小王完成这个瑞吉点餐项目的开发。
# 用例分析
首先,是需求分析阶段,由于小王项目经验有限,此时就需要我客串一下产品经理的岗位。通过与小王、老王沟通,我大致了解到这个项目的一个用途:本项目,也即是瑞吉点餐系统是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,小王的初衷是为老王经营的菩提阁餐厅开发一款在线点餐系统。了解完这些,我就要针对这个项目做一个用例分析,确定系统中涉及到哪些用户(角色)、每种用户使用哪些系统功能?经过我分析,产出了下面一张系统用例图:
# 原型设计
上面用例分析阶段已经针对瑞吉点餐系统做了简单分析,但系统最终是什么样子还不是很直观。由于我现在还在兼职产品经理岗,产品原型设计这块工作还得由我负责。
产品原型:就是一款产品成型之前,由产品经理绘制的一个简单的页面框架,主要作用就是将页面的排版布局展现出来,使产品的初步构思有一个可视化的展示。通过原型,可以更加直观的了解项目的需求和具有的功能。
注意
产品原型主要用于展示项目的功能呢,并不是最终的页面效果。
经过我的不懈努力,产品原型最终设计如下:
瑞吉点餐项目分为管理端和用户端,管理端主要供餐饮企业内部员工使用。主要功能有:
模块 | 描述 |
---|---|
登录/退出 | 内部员工必须登录后,才可以访问系统管理后台 |
员工管理 | 管理员可以在系统后台对员工信息进行管理,包含查询、新增、编辑、禁用等功能 |
分类管理 | 主要对当前餐厅经营的 菜品分类 或 套餐分类 进行管理维护, 包含查询、新增、修改、删除等功能 |
菜品管理 | 主要维护各个分类下的菜品信息,包含查询、新增、修改、删除、启售、停售等功能 |
套餐管理 | 主要维护当前餐厅中的套餐信息,包含查询、新增、修改、删除、启售、停售等功能 |
订单明细 | 主要维护用户在移动端下的订单信息,包含查询、取消、派送、完成,以及订单报表下载等功能 |
下面我们再来看下用户端,用户端主要提供给消费者使用,主要功能有:
模块 | 描述 |
---|---|
登录/退出 | 在移动端, 用户也需要登录后使用APP进行点餐 |
点餐-菜单 | 在点餐界面需要展示出菜品分类/套餐分类, 并根据当前选择的分类加载其中的菜品信息, 供用户查询选择 |
点餐-购物车 | 用户选中的菜品就会加入用户的购物车, 主要包含 查询购物车、加入购物车、删除购物车、清空购物车等功能 |
订单支付 | 用户选完菜品/套餐后, 可以对购物车菜品进行结算支付, 这时就需要进行订单的支付 |
个人信息 | 在个人中心页面中会展示当前用户的基本信息, 用户可以管理收货地址, 也可以查询历史订单数据 |
# 系统设计
上面我以产品经理的角色,已经完成了瑞吉点餐项目的需求调研、用例分析、原型设计等工作,至于其他需求文档的编写,考虑到时间问题,此处我们就省略了。下面我们就开始设计阶段的工作,而我的岗位也将由产品经理切换为架构师。
# 功能架构
首先,是我们项目的功能架构,前面用例分析时已经介绍过,此处不过多赘述。
- 用户端
主要功能有登录退出、地址管理、菜品规格浏览、购物车功能、下单结算等。
- 管理端
主要功能有登录退出、员工信息管理、菜品分类管理、菜品管理、套餐管理、订单管理等功能。
# 技术选型
作为架构师,要充分考虑业务系统功能以及开发团队成员技术栈,选用合适的技术来开发项目,也就是技术选型。针对本项目的技术选型,我将会从用户层、网关层、应用层、数据层这四个方面进行说明。
从上面的图中可以看出,本次选用的技术大部分都是我们之前学习过的。
- 用户层
本项目在构建用户端、管理端的前端页面时,我们会用到H5、Vue.js、ElementUI等技术。
- 网关层
网关层我们主要使用Nginx来实现,该项技术大家会比较陌生,不过没有关系,后面我们会进行讲解学习的。Nginx是一个服务器,主要用来作为Http高性能服务器,部署静态资源。它还有两个比较重要的作用:反向代理和负载均衡,在进行项目部署时,要实现Tomcat的负载均衡,就可以通过Nginx来实现。
- 应用层/服务层
SpringBoot: 快速构建Spring项目,采用约定优于配置的思想,简化Spring项目的配置开发。
Spring: 统一管理项目中的各种资源(bean
),在web开发的各层都会用到。
SpringMVC: SpringMVC是Spring框架的一个模块,SpringMVC和Spring无需通过中间整合层进行整合,可以无缝集成。
SpringSession: 主要解决在集群环境下的Session共享问题。
Lombok: 能以简单的注解形式来简化Java代码,提高开发人员的效率,例如省略getter/setter
方法,各种构造方法、equals
等方法的书写。
Swagger*: 可以自动的帮助开发人员生成接口文档,并对接口进行测试。
- 数据层
MySQL: 关系型数据库,本项目的核心业务数据都将存储到MySQL中。
MyBatis-Plus: 本项目持久层将会采用MyBatis-Plus来简化开发,基本的单表增删改查直接调用框架提供的方法即可。
Redis: 基于key-value格式存储的内存数据库,访问速度快,经常使用它做缓存,在第二阶段的性能优化中会使用到。
- 工具
git: 代码版本控制工具,使用该工具对项目的代码进行管理。
Maven: 项目构建工具
Junit: 单元测试工具,业务功能编码完成后,需要通过Junit对功能进行单元测试。
# 数据库设计
在技术选型完成以后,接下来概设、详设、数据库设计了。考虑到时间问题,概设、详设我们就省略吧,直接进行数据库设计。在JavaWeb阶段我们也将结果数据库设计的相关内容,那么数据库设计的内容是什么呢?哪位同学来回答一下。对的,数据库设计最终目的就是确定系统有哪些数据库,每个数据库有哪些表,每个表应该包含哪些字段,以及这些表之间的关联关系。
但是,考虑外键约束会影响数据库性能,因此本项目的数据库设计都没有添加外键约束,后面我们在做具体模块时,在具体分析相关表的关联关系。下面就是经过分析设计出的数据库E-R图。
在数据库设计完成以后,接下来我们就要搭建开发环境,为系统编码做准备了。