当前位置:   article > 正文

Java十天上手做一个自己的web商城笔记-收获地址的展示、设置与删除(10)_java修改收货地址

java修改收货地址

 该系列博客主要记录笔者的开发过程,参考B站系列视频:【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战_哔哩哔哩_bilibili

所用的一些版本信息:

IDEA开发、JDK1.8版本以上、maven3.61版本以上,springboot,DataGrip管理数据库

收获地址的展示、设置与删除: 

1.持久层

1.1 SQL语句

1.数据库查询 select

  按照默认与创建时间排序

2.设置地址为默认

    检测当前用户选中的地址数据是否存在(select)

    先将所有的收获地址设置为非默认(update)

    再将当前地址设置为默认(update)

3.删除一条数据 delete

    (1)如果用户删除的是默认的收获地址,需要将剩下的最新修改的收获地址设置为收获地址。

        select 查询最新修改的收获地址。

    (2)如果用户只有一条地址,就不需要上述过程。

1.2 接口设计

store\src\main\java\com\cy\store\mapper\AddressMapper.java

  1. /**
  2. * 根据用户id查询用户收获地址数据
  3. * @param uid 用户id
  4. * @return 收获地址列表
  5. */
  6. List<Address> findByUid(Integer uid);
  7. /**
  8. * 根据aid查询用户收获地址数据
  9. * @param aid
  10. * @return
  11. */
  12. Address findByAid(Integer aid);
  13. /**
  14. * 根据用户id设置所有的地址为非默认
  15. * @param uid
  16. * @return 影响行数
  17. */
  18. Integer updateNonDefault(Integer uid);
  19. /**
  20. * 根据aid设置当前地址为默认地址
  21. * @param aid
  22. * @return 影响行数
  23. */
  24. Integer updateDefalultByAid(Integer aid, String modifiedUser, Date modifiedTime);
  25. /**
  26. * 根据aid删除地址数据
  27. * @param aid
  28. * @return 影响行数
  29. */
  30. Integer deleteByAid(Integer aid);
  31. /**
  32. * 根据用户uid查询当前用户最后一次被修改的收获地址数据
  33. * @param uid
  34. * @return
  35. */
  36. Address findLastModified(Integer uid);

1.3 SQL映射

store\src\main\resources\mapper\AddressMapper.xml

  1. <select id="findByUid" resultMap="AddressEntityMap">
  2. SELECT * FROM t_address WHERE uid = #{uid}
  3. ORDER BY is_default DESC, created_time DESC
  4. </select>
  5. <select id="findByAid" resultMap="AddressEntityMap">
  6. SELECT * FROM t_address WHERE aid = #{aid}
  7. </select>
  8. <update id="updateNonDefault">
  9. update t_address SET is_default=0 WHERE uid = #{uid}
  10. </update>
  11. <update id="updateDefalultByAid">
  12. update t_address
  13. SET is_default=1, modified_user = #{modifiedUser}, modified_time = #{modifiedTime}
  14. WHERE aid = #{aid}
  15. </update>
  16. <delete id="deleteByAid">
  17. DELETE FROM t_address WHERE aid =#{aid}
  18. </delete>
  19. <select id="findLastModified" resultMap="AddressEntityMap">
  20. SELECT * FROM t_address
  21. WHERE uid=#{uid}
  22. ORDER BY modified_time DESC LIMIT 0,1
  23. </select>

1.4 单元测试

store\src\test\java\com\cy\store\mapper\AddressMapperTests.java

  1. @Test
  2. public void FindeByUid(){
  3. System.out.println(addressMapper.findByUid(29));
  4. }
  5. @Test
  6. public void findByAid(){
  7. System.out.println(addressMapper.findByAid(1));
  8. }
  9. @Test
  10. public void updateNonDefault(){
  11. addressMapper.updateNonDefault(29);
  12. }
  13. @Test
  14. public void updateDefalultByAid(){
  15. addressMapper.updateDefalultByAid(10,"管理员", new Date());
  16. }
  17. @Test
  18. public void deleteByAid(){
  19. addressMapper.deleteByAid(5);
  20. }
  21. @Test
  22. public void findLastModified(){
  23. System.out.println(addressMapper.findLastModified(29));
  24. }

2.业务层

2.1 异常规划

1.更新时 UpdateException

