1.项目设计
1.1开发模式
十次方项目采用前后端分离的模式
1.2技术选型
后端:springcloud+springboot+mybatis plus+mysql
前端:vue+nodejs + NUXT + elementUI
本次项目开发注重于后端
1.3技术架构
采用前后端分离的技术架构
1.4微服务模块划分
tensquare_common
| 公共模块 |
tensquare_article
| 文章微服务 |
tensquare_user
| 用户微服务 |
tensquare_eureka
| 注册中心 |
tensquare_notice
| 消息通知微服务 |
1.5数据库表结构分析
采用的分库分表设计,每个微服务模块为一个独立的数据库
1.6前后端约定的返回码
状态描述
|
返回码
|
成功 | 20000 |
失败 | 20001 |
用户名或密码错误 | 20002 |
权限不足 | 20003 |
远程调用失败 | 20004 |
重复操作 | 20005 |
2.RESTful架构
简单总结RESTful架构为:
1.每一个URI代表一种资源;
2.客户端和服务器之间,传递这种资源的某种表现层;
3.客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"
本次项目使用GET、POST、PUT、DELETE四种方法
幂等性:幂等性是指重复使用同样的参数调用同一方法时总能获得同样的结果。不论你请求多少次,资源的状态是一样的。
GET:安全且幂等,一般用来获取信息——>用于查询接口
POST:不安全且不幂等,可以新建和更新资源——>用于提交接口
PUT:不安全但幂等,使用替换的方式更新资源——>用于更新接口
DELETE:不安全但幂等,删除资源——>用于删除接口
3.项目开发准备
3.1开发环境
虚拟机系统CentOS7 容器docker 数据库mysql5.7
所有第三方工具都运行在docker容器中
3.2接口测试工具postman
能够发送任何形式的http请求
4.项目工程搭建
创建tensquare_parent的maven工程,导入相关依赖,此为父工程
4.1搭建tensquare_common子模块
在此模块下创建:
1.Result类,用于controller返回结果封装
2.PageResult类,用于返回分页结果
3.StatusCodel类,用于定义返回码
4.IdWorker工具类,用于提供分布式id生成器
因为生产环境为分片部署,所以不可以使用自增id。(当数据量庞大时,在数据库分库分表后,数据库自增id不能满足唯一id来标识数据;因为每个表都按自己节奏自增,会造成id冲突,无法满足需求)
使用雪花算法生成唯一主键值,可以解决这一问题。
4.2搭建tensquare_article模块
1.创建ArticleApplication启动类和application.yml并添加内容
2.文章管理CRUD操作
集成mybatis plus
1.mybatis plus概述:
完全继承于mybatis,是对mybatis的二次封装和扩展
只依赖于mybatis和mybatis-spring
启动即可自动注入CRUD,性能无损耗,直接面向对象操作
自动热加载,Mapper对应的xml可以热加载,大大减少web重启的时间,提高开发效率
避免sql注入问题
2.引入依赖
3.在application.yml添加相关配置
4.在启动类中添加MapperScanner注解,开启mapper扫描
5.创建pojo下的Article实体类
6.编写数据访问接口dao
7.编写service
8.编写controller
5.此章节需要注意的点
5.1在文章的更新方法中,掌握两种方法
//修改文章
public void update(Article article) {
//方法一
articleDao.updateById(article);
//方法二
// EntityWrapper wrapper = new EntityWrapper<Article>();
// wrapper.eq("id", article.getId());
// articleDao.update(article, wrapper);
}
方法一为BaseMapper的方法
方法二需要掌握Mybatis plus工具条件构造器EntityWrapper wrapper的使用方法。
5.2文章的分页查询方法
controller
//根据条件查询列表
//POST
///article/search/{page}/{size}
//文章分页
@RequestMapping(value = "/search/{page}/{size}", method = RequestMethod.POST)
public Result findByPage(@PathVariable Integer page,
@PathVariable Integer size,
@RequestBody Map<String, Object> map) {
//查询
Page<Article> pageData = articleService.findByPage(map, page, size);
//封装分页返回对象
PageResult<Article> pageResult = new PageResult<>(
pageData.getTotal(), pageData.getRecords()
);
//返回result
return new Result(StatusCode.OK, true, "查询成功", pageResult);
}
service
//分页查询
public Page<Article> findByPage(Map<String, Object> map, Integer page, Integer size) {
EntityWrapper<Article> wrapper = new EntityWrapper<>();
Set<String> keySet = map.keySet();
//遍历设置查询条件
for (String key : keySet) {
wrapper.eq(map.get(key) != null, key, map.get(key));
}
//设置分页查询参数
Page<Article> page1 = new Page<>(page, size);
List<Article> list = articleDao.selectPage(page1, wrapper);
page1.setRecords(list);
return page1;
}
1.掌握mybatis plus分页插件Page<T>的用法