热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前后端分离开发模式介绍

1.1什么是前后端分离前后端分离是目前一种非常流行的开发模式,它使项目的分工更加明确:后端:负责处理、存储数据前端:负责显示数据前端和后端开发人员通过接口进行数据的交换。1.2为什

1.1 什么是前后端分离

前后端分离是目前一种非常流行的开发模式,它使项目的分工更加明确:



  • 后端:负责处理、存储数据

  • 前端:负责显示数据

前端和后端开发人员通过 接口 进行数据的交换。


1.2 为什么要进行前后端分离



  • 前后端可以身心愉快地专注于各自擅长的领域

  • 避免后端写前端代码(基本上1天时间,20%写后端代码,80%写页面…)

  • 前端配置后端代码运行环境(简直是要疯… 装一堆环境,而且有些开发环境是windows,前端是macos,装环境就要装好几天)

  • 避免前后端打架,推诿,甩锅…

  • 提高开发效率

  • 分离有助于前端大放异彩,后端专注于三高(高并发、高性能、高可用)

  • 太多了…


1.3 前后端分离存在的问题



  1. 当接口改变的时候,非常麻烦–

  2. 需要前后端人员联调–联调开发的时间(开发+测试+联调)占项目的 15%–60%


1.4 如何分离


1.4.1 职责分离



  • 前后端仅仅通过异步接口(AJAX/JSONP)来编程

  • 前后端都各自有自己的开发流程,构建工具,测试集合

  • 关注点分离,前后端变得相对独立并解耦合


1.4.2 开发流程



  • 后端编写和维护接口文档,在 API 变化时更新接口文档

  • 后端根据接口文档进行接口开发

  • 前端根据接口文档进行开发 + Mock平台

  • 开发完成后联调和提交测试

推荐几个接口规范工具:postman、eolinker


1.4.3 规范原则



  • 接口返回数据即显示:前端仅做渲染逻辑处理;

  • 渲染逻辑禁止跨多个接口调用;

  • 前端关注交互、渲染逻辑,尽量避免业务逻辑处理的出现;

  • 请求响应传输数据格式:JSON,JSON数据尽量简单轻量,避免多级JSON的出现;


1.5 数据格式


1.5.1 请求格式–统一的数据请求格式























get请求http://localhost:8080/user/1
http://localhost:8080/user?id=1
post请求http://localhost:8080/user
put请求http://localhost:8080/user
delete请求http://localhost:8080/user/1

1.5.2 响应格式–统一的返回结果



  • 基本格式

{
"code": 20000,
"msg": "success"
}

code : 请求处理状态(可以根据业务自行添加)



  • 20000 成功

  • 20001 失败
    msg:请求处理消息(可以根据业务自行添加)
    响应实体格式

{
"code": 20000,
"msg": "success",
"data": [
"entity":
{
"id": 1,
"name": "XXX",
"phone": "XXX"
}
]
}

响应列表格式

{
"code": 20000,
"msg": "success",
"data":
{
"list":[
{
"id": 1,
"name": "XXX",
"code": "XXX"
},
{
"id": 2,
"name": "XXX",
"code": "XXX"
},
{
"id": 3,
"name": "XXX",
"code": "XXX"
}
]
}
}

响应分页格式

{
"code": 200,
"msg":"success",
"data":
{
"totalCount": 2,
"totalPage": 1
"pageNo": 1,
"pageSize": 10,
"list": [

{
"id": 1,
"name": "XXX",
"code": "H001"
},
{
"id": 1,
"name": "XXX",
"code": "H001"
},
{
"id": 1,
"name": "XXX",
"code": "H001"
}
],
}
}


  • data.totalCount: 总记录数

  • data.pageNo: 当前页码

  • data.pageSize: 每页大小

  • data.totalPage: 总页数


1.5.3 JAVA定义统一返回结果

Result

@Data
//@ApiModel(value = "全局统一返回结果")
public class Result
{
//@ApiModelProperty(value = "是否成功")
private boolean success;
//@ApiModelProperty(value = "返回码")
private Integer code;
//@ApiModelProperty(value = "返回消息")
private String message;
//@ApiModelProperty(value = "返回数据")
private Map data = new HashMap();
private Result()
{}
public static Result ok(){
Result r = new Result();
r.setSuccess(true);
r.setCode(ResultCode.OK);
r.setMessage("成功");
return r;
}
public static Result error(){
Result r = new Result();
r.setSuccess(false);
r.setCode(ResultCode.ERROR);
r.setMessage("失败");
return r;
}
public Result message(String message){
this.setMessage(message);
return this;
}
public Result code(Integer code){
this.setCode(code);
return this;
}
public Result data(String key, Object value){
this.data.put(key, value);
return this;
}
public Result data(Map map){
this.setData(map);
return this;
}
}

