使用SpringBoot+MyBatis+MySQL完成设置默认收货地址
设置默认收货地址 - 持久层
SQL语句规划
① 检测当前用户想要设为默认地址的这条数据是否存在。
select * from t_address where aid=?
② 在修改用户的收货默认地址之前,先将所有的收货地址设置为非默认。
update t_address set is_default=0 where uid=?
③ 将用户当前选中的这条记录设置为默认收货地址。
update t_address set is_default=1,modified_user=?,modified_time=? where aid=?
设计抽象方法
在AddressMapper接口中进行声明和定义
/**
* 根据aid查询收货地址数据
* @param aid 收货地址id
* @return 收货地址数据,如果没有找到则返回null值
*/
Address findByAid(Integer aid);
/**
* 根据用户的uid来修改用户的收货地址为非默认
* @param uid 用户的id值
* @return 受影响的行数
*/
Integer updateNoneDefault(Integer uid);
Integer updateDefaultByAid(
@Param("aid") Integer aid,
@Param("modifieduser") String modifiedUser,
@Param("modifiedTime") Date modifiedTime);
配置SQL映射
在AddressMapper.xml文件中
<update id="updateNoneDefault">
UPDATE t_address
SET is_default=0
WHERE uid=#{uid}
</update>
<update id="updateDefaultByAid">
UPDATE t_address
SET is_default=1,
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
WHERE aid=#{aid}
</update>
<select id="findByAid" resultMap="AddressEntityMap">
SELECT * FROM t_address WHERE aid=#{aid}
</select>
单元测试
@Test
public void findByAid() {
System.out.println(addressMapper.findByAid(10));
}
@Test
public void updateNoneDefault() {
addressMapper.updateNoneDefault(14);
}
@Test
public void updateDefaultByAid() {
addressMapper.updateDefaultByAid(10,"明明", new Date());
}
设置默认收货地址 - 业务层
异常规划
- 在执行更新时产生未知的UpdateException异常,已经创建无需重复创建;
- 访问的数据不是当前登录用户的收货地址数据,非法访问AccessDeniedException异常;
- 收货地址可能不存在的异常:AddressNotFoundException异常。
抽象方法
在IAddressService中编写抽象方法。
/**
* 修改某个用户的某条收货地址为默认收货地址
* @param aid 收货地址id
* @param uid 用户id
* @param username 表示修改执行的人
*/
void setDefault(Integer aid, Integer uid, String username);
实现抽象方法
在AddressServiceImpl类中进行开发和业务设计。
@Override
public void setDefault(Integer aid, Integer uid, String username) {
Address result = addressMapper.findByAid(aid);
if (result == null) {
throw new AddressNotFoundException("收货地址不存在");
}
// 检测当前获取的收货地址数据的归属
if (!result.getUid().equals(uid)) {
throw new AccessDeniedException("非法数据访问");
}
// 先将所有的收货地址设置为非默认
Integer rows = addressMapper.updateNoneDefault(uid);
if (rows < 1) {
throw new UpdateException("更新数据时产生未知的异常");
}
// 将用户选中的某条地址设置为默认收货地址
rows = addressMapper.updateDefaultByAid(aid, username, new Date());
if (rows !=1 ) {
throw new UpdateException("更新数据时产生未知的异常");
}
}
单元测试
@Test
public void setDefault() {
addressService.setDefault(8, 14,"admin001");
}
设置默认收货地址 - 控制层
处理异常
在BaseController类中进行统一的处理。
else if (e instanceof AddressNotFoundException){
result.setState(4004);
result.setMessage("用户的收货地址数据不存在的异常");
} else if (e instanceof AccessDeniedException){
result.setState(4005);
result.setMessage("收货数据地址非法访问的异常");
}
设计请求
为了在URL中提交更多的数据,可以采用RESTful的风格进行提交数据,将请求路径中的某个参数交给RESTful风格进行解析。
请求路径:/addresses/{aid}/set_default
请求方法:GET
请求数据:@PathVariable("aid") Interger aid, HttpSession session
响应结果:JsonResult<Void>
完成请求方法
在AddressController类中编写请求处理方法。
// RestFul风格的请求编写
@RequestMapping("{aid}/set_default")
public JsonResult<> setDefault(@PathVariable("aid") Integer aid,
HttpSession session) {
addressService.setDefault(
aid,
getuidFromSession(session),
getUsernameFromSession(session));
return new JsonResult<>(OK);
}
打开浏览器,先登录再去访问一个请求路径
http://localhost:8080/addresses/10/set_default
执行完成后,可以在数据库中查询结果(is_default为1)。
设置默认收货地址 - 前端页面
① 给设为默认(收货地址)按钮添加一个onclick属性,指向一个方法的调用,在这个方法中完成ajax请求的发送。
let tr = '<tr>\n' +
'<td>#{tag}</td>\n' +
'<td>#{name}</td>\n' +
'<td>#{address}</td>\n' +
'<td>#{phone}</td>\n' +
'<td><a class="btn btn-xs btn-info"><span class="fa fa-edit"></span> 修改</a></td>\n' +
'<td><a class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>\n' +
'<td><a οnclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">设为默认</a></td>\n' +
'</tr>';
tr = tr.replace(/#{tag}/g,list[i].tag);
tr = tr.replace(/#{name}/g,list[i].name);
tr = tr.replace("#{phone}",list[i].phone);
tr = tr.replace("#{address}",list[i].address);
tr = tr.replace("#{aid}", list[i].aid);
② address.html页面点击”设为默认“来发送ajax请求。完成setDefault()方法的声明和定义。
function setDefault(aid) {
$.ajax({
url: "/addresses/" + aid + "/set_default",
type: "POST",
dataType: "JSON",
success: function (json) {
if (json.state == 200) {
// 重新加载收货地址列表页面
showAddressList();
} else {
alert("设置默认收货地址失败");
}
},
error: function (xhr) {
alert("设置默认收货地址时时产生未知的异常" + xhr.message);
}
});
}
启动项目,先登录再访问收货管理页面进行测试。