tags: 移动商城项目


移动商城第十四篇【收货地址查询、添加、更新】

我们接下来要做的就是用户的收货地址部分。

修改其超链接:


<li><a href="${path}/user/login/toDeliverAddress.do" title="收货地址" class="here">收货地址</a></li>复制代码

提供对应的controller方法

/*** 跳转到收货地址页面* @return*/@RequestMapping("/login/toDeliverAddress.do")public String toDeliverAddress() {return "person/deliverAddress";}复制代码

进去页面以后是这样子的:

看到我们收货地址的数据库表:

  • 一个用户对应多个地址

数据库表的字段也很简单,没什么好说的:

DROP TABLE EB_SHIP_ADDR CASCADE CONSTRAINTS;CREATE TABLE EB_SHIP_ADDR  (SHIP_ADDR_ID         NUMBER(11)                      NOT NULL,PTL_USER_ID          NUMBER(11),SHIP_NAME            VARCHAR2(80)                    NOT NULL,PROVINCE             VARCHAR2(40)                    NOT NULL,CITY                 VARCHAR2(40)                    NOT NULL,DISTRICT             VARCHAR2(40)                    NOT NULL,ZIP_CODE             VARCHAR2(40),ADDR                 VARCHAR2(400)                   NOT NULL,PHONE                VARCHAR2(60)                    NOT NULL,DEFAULT_ADDR         NUMBER(1)                      DEFAULT 0 NOT NULL,CONSTRAINT PK_EB_SHIP_ADDR PRIMARY KEY (SHIP_ADDR_ID)
);COMMENT ON TABLE EB_SHIP_ADDR IS
'收货地址';COMMENT ON COLUMN EB_SHIP_ADDR.SHIP_ADDR_ID IS
'收货人地址主键';COMMENT ON COLUMN EB_SHIP_ADDR.PTL_USER_ID IS
'前台用户ID';COMMENT ON COLUMN EB_SHIP_ADDR.SHIP_NAME IS
'收货人姓名';COMMENT ON COLUMN EB_SHIP_ADDR.PROVINCE IS
'省份';COMMENT ON COLUMN EB_SHIP_ADDR.CITY IS
'城市';COMMENT ON COLUMN EB_SHIP_ADDR.DISTRICT IS
'地区';COMMENT ON COLUMN EB_SHIP_ADDR.ZIP_CODE IS
'邮编';COMMENT ON COLUMN EB_SHIP_ADDR.ADDR IS
'街道地址';COMMENT ON COLUMN EB_SHIP_ADDR.PHONE IS
'联系电话';COMMENT ON COLUMN EB_SHIP_ADDR.DEFAULT_ADDR IS
'默认收货地址:若为默认收货地址则为1。';
复制代码

查询当前用户的收货地址

逆向工程数据库表:

dao


/*** 继承SqlSessionDaoSupport能够得到sessionFactory的引用,非常方便!*/
@Repository
public class EbShipAddrDaoImpl extends SqlSessionDaoSupport implements EbShipAddrDao {String nameSpace = "com.rl.ecps.sqlMap.EbShipAddrMapper.";public List<EbShipAddr> findUserAddress(Long userId) {return this.getSqlSession().selectList(nameSpace + "findUserAddress", userId);}}复制代码

service

@Service
public class EbShipAddrServiceImpl implements EbShipAddrService {@Autowiredprivate EbShipAddrDao addrDao;public List<EbShipAddr> findUserAddress(Long userId) {return addrDao.findUserAddress(userId);}
}复制代码

controller

/*** 跳转到收货地址页面** @return*/@RequestMapping("/login/toDeliverAddress.do")public String toDeliverAddress(HttpSession session,Model model) {TsPtlUser user = (TsPtlUser) session.getAttribute("user");Long ptlUserId = user.getPtlUserId();List<EbShipAddr> userAddress = addrService.findUserAddress(ptlUserId);model.addAttribute("userAddress", userAddress);return "person/deliverAddress";}复制代码

已经把地址查询出来了。

新增和修改我们可以使用有无地址的id来进行判断,如果是修改的话,那么是有地址id的,如果是新增的话,是没有地址id的

新增地址

将主键设置为自动增长。

