ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot电脑商城项目 8.收货地址列表展示 9.设置默认收货地址

2022-02-02 01:32:11  阅读:231  来源: 互联网

标签:springboot 收货 tr list 地址 address aid uid


8.收货地址列表展示

1.持久层

1.数据库的查询操作:

select * from t_address where uid = #{uid} order by is_default DESC ,created_time DESC       

2.接口和抽象方法

/**
     * 根据用户的id查询用户的收货地址数据
     * @param uid 用户id
     * @return 收货地址列表
     */
List<Address> findByUid(Integer uid);

3.在xml文件中添加对应的sql语句映射

<select id="findByUid" resultMap="AddressEntityMap">
    select * from t_address where uid = #{uid} order by is_default DESC ,created_time DESC
</select>

4.单元测试方法

@Test
public void findByUid(){
    List<Address> list = addressMapper.findByUid(29);
    for (Address address : list) {
        System.out.println(address);
    }
}

2.业务层

1.不用抛出相关异常

2.设计业务层的接口和抽象方法

List<Address> getAddressByUid(Integer uid);

3.在实现类中实现此方法

@Override
public List<Address> getAddressByUid(Integer uid) {
    List<Address> list = addressMapper.findByUid(uid);

    for (int i = 0; i < list.size(); i++) {
        Address data = new Address();

        Address address = list.get(i);

        String name = address.getName();
        String addressAddress = address.getAddress();
        String provinceName = address.getProvinceName();
        String cityName = address.getCityName();
        String areaName = address.getAreaName();
        String tag = address.getTag();
        String zip = address.getZip();
        String phone = address.getPhone();

        data.setName(name);
        data.setAddress(addressAddress);
        data.setProvinceName(provinceName);
        data.setCityName(cityName);
        data.setAreaName(areaName);
        data.setTag(tag);
        data.setZip(zip);
        data.setPhone(phone);

        list.set(i,data);
    }

3.单元测试

3.控制层

1.请求设计

/address
HttpSession session
GET
JsonResult<List<Address>>

2.实现请求方法的编写

@RequestMapping({"/",""})
public JsonResult<List<Address>> getAddressByUid(HttpSession session){
    Integer uid = getUidFromSession(session);
    String username = getUsernameFormSession(session);
    List<Address> data = addressService.getAddressByUid(uid);
    return new JsonResult<>(OK, data);
}

3.先登录,再访问请求的地址进行数据的测试

4.前端界面

<script>
    $(document).ready(function () {
    showAddressList();
})

function showAddressList(){
    $.ajax({
        url: "/address",
        type: "get",
        dataType: "JSON",
        success: function (json) {
            if (json.state == 200){
                let list = json.data;
                for (let i = 0; i < list.length; i++) {
                    let tr = '<tr>' +
                        '<td>#{tag}</td>' +
                        '<td>#{name}</td>' +
                        '<td>#{address}</td>' +
                        '<td>#{phone}</td>' +
                        '<td><a class="btn btn-xs btn-info"><span class="fa fa-edit"></span> 修改</a></td>' +
                        '<td><a class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>' +
                        '<td><a class="btn btn-xs add-def btn-default">设为默认</a></td>' +
                        '</tr>';

                    tr = tr.replace("#{tag}",list[i].tag);
                    tr = tr.replace("#{name}",list[i].name);
                    tr = tr.replace("#{address}",list[i].address);
                    tr = tr.replace("#{phone}",list[i].phone)

                    $("#address-list").append(tr);
                }
                //将某个元素隐藏使用hide()方法
                $(".add-def:eq(0)").hide();

            }else{
                alert("用户收货地址数据加载失败")
            }
        }
    });
}

</script>

9.设置默认收货地址

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,modified_user = ?,modified_time = ? where aid = ?

1.2 接口和抽象方法

/**
     * 根据aid查询收货地址数据
     * @param aid 收货地址id
     * @return 收货地址数据,如果没有找到,则返回null
     */
Address findByAid(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 配置SQL映射

AddressMapper.xml文件中进行配置

<select id="findByAid" 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>

在单元测试方法中进行测试

@Test
public void findByAid(){
    Address address = addressMapper.findByAid(17);
    System.out.println(address);
}
@Test
public void updateNonDefault(){
    addressMapper.updateNonDefault(29);
}

@Test
public void updateDefaultByAid(){
    addressMapper.updateDefaultByAid(17,"管理员",new Date());
}

2. 业务层

2.1 异常规划

1.在执行更新时产生位置的UpdateException异常.该异常已经创建

2.访问的数据不是当前登录用户的收货地址,非法访问:AccessDeniedException异常。

3.收货地址可能不存在异常:addressNotFoundException异常

2.2 抽象方法

在接口IAddressService中编写抽象方法

/**
     * 修改某个用户的某条收货地址数据为默认收货地址
     * @param aid 收货地址的id
     * @param uid 用户的id
     * @param username 表示修改的执行人
     */
void setAddressDefault(Integer aid,Integer uid,String username);

在AddressServiceImpl中实现方法

@Override
public void setAddressDefault(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 setAddressDefault(){
    addressService.setAddressDefault(18,29,"维生素");
}

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
@PathVariable("aid") Integer aid,HttpSession session
GET
JsonResult<Void>

3.3 完成请求方法

在AddressController类中编写请求处理方法

//RestFul风格编写
@RequestMapping("{aid}/set_default")
public JsonResult<Void> setAddressDefault(@PathVariable("aid") Integer aid, HttpSession session){
    addressService.setAddressDefault(
        aid,
        getUidFromSession(session),
        getUsernameFormSession(session));
    return new JsonResult<>(OK);
}

测试:http://localhost:8080/address/20/set_default

4.前端界面

1.给设置默认收货地址俺就添加一个onclick属性,指向一个方法的调用,在这个方法中来完成ajax请求的方法。

function showAddressList(){
    $.ajax({
        url: "/address",
        type: "get",
        dataType: "JSON",
        success: function (json) {
            if (json.state == 200){
                let list = json.data;
                for (let i = 0; i < list.length; i++) {
                    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 onclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">设为默认</a></td>\n' +
                        
                        '</tr>';

                    tr = tr.replace("#{tag}",list[i].tag);
                    tr = tr.replace("#{name}",list[i].name);
                    tr = tr.replace("#{address}",list[i].address);
                    tr = tr.replace("#{phone}",list[i].phone);
                    ////	\/	
                    tr = tr.replace("#{aid}",list[i].aid)
                    
                    $("#address-list").append(tr);
                }
                $(".add-def:eq(0)").hide();
            }else{
                alert("用户收货地址数据加载失败")
            }
        }
    });
}

address.html页面中点击“设置默认”按钮,来发送ajax请求。完成setDefault()方法的声明和定义。

function setDefault(aid) {
    $.ajax({
        url: "/address/" + aid + "/set_default",
        type: "POST",
        dataType: "JSON",
        success: function (json) {
            if (json.state == 200){
                //重新加载收货地址界面
                $("#address-list").empty();
                showAddressList();
            }else{
                alert("设置默认收货地址失败")
            }
        },
        error: function (xhr) {
            alert("设置默认收货地址时产生未知异常" + xhr.message);
        }
    });
}

注:在最后一步中如果状态码为200重新加载页面时,若不添加$("#address-list").empty();则会出现list数据一直叠加的效果。

标签:springboot,收货,tr,list,地址,address,aid,uid
来源: https://www.cnblogs.com/jiabowenn/p/15859988.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有