资源介绍
自己做的乐优商城的XMIND文件,学习分享下。乐优商城
搭建父工程
pom.xml
添加依赖
springCloud
mybatis启动器
通用Mapper启动器
mysql驱动
分页助手启动器
FastDFS客户端
其他配置
构建设置
环境设置
EurekaServer注册中心
添加的依赖
启动类
application.yml
创建Zuul网关
依赖
启动类
application.yml
创建商品微服务
ly-item-interface:主要是对外暴露的API接口及相关实体类
ly-item-service:所有业务逻辑及内部使用接口
创建父工程ly-item
ly-item-interface
ly-item-service
依赖
启动器
application.yml
添加商品微服务的路由规则
通用工具模块Common
utils
CookieUtils
IdWorker
JsonUtils
NumberUtils
依赖
通用异常处理
测试结构
pojo
service
@Service
web
@RestController
@RequestMapping
@Autowired
@PostMapping
引入Common依赖
Common
advice
拦截异常、 CommonExceptionHandler
ResponseEntity
@ControllerAdvice
@ExceptionHandler
enums
异常的枚举 、ExceptionEnum
exception
自定义异常、LyException
接口RuntimeException
@Getter
@NoArgsConstructor
@AllArgsConstructor
vo
异常结果处理对象、ExceptionResult
@Data
构造方法ExceptionResult
ly-item-service
CategoryQuery 分类查询
实体类
@Table(name="tb_category")
声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe)
@Data
注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
@Id & @GeneratedValue(strategy= GenerationType.IDENTITY)
自动增长,适用于支持自增字段的数据库
mapper
Mapper
IdListMapper
根据id操作数据库
@RequestMapping("category")
Controller
@RestController
@Controller
处理HTTP请求
@ResponseBody
返回 json 数据
@GetMapping("list")
ResponseEntity
@ResponseBody可以直接返回Json结果
不仅可以返回json结果,还可以定义返回的HttpHeaders和HttpStatus
service
@Service
自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了
@Autowired
它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
select
select * from category c where c.pid = #{pid}
CollectionUtils.isnotblank
判断集合是否为空
测试
可以利用url直接查询数据库,能否访问得到数据
报错
启动类
没有扫描到 @MapperScan("com.leyou.item.mapper") ,目录结构关系
访问网页报错
CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
跨域问题
浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。因此:跨域问题 是针对ajax的一种限制。
解决跨域问题的方案
CORS 规范化的跨域请求解决方案,安全可靠
什么是cors
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
原理
简单请求
当浏览器发现发现的ajax请求是简单请求时,会在请求头中携带一个字段:Origin
如果服务器允许跨域,需要在返回的响应头中携带下面信息
Access-Control-Allow-Origin:可接受的域,是一个具体域名或者*,代表任意
Access-Control-Allow-Credentials:是否允许携带cookie,默认情况下,cors不会携带cookie,除非这个值是true
实现非常简单
gateway网关中编写一个配置类
GlobalCorsConfig
添加CORS配置信息
允许的域,不要写*,否则cookie就无法使用了
是否发送Cookie信息
允许的请求方式
允许的头信息
有效时长
添加映射路径,我们拦截一切请求
返回新的CorsFilter
提交方式
GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源
BUG
分类不能打开,当添加后却能打开。
修改一天的BUG 最后发现是实体类里属性大小写的问题引起。 注意 Bule_bird 就必须写成 BlueBird
Brand
查询
实体类
PageResult
响应结果
分页结果一般至少需要两个数据
总条数 total
当前页数据 items
有些还需要总页数
总页数 totalPage
Controller
@RequestParam(value = "page",defaultValue = "1") Integer page
GET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上
defaultValue 默认值
required 默认值为true , 当为false时 这个注解可以不传这个参数
null || .size()==0
ResponseEntity<>(HttpStatus.NOT_FOUND)
返回404没找到
ResponseEntity.ok
返回ok状态
service
开始分页
通用分页拦截器
PageHelper.startPage(page,row);
过滤
Example查询
Example example = new Example(Brand.class);
mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分
xxxExample example = new xxxExample();
Criteria criteria = new Example().createCriteria();
StringUtils.isNotBlank
isNotBlank(str) 等价于 str != null && str.length > 0 && str.trim().length > 0
str.trim() 去掉字符串头尾的空格
测试
报错500
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'idASC' in 'order clause'
错误:(desc ? "DESC" : "ASC");
正确:(desc ? " DESC" : " ASC");
字符串空格问题
新增
Controller
(Brand brand,@RequestParam("cids") List cids)
ResponseEntity
无返回值
new ResponseEntity<>(HttpStatus.CREATED); 201成功
service
@Transactional
自动纳入 Spring 的事务管理
使用默认配置,抛出异常之后,事务会自动回滚,数据不会插入到数据库。
setId(null)
insert(brand)
新增中间表
mapper
@Insert
(#{cid},#{bid})
@Param
表示给参数命名,名称就是括号中的内容
name 命名为aa,然后sql语句....where s_name= #{aa} 中就可以根据aa得到参数值
修改
回显
Controller
@PathVariable("bid")
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
select * from tb_category where id in (select category_id from tb_category_brand where brand_id = #{bid})
测试
报错500 空指针异常
调用Service时候 忘记@Autowired
保存
VO视图对象
@NoArgsConstructor
生成一个无参数的构造方法
@AllArgsConstructor
会生成一个包含所有变量
Controller
@PutMapping
添加信息,倾向于用@PostMapping,如果是更新信息,倾向于用@PutMapping。两者差别不是很明显
return ResponseEntity.ok().build();
无返回值
service
根据id修改
先删除后新增
删除(前端有问题,待完善)
spec
Group
品牌分类id查询
实体类
@Transient
指定该属性或字段不是永久的。 它用于注释实体类,映射超类或可嵌入类的属性或字段。
@Column(name = "'numeric'")
用来标识实体类中属性与数据表中字段的对应关系
name 定义了被标注字段在数据库表中所对应字段的名称;
mapper
service
Controller
测试
报错500
实体类@table路径写错
新增
Controller
@RequestBody
常用其来处理application/json类型
子主题 2
将请求体中的JSON字符串绑定到相应的bean上
修改
Controller
@PutMapping
service
updateByPrimaryKey
删除
Controller
@DeleteMapping
@PathVariable
Param
规格组id查询规格
url:params?gid=14
@GetMapping("params")
Controller
@RequestParam
新增
@PostMapping("param")
@RequestBody
ResponseEntity.status(HttpStatus.CREATED).build();
修改
@RequestBody
删除
@PathVariable
分支主题 3
遇到的问题
pom.xml
文件未下载完整,删掉后重新下载
能存在重复文件,IDEA不能确定文件路径,需要搜索删掉多余的
Param
删除
小问题:数据库删除后页面没有立即显示
Brand
删除(前端有问题,待完善)