2.访问数据不是当前登录用户的数据,非法访问:AccessDeniedException

3.收获地址可能不存在,AddressNotFoundException

4.执行删除时,产生未知的删除异常,DeleteException

store\src\main\java\com\cy\store\service\ex下创建异常,代码略

2.2 设计接口和抽象方法

store\src\main\java\com\cy\store\service\IAddressService.java

  1. /**
  2. * 根据UID查询地址
  3. * @param uid
  4. * @return
  5. */
  6. List<Address> getByUid(Integer uid);
  7. /**
  8. * 修改某一条地址数据为默认值
  9. * @param uid
  10. * @param aid
  11. * @param username
  12. */
  13. void setDefault(Integer uid, Integer aid, String username);
  14. /**
  15. * 删除地址数据
  16. * @param aid
  17. * @param uid
  18. * @param username
  19. */
  20. void delete(Integer aid, Integer uid, String username);

2.3 抽象方法实现

store\src\main\java\com\cy\store\service\impl\AddressServiceImpl.java

  1. @Override
  2. public List<Address> getByUid(Integer uid) {
  3. List<Address> list = addressMapper.findByUid(uid);
  4. for(Address address:list){
  5. address.setUid(null);
  6. address.setProvinceCode(null);
  7. address.setCityCode(null);
  8. address.setAreaCode(null);
  9. address.setCreatedUser(null);
  10. address.setCreatedTime(null);
  11. address.setModifiedUser(null);
  12. address.setModifiedTime(null);
  13. }
  14. return addressMapper.findByUid(uid);
  15. }
  16. @Override
  17. public void setDefault(Integer uid, Integer aid, String username) {
  18. Address result = addressMapper.findByAid(aid);
  19. if(result==null){
  20. throw new AddressNotFountException("收获地址不存在");
  21. }
  22. //当前的地址数据是否归属与当前用户
  23. if(!result.getUid().equals(uid)){
  24. throw new AccessDeniedException("非法访问数据");
  25. }
  26. //更新操作
  27. Integer rows = addressMapper.updateNonDefault(uid);
  28. if(rows<1){
  29. throw new UpdateException("更新时产生位置异常");
  30. }
  31. rows = addressMapper.updateDefalultByAid(aid, username, new Date());
  32. if(rows!=1){
  33. throw new UpdateException("更新时产生位置异常");
  34. }
  35. }
  36. @Override
  37. public void delete(Integer aid, Integer uid, String username) {
  38. Address result = addressMapper.findByAid(aid);
  39. if(result==null){
  40. throw new AddressNotFountException("收获地址不存在");
  41. }
  42. //当前的地址数据是否归属与当前用户
  43. if(!result.getUid().equals(uid)){
  44. throw new AccessDeniedException("非法访问数据");
  45. }
  46. Integer rows = addressMapper.deleteByAid(aid);
  47. if(rows!=1){
  48. throw new UpdateException("删除时产生位置异常");
  49. }
  50. Integer cnt = addressMapper.countByUid(uid);
  51. if(cnt == 0){
  52. return;
  53. }
  54. if(result.getIsDefault()==1){ //将最新的地址数据修改为默认
  55. Address address = addressMapper.findLastModified(uid);
  56. rows = addressMapper.updateDefalultByAid(address.getAid(),username,new Date());
  57. }
  58. if(rows!=1){
  59. throw new UpdateException("更新时产生位置异常");
  60. }
  61. }

2.4 单元测试

