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

1,127 阅读2分钟

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 {


    @Autowired
    private 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) {

            //将当前用户数据库中为默认地址的数据设置为0
            TsPtlUser 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不能存在

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