代码管理工具-svn
一、课程介绍
前后端分离技术概述(掌握)
后端crud接口完整实现(掌握)
前端crud实现(掌握)
Idea集成svn插件(掌握)
Idea中svn的基本操作(掌握)
项目仓库搭建(重要)
二、前后端分离概述
2.1什么是前后端分离
前后端分离是一种架构模式,前后端项目分开开发,测试,部署.
并行开发:前后端并行开发,测试,再联调.
后端先行:后端先开发好接口,前端使用真是数据,省去写mock过程. 采纳
2.2前后端分离优势
为优质产品打造精益团队
通过将开发团队前后端分离化,让前后端工程师只需要专注于前端或后端的开发工作,是的前后端工程师实现自治,培养其独特的技术特性,然后构建出一个全栈式的精益开发团队。
专业的人做专业的事情
提升开发效率
前后端分离以后,可以实现前后端代码的解耦,只要前后端沟通约定好应用所需接口以及接口参数,便可以开始并行开发,无需等待对方的开发工作结束。与此同时,即使需求发生变更,只要接口与数据格式不变,后端开发人员就不需要修改代码,只要前端进行变动即可。如此一来整个应用的开发效率必然会有质的提升。
并行开发
完美应对复杂多变的前端需求
如果开发团队能完成前后端分离的转型,打造优秀的前后端团队,开发独立化,让开发人员做到专注专精,开发能力必然会有所提升,能够完美应对各种复杂多变的前端需求。
增强代码可维护性
前后端分离后,应用的代码不再是前后端混合,只有在运行期才会有调用依赖关系。
全栈开发(jquery):配了假前端,来小姐姐给我写个页面
前后端分离模式下的全栈(前后台)-vue,j2ee 这都是我的
前后端分离模式下的后台开发-j2ee 这是前端的不要找我
2.3第三个项目中使用前后端技术架构
后端:
ssm+mave多模块
swagger文档描述
postman测试
前端:
nodejs
npm:管理js库
webpack:对静态资源打包
vuejs:MVVM模式的开发js库
ElementUI:前端ui框架
vuecli:vue开发脚手架,能够快速搭建vue项目,里面包含了webpack的打包配置,服务器热启动.
三、后端crud实现
后端项目结构:
被忽略-pom.xml
现象: 导包没用,项目变灰
3.1 restfull概述
Restfull是http协议的扩展,它以资源为核心,通过url定位资源,以http协议不同请求方式表示操作(PUT,POST,GET,DELETE,PATCH,HEAD,OPTION)
添加:
PUT /employee @RequestBody
{
}
删除:
DELETE /employee/id RequestMapping(value=”{
id}”) @PathVirable(“id”) Long id
修改:
POST /employee/id RequestMapping(value=”{
id}”) @PathVirable(“id”) Long id @RequestBody
{
}
查询一个:
GET /employee/id RequestMapping(value=”{
id}”) @PathVirable(“id”)
批量查询
PATCH/employee
高级查询
GET /employee
3.2 后端接口实现
3.2.1 Base继承结构
体现写一个后端crud的步骤
itsource_common: 自己domain继承BaseDomain
itsource_mapper: 自己Mapper.java继承与BaseMapper 自己的Mapper.xml
由于Mapper.java继承了BaseMapper 的基础方法,所以不要忘记了在Mapper.xml
里面忘记了写对应的映射语句
itsource_service:
自己IServie继承与IbaseService的基础接口方法,自己ServiceImpl基于BaseServiceImpl,里面实现基础接口实现.
以后只有扩展方法是需要在自己的接口和实现类中写以外,其他统统不用管.
junit
itsource_web:实现Controller
以部门为例写一个crud接口
3.2.2 domain及表
public class Department extends BaseDomain
{
private String name;
DROP TABLE IF EXISTS `t_department`;
CREATE TABLE `t_department` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
3.2.3 Mapper.java&Mapper.xml
public interface DepartmentMapper extends BaseMapper<Department> {
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itsource.mapper.DepartmentMapper">
<!--void save(T t);-->
<insert id="save" parameterType="Department">
INSERT INTO t_department(name) VALUES(#{
name})
</insert>
<!--void remove(Serializable id);-->
<delete id="remove" parameterType="long">
DELETE FROM t_department where id = #{
id }
</delete>
<!--void update(T t);-->
<update id="update" parameterType="Department">
update t_department set name = #{
name} where id = #{
id}
</update>
<!--T loadById(Serializable id);-->
<select id="loadById" parameterType="long" resultType="Department">
SELECT * from t_department where id = #{
id}
</select>
<!--List<T> loadAll();-->
<select id="loadAll" resultType="Department">
SELECT * from t_department
</select>
</mapper>
3.2.4 IxxxService.java XxxServiceImpl.java
package cn.itsource.service;
import cn.itsource.basic.service.IBaseService;
import cn.itsource.domain.Department;
public interface IDepartmentService extends IBaseService<Department> {
}
package cn.itsource.service.impl;
import cn.itsource.basic.service.impl.BaseServiceImpl;
import cn.itsource.domain.Department;
import cn.itsource.service.IDepartmentService;
import org.springframework.stereotype.Service;
@Service
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements IDepartmentService {
}
3.2.5 junit
package cn.itsource.service;
import cn.itsource.basic.PageList;
import cn.itsource.domain.Department;
import cn.itsource.domain.Employee;
import cn.itsource.query.EmployeeQuery;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class DepartmentServiceTest extends BaseTest {
@Autowired
private IDepartmentService departmentService;
@Test
public void test()throws Exception{
for (Department department : departmentService.getAll()) {
System.out.println(department);
}
}
}
3.2.6 controller
package cn.itsource.web.controller;
import cn.itsource.basic.AjaxResult;
import cn.itsource.basic.PageList;
import cn.itsource.basic.query.BaseQuery;
import cn.itsource.domain.Employee;
import cn.itsource.query.EmployeeQuery;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 约束方法不漏
* 约束方法名按照规范来
*
* @param <T>
*/
public interface BaseController<T> {
AjaxResult add(T t);
AjaxResult del(Long id);
AjaxResult update(Long id,T t);
T getById(Long id);
List<T> list();
PageList<T> query(BaseQuery query);
}
package cn.itsource.web.controller;
import cn.itsource.basic.AjaxResult;
import cn.itsource.basic.PageList;
import cn