<insert id="insert" parameterType="com.rl.ecps.model.EbShipAddr" >insert into EB_SHIP_ADDR (SHIP_ADDR_ID, PTL_USER_ID, SHIP_NAME, PROVINCE, CITY, DISTRICT, ZIP_CODE, ADDR, PHONE, DEFAULT_ADDR, FIXED_PHONE)values (seqshipaddrid.nextval, #{ptlUserId,jdbcType=DECIMAL}, #{shipName,jdbcType=VARCHAR},#{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{district,jdbcType=VARCHAR}, #{zipCode,jdbcType=VARCHAR}, #{addr,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR}, #{defaultAddr,jdbcType=DECIMAL}, #{fixedPhone,jdbcType=VARCHAR})</insert>
复制代码

dao:

public void insert(EbShipAddr addr) {this.getSqlSession().insert(nameSpace + "insert", addr);}复制代码

service:

public void insert(EbShipAddr addr) {addrDao.insert(addr);}
复制代码

controller:

/*** 添加或修改地址** @return*/@RequestMapping("/saveOrUpdateAddress.do")public String saveOrUpdateAddress(EbShipAddr addr, HttpSession session) {TsPtlUser user = (TsPtlUser) session.getAttribute("user");addr.setPtlUserId(user.getPtlUserId());if (addr.getShipAddrId() == null) {addrService.insert(addr);}return "redirect:login/toDeliverAddress.do";}复制代码

修改地址

修改地址实际上就是点击编辑的时候,将该地址数据写到下面的输入框中:

根据地址id获取得到id的详细信息:


<a href="javascript:void(0);" title="修改" onclick="getAddr(${address.shipAddrId})"class="blue">[修改]</a>复制代码

dao

public EbShipAddr selectByPrimaryKey(Long addrId) {return this.getSqlSession().selectOne(nameSpace + "selectByPrimaryKey", addrId);}
复制代码

service:

public EbShipAddr selectByPrimaryKey(Long addrId) {return addrDao.selectByPrimaryKey(addrId);}复制代码

ajax:

function getAddr(shipAddrId) {$.ajax({url: "${path}/user/getAddr.do",data: {shipAddrId: shipAddrId},type: "post",success:function (responseText) {var parseJSON = $.parseJSON(responseText);$("#shipAddrId").val(parseJSON.addr.shipAddrId);$("#shipName").val(parseJSON.addr.shipName);$("#province").val(parseJSON.addr.province);$("#mycity").val(parseJSON.addr.city);$("#district").val(parseJSON.addr.district);$("#addr").val(parseJSON.addr.addr);$("#zipCode").val(parseJSON.addr.zipCode);$("#phone").val(parseJSON.addr.phone);},error:function () {alert("系统错误了");}});复制代码

controller:

/*** 根据id获取收货地址详细信息,返回给浏览器** @return*/@RequestMapping("/getAddr.do")public void getAddr(Long shipAddrId,HttpServletResponse response) {EbShipAddr ebShipAddr = addrService.selectByPrimaryKey(shipAddrId);//返回JSON数据出去JSONObject jsonObject = new JSONObject();jsonObject.accumulate("addr", ebShipAddr);String result = jsonObject.toString();//JSON数据带有中文,编码后输出ResourcesUtils.printJSON(result, response);}
复制代码

效果:

通过隐藏域将id带过去给controller

//ajax在显示数据的时候,已经把id给赋值了。<input type="hidden"  id="shipAddrId" name="shipAddrId">复制代码

dao:

public void updateByPrimaryKeySelective(EbShipAddr addr) {this.getSqlSession().update(nameSpace + "updateByPrimaryKeySelective", addr);}复制代码

service:

public void updateByPrimaryKeySelective(EbShipAddr addr) {addrDao.updateByPrimaryKeySelective(addr);}复制代码

controller:

/*** 添加或修改地址** @return*/@RequestMapping("/saveOrUpdateAddress.do")public String saveOrUpdateAddress(EbShipAddr addr, HttpSession session) {TsPtlUser user = (TsPtlUser) session.getAttribute("user");addr.setPtlUserId(user.getPtlUserId());if (addr.getShipAddrId() == null) {addrService.insert(addr);} else {//如果是有id的,那么就是更新操作!addrService.updateByPrimaryKeySelective(addr);}return "redirect:login/toDeliverAddress.do";}复制代码

设置为默认地址的样式

当地址是默认地址时,才有样式。我们现在是全部都有样式。可以直接判断来进行给出哪个是有样式的

<tr <c:if test="${addr.defaultAddr == 1 }">class='here'</c:if>>
复制代码

当然了,默认的地址只允许有一个,因此我们还需要对其做后台校验

  • 如果在页面在设置了某地址为默认地址,那么数据库中的默认地址全都设置为不是默认地址!
<td class="def blue"><a href="${path}/user/updateDefault.do?shipAddrId=${address.shipAddrId}">设为默认</a></td>
复制代码

将当前用户下的地址都设置为不是默认地址:

<update id="deleteDefault" parameterType="long">update EB_SHIP_ADDR SET DEFAULT_ADDR = 0 WHERE  DEFAULT_ADDR=1 AND PTL_USER_ID = #{userId}</update><update id="updateDefault" parameterType="long">update EB_SHIP_ADDR SET DEFAULT_ADDR = 1 WHERE SHIP_ADDR_ID = #{addrId}</update>复制代码

dao:

    public void updateDefault(Long addrId) {this.getSqlSession().update(nameSpace + "updateDefault", addrId);}public void deleteDefault(Long userId) {this.getSqlSession().update(nameSpace + "deleteDefault", userId);}
复制代码

service:

public void updateDefault(Long addrId) {addrDao.updateDefault(addrId);}public void deleteDefault(Long userId) {addrDao.deleteDefault(userId);}复制代码

controller:

/*** 将地址设置为默认地址** @return*/@RequestMapping("/updateDefault.do")public String updateDefault(Long shipAddrId,HttpSession session) {if (shipAddrId != null) {//将当前用户数据库中为默认地址的数据设置为0TsPtlUser user = (TsPtlUser) session.getAttribute("user");addrService.deleteDefault(user.getPtlUserId());//将其地址设置为默认地址addrService.updateDefault(shipAddrId);}return "redirect:login/toDeliverAddress.do";}
复制代码

如果是在修改/新增里边设置地址为默认,那么在新增/修改之前把所有的去除即可:

if (addr.getDefaultAddr() == 1) {addrService.deleteDefault(user.getPtlUserId());}
复制代码

判断收货地址是否大于5

规定收货地址不能多于5个,我们就可以判断集合的长度从而提示客户

<input type="hidden" id="listCount" value="${fn:length(userAddress)}">复制代码
    $("#jvForm").submit(function(){var listCount = $("#listCount").val();var shipAddrId = $("#shipAddrId").val();if(listCount >= '5' && (shipAddrId == null || shipAddrId == "")){alert("收货地址不能超过5个");return false;}else{return true;}})
复制代码

总结

  • 使用ajax将某地址的具体信息查询出来,返回JSON给浏览器进行回显数据。
  • 通过地址id的有无来执行更新或添加操作
  • 设置默认地址其实就是将原先是默认地址的去除,后边再修改为默认地址
  • 在添加地址时,判断地址的数量可用集合的长度来判断,并且地址的id不能存在

如果您觉得这篇文章帮助到了您,可以给作者一点鼓励

移动商城第十四篇【收货地址查询、添加、更新】相关推荐

  1. Django 19购物商城项目(收货地址:添加、修改)

    dDjango 19购物商城项目 1.新建axf_addr,收货地址表 2.路由 3.cart页面,添加默认收货地址 4.视图(主要修改了cart.新建了收货地址相关方法) 5.收货地址列表 6.收货 ...

  2. Django项目实践(商城):十一、收货地址

    (根据居然老师直播课内容整理) 一.页面功能简介 在"用户中心"的任一界面,点击左边"收货地址"后,显示下面界面 此界面包括以下4个功能: 新增收货地址 删除当 ...

  3. 移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】

    移动商城[用户登陆.回显用户] 我们来实现用户登陆的功能: 当点击的时候,出来的是一个弹出框,我们想要切换成一个页面. 找到对应的事件.切换成我们的页面就行了. $("#loginAlert ...

  4. DRF 商城项目 - 用户操作(收藏, 留言, 收货地址)

    个人收藏 整体逻辑类似于 个人中心 ( 个人中心的相关逻辑梳理详情  点击这里 ) 也是两个序列化组价的分流 查看收藏  ( list ) 详情指向 收藏详情 的组价 创建收藏 ( create ) ...

  5. SpringBoot电脑商城-收货地址

    收货地址 1. 新增收获地址 1.1 数据库表创建 1.2 创建实体类 1.3 持久层 1.4 业务层 1.5 控制层 1.6 前端页面 2. 获取省市区列表 2.1 数据库表 2.2 实体类 2.3 ...

  6. Vue3电商项目实战-结算支付 3【05-结算-收货地址-添加、06-结算-收货地址-修改、07-结算-提交订单】

    文章目录 05-结算-收货地址-添加 06-结算-收货地址-修改 07-结算-提交订单 05-结算-收货地址-添加 目的:实现收货地址的添加. 大致步骤: 独立组件,准备一个对话框 完成表单布局 完成 ...

  7. CCNP-第十四篇-BGP综合实验

    CCNP-第十四篇-BGP综合实验 大家好呀,学了那么长时间的BGP,又是一个巨大分水岭,那怎么能没综合实验呢? 答案以及个人录制视屏(数字那个视频因为录制软件的问题看不到命令行可以直接看后面的,不喜 ...

  8. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新 转载于:https://www.cnblogs.com/weiman3389/p/6224181.html

  9. CCIE-LAB-第十四篇-PIM Sparst+IGMP

    CCIE-LAB-第十四篇-PIM Sparst+IGMP 实际中,思科只会给你5个小时去做下面的全部配置 这个是CCIE-LAB的拓扑图 问题 翻译 FABD2正准备在其网络中启用PIM稀疏模式的中 ...

  10. CCNA-第十四篇-NAT-下+链路聚合(LACP)+DHCP

    CCNA-第十四篇-NAT-下 这一篇是是针对一下华为设备的nat,然后讲讲链路聚合 下一篇来一个DHCP+一点点的SDN的介绍 **然后讲完SDN就基本上CCNA结束了哦** 华为的链路聚合叫Eth ...

最新文章

  1. 有效数据外含有额外数据_basemap之地图上画额外数据
  2. 收集下阿里集团下的技术BLOG
  3. linux下vim编辑器插件,linux vim编辑器插件的安装和设置方法
  4. centos下svn安装,svn用户管理,svn用户目录管理(虚拟机下访问)
  5. P1111 修复公路 (prim)
  6. python实现深度优先搜索_python中的深度优先搜索算法
  7. 1 二进制(glibc版)安装MySQL实现主从复制(亲测)
  8. HTML:内存溢出和内存泄漏
  9. 浅谈JSON数据解析方法
  10. Atitit.导出excel功能的设计 与解决方案
  11. SpringBoot学习---thymeleaf模板引擎
  12. android框架揭秘之Java服务学习笔记
  13. 什么软件可以压缩图片大小?这几个软件值得收藏
  14. Arduino AFMotor 电机扩展板概述
  15. 魔兽世界编程宝典(4-1)
  16. 计算机硬件4核是什么意思,8核,6核,4核和双核CPU是什么意思?
  17. Path.Direction.CCW与Path.Direction.CW的意思
  18. Html5游戏开发攻略(API篇)
  19. with open (files_name) as f
  20. 根据当前日期进行以下方面的处理: 1、取得日期的年份、月份、天、时、分、秒,并转换成大写日期格式 如:2013年8月17日 20时30分20秒 2、根据日期的不同时间段,做问候语: 早上8:00-12

热门文章

  1. c语言的数组长度问题
  2. 鸟哥-服务器 学习笔记
  3. Python程序中的进程操作-进程同步(multiprocess.Lock)
  4. 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题
  5. Eclipse.技巧
  6. 开发API整理(转)
  7. 迭代器,生成器,三元表达式,列表解析式
  8. Java中的ArrayList类和LinkedList
  9. Vue中全局导入和按需导入的区别
  10. HDU 1358 (所有前缀中的周期串) Period