store\src\test\java\com\cy\store\service\AddressServiceImplTests.java

  1. @Test
  2. public void findByUid(){
  3. List<Address> list = addressService.getByUid(29);
  4. for(Address add:list){
  5. System.out.println(add);
  6. }
  7. }
  8. @Test
  9. public void setDefault(){
  10. try {
  11. addressService.setDefault(29,10,"小明");
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. @Test
  17. public void delete(){
  18. addressService.delete(9,29,"tt");
  19. }

3.控制层

3.0 处理异常

在store\src\main\java\com\cy\store\controller\BaseController.java中统一处理异常

3.1 请求设计

查询地址:

  1. URL:/addresses
  2. 请求参数:HttpSession session
  3. 请求方式:GET
  4. 返回值:JsonResult<List<Address>>

修改地址的默认值(使用restful风格提交数据):

  1. URL:/addresses/{aid}/set_default
  2. 请求参数:@PathVariable("aid")Integer aid, HttpSession session
  3. 请求方式:GET
  4. 返回值:JsonResult<Void>

删除地址:

  1. URL:/addresses/{aid}/delete
  2. 请求参数:@PathVariable("aid")Integer aid, HttpSession session
  3. 请求方式:POST
  4. 返回值:JsonResult<Void>

3.2 处理请求

在store\src\main\java\com\cy\store\controller\AddressController.java中添加如下接口

  1. @RequestMapping({"","/"})
  2. public JsonResult<List<Address>> getByUid(HttpSession session){
  3. Integer uid = getuidFromSession(session);
  4. List<Address> data= addressService.getByUid(uid);
  5. return new JsonResult<>(OK,data);
  6. }
  7. //Restful风格进行请求
  8. @RequestMapping("{aid}/set_default")
  9. public JsonResult<Void> setDefault(@PathVariable("aid")Integer aid, HttpSession session){
  10. addressService.setDefault(getuidFromSession(session),
  11. aid, getusernameFromSession(session));
  12. return new JsonResult<>(OK);
  13. }
  14. @RequestMapping("{aid}/delete")
  15. public JsonResult<Void> delete(@PathVariable("aid")Integer aid, HttpSession session){
  16. addressService.delete(aid,
  17. getuidFromSession(session),
  18. getusernameFromSession(session));
  19. return new JsonResult<>(OK);
  20. }

3.3 测试

使用对应的接口在浏览器中进行测试.

4.前端页面

在store\src\main\resources\static\web\address.html中添加如下代码:

  1. <script type="text/javascript">
  2. $(document).ready(function () {
  3. showAddressList();
  4. });
  5. function showAddressList() {
  6. $("#address-list").empty();
  7. $.ajax({
  8. url: "/addresses",
  9. type: "GET",
  10. dataType: "JSON",
  11. success: function (json) {
  12. let list = json.data;
  13. for (let i = 0; i < list.length; i++) {
  14. console.log(list[i].name);
  15. let address = '<tr>'
  16. + '<td>#{tag}</td>'
  17. + '<td>#{name}</td>'
  18. + '<td>#{province}#{city}#{area}#{address}</td>'
  19. + '<td>#{phone}</td>'
  20. + '<td><a class="btn btn-xs btn-info"><span class="fa fa-edit"></span> 修改</a></td>'
  21. + '<td><a onclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>'
  22. + '<td><a onclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">设为默认</a></td>'
  23. + '</tr>';
  24. address = address.replace(/#{aid}/g, list[i].aid);
  25. address = address.replace(/#{tag}/g, list[i].tag);
  26. address = address.replace("#{name}", list[i].name);
  27. address = address.replace("#{province}", list[i].provinceName);
  28. address = address.replace("#{city}", list[i].cityName);
  29. address = address.replace("#{area}", list[i].areaName);
  30. address = address.replace("#{address}", list[i].address);
  31. address = address.replace("#{phone}", list[i].phone);
  32. $("#address-list").append(address);
  33. }
  34. $(".add-def:eq(0)").hide();
  35. }
  36. });
  37. }
  38. function setDefault(aid) {
  39. $.ajax({
  40. url: "/addresses/" + aid + "/set_default",
  41. type: "POST",
  42. dataType: "JSON",
  43. success: function(json) {
  44. if (json.state == 200) {
  45. showAddressList();
  46. } else {
  47. alert("设置默认收货地址失败!" + json.message);
  48. }
  49. },
  50. error: function(json) {
  51. alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + json.status);
  52. location.href = "login.html";
  53. }
  54. });
  55. }
  56. function deleteByAid(aid) {
  57. $.ajax({
  58. url: "/addresses/" + aid + "/delete",
  59. type: "POST",
  60. dataType: "JSON",
  61. success: function(json) {
  62. if (json.state == 200) {
  63. showAddressList();
  64. } else {
  65. alert("删除收货地址失败!" + json.message);
  66. }
  67. },
  68. error: function(xhr) {
  69. alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);
  70. location.href = "login.html";
  71. }
  72. });
  73. }
  74. </script>

测试前端功能

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/191636
推荐阅读
相关标签
  

闽ICP备14008679号