收获地址列表展示

用户收货地址展示页面

image-20230809233924765

持久层

规划执行的SQL语句

用户收货地址页面展示,本质上是SQL查询语句,按照is_default字段进行排序,因为按照逻辑默认收货地址应该排在第一个;其余地址按照创建时间进行排序,最近创建的排在前面

1
select * from t_address where uid=? order by is_default DESC,created_time DESC;

接口和抽象方法

AddressMapper接口中定义抽象方法findByUid

1
2
3
4
5
6
/**
* 查询当前用户的收货地址列表
* @param uid 用户id
* @return 用户拥有地址列表
*/
List<Address> findByUid(Integer uid);

SQL关系映射

AddressMapper.xml文件中编写抽象方法对应的映射语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<resultMap id="addressPojoMap" type="com.bang.store.pojo.Address">
<id column="uid" property="uid"/>
<result column="province_name" property="provinceName"/>
<result column="province_code" property="provinceCode"/>
<result column="city_name" property="cityName"/>
<result column="city_code" property="cityCode"/>
<result column="area_name" property="areaName"/>
<result column="area_code" property="areaCode"/>
<result column="is_default" property="isDefault"/>
<result property="createUser" column="create_user"/>
<result property="createTime" column="create_time"/>
<result property="modifiedUser" column="modified_user"/>
<result property="modifiedTime" column="modified_time"/>
</resultMap>

<!-- 部分属性,实体类与数据库表命名不一致,需要编写映射规则 -->
<select id="findByUid" resultMap="addressPojoMap">
select * from t_address where uid=#{uid} order by is_default DESC,created_time DESC;
</select>

单元测试

1
2
3
4
5
6
7
@Test
public void findByUid(){
List<Address> addressList = addressMapper.findByUid(1);
for (Address address : addressList) {
System.out.println(address);
}
}

业务层

规划异常

无额外的异常发生

接口和抽象方法

在接口IAddressService中编写对应的抽象方法

1
2
3
4
5
6
/**
* 获取当前用户拥有的所有收货地址列表
* @param uid 用户id
* @return 收获地址列表
*/
List<Address> getByUid(Integer uid);

抽象方法实现

在实现类实现对应的抽象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
public List<Address> getByUid(Integer uid) {
List<Address> addressList = addressMapper.findByUid(uid);
//前端只需展示:地址类型、收货人姓名、详细地址、联系电话、是否默认这几个字段的信息
//为了节省传输带宽和提高效率,将其他属性值进行清空
//清空字段太多,其实这里也可以在持久层的SQL语句上进行处理,只查询对应的那几个字段,这样其他字段默认为null,这样可能造成复用困难
//如果后续其他位置需要address对象其他信息,则不建议在持久层只查询几个字段
for (Address address : addressList) {
address.setAid(null);
address.setUid(null);
address.setProvinceCode(null);
address.setCityCode(null);
address.setAreaCode(null);
address.setTel(null);
address.setCreatedUser(null);
address.setCreatedTime(null);
address.setModifiedUser(null);
address.setModifiedTime(null);
}
return addressList;
}

单元测试

1
2
3
4
5
6
7
@Test
public void getByUid(){
List<Address> addressList = addressService.getByUid(1);
for (Address address : addressList) {
System.out.println(address);
}
}

控制层

异常处理

无新增异常

设计请求

1
2
3
4
request url: /address/get_by_uid
request method: GET
request params: HttpSession session
response data: new JsonResult<List<Address>>

处理请求

1
2
3
4
5
6
7
@RequestMapping("/get_by_uid")
public JsonResult<List<Address>> getByUid(HttpSession session){
//获取当前登录用户id
Integer uid = getUidFromSession(session);
List<Address> addressList = addressService.getByUid(uid);
return new JsonResult<>(OK,"用户地址列表请求成功",addressList);
}

前端页面

一加载address.html页面,就向后端发送请求,获取当前用户的收货地址列表,并展示在页面对应位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<script>
$(document).ready(function () {
$.ajax({
url: "/address/get_by_uid"
,type: "GET"
,data: null
,dataType: "JSON"
,success: function (data){
if(data.state == 200){
//后端传回数据是list列表
//清空原始内容
$("#address-list").empty();
let addressList = data.data;
for(let i=0;i<addressList.length;i++){
let trContent = "<tr>\n" +
"\t\t\t\t\t\t\t\t\t<td>"+addressList[i].tag+"</td>\n" +
"\t\t\t\t\t\t\t\t\t<td>"+addressList[i].name+"</td>\n" +
"\t\t\t\t\t\t\t\t\t<td>"+addressList[i].address+"</td>\n" +
"\t\t\t\t\t\t\t\t\t<td>"+addressList[i].phone+"</td>\n" +
"\t\t\t\t\t\t\t\t\t<td><a class=\"btn btn-xs btn-info\"><span class=\"fa fa-edit\"></span> 修改</a></td>\n" +
"\t\t\t\t\t\t\t\t\t<td><a class=\"btn btn-xs add-del btn-info\"><span class=\"fa fa-trash-o\"></span> 删除</a></td>\n" +
"\t\t\t\t\t\t\t\t\t<td><a class=\"btn btn-xs add-def btn-default\">设为默认</a></td>\n" +
"\t\t\t\t\t\t\t\t</tr>";
$("#address-list").append(trContent);
}
//第一个地址默认为默认地址,所以其所在的默认地址按钮需要隐藏
//某个元素隐藏,采用hide()方法
$(".add-def:eq(0)").hide();
}else{
alert("用户地址获取失败 "+data.message);
}
}
,error:function (xmh){
alert("用户地址获取过程中发生未知错误"+xmh.status);
}
});
})
</script>