1 持久层
1.1 SQL语句规划
1.检测当前用户想设置为默认收货地址的这条数据是否存在。
select * from t_address aid=?
2.在修改用户的收货默认地址之前,先将所有的收货地址设置为非默认
update t_address set is_default=0 where uid=?
3.将用户当前选中的这条记录设置为默认收货地址。
update t_address set is_default=1 ,modified_user,modified_time where aid=?
1.2 设计抽象方法
在AddressMapper中进行定义和声明
/**
* 根据aid查询收货地址数据
* @param aid 收货地址id
* @return 收获地址数据,如果没有找到则返回null值
*/
Address findByAid(Integer aid);
/**
* 根据用户uid值来修改用户的收货地址为非默认
* @param uid 用户的id值
* @return 受影响行数
*/
Integer updateNonDefault(Integer uid);
Integer updateDefaultByAid(@Param("aid") Integer aid
,@Param("modifiedUser") String modifiedUser,
@Param("modifiedTime") Date modifiedTime);
}
1.3 配置SQL映射
AddressMapper.xml配置映射。
<update id="updateNonDefault">
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(9));
}
@Test
public void updateNonDefault(){
addressMapper.updateNonDefault(9);
}
@Test
public void updateDefaultByAid(){
addressMapper.updateDefaultByAid(11,"的方法",new Date());
}
2 业务层
2.1 异常规划
1.在执行更新时产生未知的updateException异常,已经创建无需重复。
2.访问的数据不是当前登陆用户的收货地址数据,非法访问AccessDeniedException异常。
3.收货地址有可能不存在:AddressNotFoundException异常。
2.2 抽象方法
在接口IAddressService中编写抽象方法。
/**
* 修改某个用户的某条收货地址数据为默认收货地址
* @param aid 收货地址的id
* @param uid 用户的id
* @param username 修改执行的人
*/
void setDefault(Integer aid,Integer uid,String username);
2.3 实现抽象方法
在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.updateNonDefault(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(10,9,"管理员");
}
3 控制层
3.1 处理异常
在BaseController类中进行统一的处理
3.2 请求设计
/addresser/{aid}/set_default
@PathVariable("aid") Integer aid,HttpSession session
GET
JsonResult<Void>
3.3 完成请求方法
在AddressController类中完成编写请求处理方法。
//Restful风格
@RequestMapping("{aid}/set_default")
public JsonResult<Void> setDefault(@PathVariable("aid")Integer aid, HttpSession session){
addressService.setDefault(aid,getUidFromSession(session),getUsernameFromSession(session));
return new JsonResult<>(OK);
}
打开浏览器先登陆再去访问一个请求路径:/localhost:8080/addresser/12/set_default
4 前端页面
1.给设置默认收货地址按钮添加一个onclick属性,指向一个方法的调用,在这个方法中来完成ajax请求的方法。
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)
}
})
}