1.设置默认收获地址-持久层
1.1规划SQL语句
1.检测当前用户想设置的默认收获地址是否存在
select * from t_address where 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设计接口和抽象方法
public interface AddressMapper {
/**
* 根据aid查询收货地址数据
* @param aid 修改用户的aid
* @return 收货地址数据,如果没有找到则返回null
*/
Address findAddressByAid(Integer aid);
/**
* 根据用户的uid,将修改用户下的地址全部设置为非默认
* @param uid 修改用户的uid
* @return 返回受影响的行数
*/
Integer updateNonDefault(Integer uid);
/**
* 根据
* @param aid
* @param modifiedUser
* @param modifiedTime
* @return
*/
Integer updateDefaultByAid(@Param("aid") Integer aid,
@Param("modifiedUser") String modifiedUser,
@Param("modifiedTime") Date modifiedTime);
}
1.3编写映射
<select id="findAddressByAid" resultMap="AddressEntityMap">
select * from t_address where aid=#{aid}
</select>
<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>
2.设置默认收获地址-业务层
2.1规划异常
- 在执行更新时产生未知的UpdateException异常,已经创建无需重复创建
- 访问的数据不是当前登录用户的收货地址数据,属于非法访问,AccessDeniedException异常(就比如说,展示收货地址列表的sql语句写错了,然后这里展示的是别人的收货地址,此时想要将某个收货地址改为默认就属于非法访问了)
- 收货地址可能不存在的AddressNotFoundException异常,(比如,刚展示完收货地址列表,管理员误删地址了,此时地址就不存在了)
在业务层的ex包下创建如下两个异常类,并使其继承ServiceException类
/**收货地址数据不存在的异常*/
public class AddressNotFoundException extends ServiceException {
/**重写ServiceException的所有构造方法*/
}
/**非法访问的异常*/
public class AccessDeniedException extends ServiceException {
/**重写ServiceException的所有构造方法*/
}
2.2设计接口和抽象方法
先看持久层的三个方法需要什么参数:aid,uid,modifiedUser,modifiedTime.
其中aid是从前端一步一步传到业务层的,所以需要该参数,uid和modifiedUser是一样的,都是由控制层从session获取的uid并传给业务层,所以需要该参数,modifiedTime可以在业务层new Date,所以不需要该参数
public interface IAddressService {
/**
* 设置默认收获地址
* @param aid 修改用户的aid
* @param uid 修改用户的uid
* @param username 修改用户名字
*/
void setDefault(Integer aid,Integer uid,String username);
2.3设计实现类和实现方法
@Override
public void setDefault(Integer aid, Integer uid, String username) {
//查询是否存在
Address addressByAid = addressMapper.findAddressByAid(aid);
if(addressByAid == null){
throw new AddressNotFoundException("收货地址不存在");
}
//检测当前获取到的收货地址是否归属于该用户
if(addressByAid.getUid().equals(uid)){
throw new AccessDeniedException("非法数据访问");
}
//将修改用户的所有地址置为未默认
Integer integer = addressMapper.updateNonDefault(uid);
if(integer < 1){
throw new UpdateException("更新数据时产生未知的异常");
}
//将用户选中的收货地址修改为默认地址
Integer integer1 = addressMapper.updateDefaultByAid(aid, username, new Date());
if(integer1 < 1){
throw new UpdateException("更新数据时产生未知异常");
}
}
3.设置默认收货地址-控制层
3.1处理异常
在BaseController类中处理业务层抛出的两个异常
else if (e instanceof AddressNotFoundException) {
result.setState(4004);
result.setMessage("用户的收货地址数据不存在的异常");
} else if (e instanceof AccessDeniedException) {
result.setState(4005);
result.setMessage("收货地址数据非法访问的异常");
}
3.2设计请求
- /address/{aid}/set_default(以前的数据是通过表单直接提交的,还有一种提交方式就是RestFul风格,这种提交方式可以提交更多的数据,这里用这个提交方式)
- GET
- Integer aid,HttpSession session(如果这里是id那就必须在Integer aid前加@PathVariable(“aid”)强行将aid的值注入到id中)
- JsonResult
3.3处理请求
在AddressController类中编写请求处理方法.
RestFul编写时不管参数名和占位符是否一致都必须加@PathVariable(“aid”)
//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);
}
启动服务,登录账号后在地址栏输入http://localhost:8080/store/address/31/set_default进行测试
4.前端页面
function setDefault(aid){
$.ajax({
url: "/store/address/"+aid+"/set_default",
type: "POST",
dataType: "JSON",
success: function(json){
if(json.state == 200){
//重新加载收货地址列表页面
showAddressList();
}else{
alert("设置默认收货地址失败")
}
},
error: function(xhr){
alert("设置默认收货地址时产生未知的异常!"+xhr.message);
}
});
}