2 商品管理系统

2.1 案例需求

完成商品的查询、新增、修改、删除等操作

后端(服务器端):spring boot+spring mvc+mybatis


2.2 数据库设计与表结构


CREATE TABLE `t_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
`price` double(20,0) DEFAULT NULL,
PRIMARY KEY (`id`)
)

导入数据:

INSERT INTO `t_goods` VALUES ('1', '华为 G9 青春版 白色 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '84900');
INSERT INTO `t_goods` VALUES ('2', '华为 G9 青春版 金色 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '84900');
INSERT INTO `t_goods` VALUES ('3', '三星 Galaxy C5(SM-C5000)4GB+32GB 枫叶金 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '119900');
INSERT INTO `t_goods` VALUES ('4', '三星 Galaxy C5(SM-C5000)4GB+32GB 蔷薇粉 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '119900');
INSERT INTO `t_goods` VALUES ('5', '三星 Galaxy C5(SM-C5000)4GB+32GB 烟雨灰 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '119900');
INSERT INTO `t_goods` VALUES ('6', '三星 Galaxy C5(SM-C5000)4GB+32GB 皎洁银 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '119900');
INSERT INTO `t_goods` VALUES ('7', '华为 G9 Plus 32GB 月光银 移动联通4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '119900');
INSERT INTO `t_goods` VALUES ('8', '华为 麦芒5 全网通 4GB+64GB版 香槟金 移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '139900');
INSERT INTO `t_goods` VALUES ('9', '努比亚(nubia)Z11 百合金 4GB+64GB 全网通 移动联通电信4G手机双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '159900');
INSERT INTO `t_goods` VALUES ('10', '华为 HUAWEI nova 4GB+64GB版 香槟金(白)移动联通电信4G手机 双卡双待', 'https://img12.360buyimg.com/n1/jfs/t17050/106/1124838205/250590/7e63050a/5abb6be2N853106d9.jpg', '139900');

2.3 服务器端


2.3.1 创建SpringBoot项目



2.3.2 导入jar包

pom.xml


UTF-8

UTF-8
1.8
1.3.2
2.0.2
5.1.32

1.2.5
1.1.10




org.springframework.boot
spring-boot-starter-web




org.springframework.boot
spring-boot-starter-jdbc



org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis.starter.version}



tk.mybatis
mapper-spring-boot-starter
${mapper.starter.version}



com.github.pagehelper
pagehelper-spring-boot-starter
${pageHelper.starter.version}



mysql
mysql-connector-java
${mysql.version}



com.alibaba
druid-spring-boot-starter
${durid.starter.version}


org.projectlombok
lombok
1.18.10



2.3.3 配置文件(application.properties)

application.properties文件

#Tomcat
server.port=8090
#DB configuration
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/vue01?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
#druid
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view-servlet.allow=true

2.3.4 **创建springboot引导类

@SpringBootApplication
public class UserManagementApplication
{
public static void main(String[] args) {
SpringApplication.run(UserManagementApplication.class, args);
}
}

2.3.5 创建实体

创建包com.czxy.pojo,创建类User.java

@Table(name="t_goods")
@Data
public class Goods
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
private String name;
private String image;
private Double price;
}

2.3.6 创建Dao

创建包com.czxy.dao,创建接口GoodsMapper.java

@org.apache.ibatis.annotations.Mapper
public interface GoodsMapper extends Mapper
{
}

2.3.7 创建Service

创建包com.czxy.service,创建接口GoodsService.java

@Service
@Transactional
public class GoodsService
{
@Autowired
private GoodsMapper goodsMapper;
}

2.3.8 创建Controller

创建包com.czxy.controller,创建类GoodsController.java

@RestController
@RequestMapping("/goods")
public class GoodsController
{
@Autowired
private GoodsService goodsService;
}


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
author-avatar
冷嘲热讽714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有