新增收货地址【项目 商城】

新增收货地址【项目 商城】

  • 新增收货地址
    • 1 新增收货地址-数据表创建
    • 2 新增收货地址-创建实体类
    • 3 新增收货地址-持久层
      • 3.1 各功能的开发顺序
      • 3.2 规划需要执行的SQL语句
      • 3.3 接口与抽象方法
      • 3.4 配置SQL映射
    • 测试
    • 4 新增收货地址-业务层
      • 4.1 规划异常
      • 4.2 接口与抽象方法
    • 测试
    • 5 新增收货地址-控制器
      • 5.1 处理异常
      • 5.2 设计请求
      • 5.3 处理请求
    • 测试
    • 6 新增收货地址-前端页面
    • 测试

新增收货地址

在这里插入图片描述
在这里插入图片描述

1 新增收货地址-数据表创建

CREATE TABLE t_address
(aid           INT AUTO_INCREMENT COMMENT '收货地址id',uid           INT COMMENT '归属的用户id',name          VARCHAR(20) COMMENT '收货人姓名',province_name VARCHAR(15) COMMENT '省-名称',province_code CHAR(6) COMMENT '省-行政代号',city_name     VARCHAR(15) COMMENT '市-名称',city_code     CHAR(6) COMMENT '市-行政代号',area_name     VARCHAR(15) COMMENT '区-名称',area_code     CHAR(6) COMMENT '区-行政代号',zip           CHAR(6) COMMENT '邮政编码',address       VARCHAR(50) COMMENT '详细地址',phone         VARCHAR(20) COMMENT '手机',tel           VARCHAR(20) COMMENT '固话',tag           VARCHAR(6) COMMENT '标签',is_default    INT COMMENT '是否默认:0-不默认,1-默认',created_user  VARCHAR(20) COMMENT '创建人',created_time  DATETIME COMMENT '创建时间',modified_user VARCHAR(20) COMMENT '修改人',modified_time DATETIME COMMENT '修改时间',PRIMARY KEY (aid)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;

t_address.sql


2 新增收货地址-创建实体类

创建一个类Address ,在类中对应表中的相关字段,采用驼峰命名方式。最后再去继承BaseEntity 类

**entity | Address **

package com.cy.store.entity;import java.io.Serializable;
import java.util.Objects;/** 收货地址数据的实体类 */
public class Address extends BaseEntity implements Serializable {private Integer aid;private Integer uid;private String name;private String provinceName;private String provinceCode;private String cityName;private String cityCode;private String areaName;private String areaCode;private String zip;private String address;private String phone;private String tel;private String tag;private Integer isDefault;//contructor get set equals hashcode toString //ALT+INSert//..........}

3 新增收货地址-持久层

3.1 各功能的开发顺序

当前的收货地址功能模块:列表的展示、修改、删除、设置默认、新增收货地址。
开发顺序:新增收货地址-列表展示-设置默认收货地址-删除-修改收货地址

3.2 规划需要执行的SQL语句

1.对应的是插入语句:

insert into t_address(除了adi外字段列表) values(字段值列表)

2.一个用户的收货地址规定最多只能有20条数据对应。
在插入用户数据之前先做查询操作。
收货地址逻辑控制方面的一个异常。超过20–异常

select count(*) from t_address where uid=?

3.3 接口与抽象方法

1.创建一个新的接口AddressMapper,在这个接口中来定义两个SQL语句抽象方法。

package com.cy.store.mapper;import com.cy.store.entity.Address;/** 收货地址持久层的接口*/
public interface AddressMapper {/*** 插入用户的收货地址数据* @param address 收货地址数据* @return 影响的行数*/Integer insert(Address address);/*** 根据用户的id统计收货地址数量* @param uid 用户的id* @return 当前用户的收货地址总数*/Integer countByUid(Integer uid);
}

3.4 配置SQL映射

创建一个AddressMapper.xml映射文件,在这个文件中添加抽象方法的映射SQL语句。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.store.mapper.AddressMapper"><resultMap id="AddressEntityMap" type="com.cy.store.entity.Address"><id column="aid" property="aid"/><result column="province_code" property="provinceCode"/><result column="province_name" property="provinceName"/><result column="city_code" property="cityCode"/><result column="city_name" property="cityName"/><result column="area_code" property="areaCode"/><result column="area_name" property="areaName"/><result column="is_default" property="isDefault"/><result column="created_user" property="createdUser"/><result column="created_time" property="createdTime"/><result column="modified_user" property="modifiedUser"/><result column="modified_time" property="modifiedTime"/></resultMap><insert id="insert" useGeneratedKeys="true" keyProperty="aid">INSERT INTO t_address (uid, name, province_name, province_code, city_name, city_code, area_name, area_code, zip,address, phone, tel, tag, is_default, created_user, created_time, modified_user,modified_time)VALUES (#{uid}, #{name}, #{provinceName}, #{provinceCode}, #{cityName}, #{cityCode}, #{areaName},#{areaCode}, #{zip}, #{address}, #{phone}, #{tel}, #{tag}, #{isDefault}, #{createdUser},#{createdTime}, #{modifiedUser}, #{modifiedTime})</insert><select id="countByUid" resultType="java.lang.Integer">SELECT count(*) from t_address WHERE uid=#{uid}</select>
</mapper>

AddressMapper


测试

2.在test下mapper下AddressMapperTests

package com.cy.store.mapper;import com.cy.store.entity.Address;
import com.cy.store.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Date;//@SpringBootTest:表示标注当前的类是测试类,不会随同项目一块打包
@SpringBootTest
//@RunWith:表示启动这个单元测试类(单元测试类是不能够运行的),需要传递一个参数,必须是SpringRunner的实例类型
//@RunWith(SpringRunner.class)
public class AddressMapperTests {@Autowiredprivate AddressMapper addressMapper;@Testpublic void insert(){Address address=new Address();address.setUid(8);address.setPhone("17858802974");address.setName("女朋友");addressMapper.insert(address);}@Testpublic void countByUid(){Integer count = addressMapper.countByUid(8);System.out.println(count);}}

AddressMapperTests–新增收货地址


4 新增收货地址-业务层

4.1 规划异常

如果用户是第一次插入用户的收货地址,规则:当用户插入的地址是第一条时,需要将第一条地址作为默认收货地址,如果查询的统计总数为0,则将当前的地址的is_default值设置为1。查询统计的结果为0不代表异常。查询到的结果大于20,这时候需要抛出业务控制的异常AddressCountLimitException异常。自行创建这个异常。

package com.cy.store.service.ex;/* 收货地址数量达到上限的异常 */
public class AddressCountLimitException extends ServiceException{public AddressCountLimitException() {super();}public AddressCountLimitException(String message) {super(message);}public AddressCountLimitException(String message, Throwable cause) {super(message, cause);}public AddressCountLimitException(Throwable cause) {super(cause);}protected AddressCountLimitException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

插入数据时产生的异常InsertException,不再需要重复创建。

4.2 接口与抽象方法

1.创建一个AddressService接口,在其中第定义业务的抽象方法

package com.cy.store.service;import com.cy.store.entity.Address;/**收货地址业务层的接口*/
public interface IAddressService {void addNewAddress(Integer uid,String username,Address address);
}

2.创建一个AddressServiceImpl实现类,去实现接口的抽象方法。
在配置文件中定义数据。

# Spring 读取配置文件的数据:@Value(${user.address.max-count})
user.address.max-count=20

在实现类中实现业务控制

    @Value("${user.address.max-count}")private Integer maxCount;

测试

3.测试业务层的过程是否正常。AddressServiceTests测试业务功能。

package com.cy.store.service;import com.cy.store.entity.Address;
import com.cy.store.entity.User;
import com.cy.store.service.ex.ServiceException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;//@SpringBootTest:表示标注当前的类是测试类,不会随同项目一块打包
@SpringBootTest
//@RunWith:表示启动这个单元测试类(单元测试类是不能够运行的),需要传递一个参数,必须是SpringRunner的实例类型
//@RunWith(SpringRunner.class)
public class AddressServiceTests {@Autowiredprivate IAddressService addressService;@Testpublic void addNewAddress(){Address address=new Address();address.setUid(8);address.setPhone("17858809999");address.setName("女朋友");addressService.addNewAddress(8,"管理员",address);}}

AddressServiceTests–addNewAddress


5 新增收货地址-控制器

5.1 处理异常

业务层抛出了收货地址总数超标的异常,在BaseController中进行处理。

package com.cy.store.controller;import com.cy.store.controller.ex.*;
import com.cy.store.service.ex.*;
import com.cy.store.util.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;import javax.servlet.http.HttpSession;/*** 控制层类的基类*/
public class BaseController {/**操作成功的状态码 */public static final int OK=200;//请求处理方法,这个方法的返回值就是需要传递给前端的数据//自动将异常对象传递给此方法的参数列表上//当前项目中产生的异常会被拦截到此方法中,这个方法此时充当的是请求处理方法,方法的返回值直接给前端@ExceptionHandler({ServiceException.class,FileUploadException.class})//用于统一处理抛出的异常public JsonResult<Void> handleException(Throwable e){JsonResult<Void> result=new JsonResult<>(e);if (e instanceof UsernameDuplicatedException){result.setState(4000);result.setMessage("用户名已经被占用的异常");}else if (e instanceof UserNotFoundException){result.setState(4001);result.setMessage("用户数据不存在的异常");}else if (e instanceof PasswordNotMatchException){result.setState(4002);result.setMessage("用户密码错误的异常");}else if (e instanceof AddressCountLimitException){result.setState(4003);result.setMessage("用户的收货地址超出上限异常");}else if (e instanceof InsertException){result.setState(5000);result.setMessage("插入数据时产生未知的异常");}else if (e instanceof UpdateException){result.setState(5001);result.setMessage("更新数据时产生未知的异常");}else if (e instanceof FileEmptyException) {result.setState(6000);} else if (e instanceof FileSizeException) {result.setState(6001);} else if (e instanceof FileTypeException) {result.setState(6002);} else if (e instanceof FileStateException) {result.setState(6003);} else if (e instanceof FileUploadIOException) {result.setState(6004);}return result;}/*** 获取session对象的uid* @param session session对象* @return 当前登录得到用户uid的值*/protected final Integer getuidFromSession(HttpSession session){return Integer.valueOf(session.getAttribute("uid").toString());}/*** 获取session对象的username* @param session session对象* @return 当前登录得到用户username的值** 在实现类中重写了父类中的toString()方法,不是句柄信息的输出@xxx*/protected final String getUsernameFromSession(HttpSession session){return session.getAttribute("username").toString();}
}

BaseController–AddressCountLimitException


5.2 设计请求

/address/add_new_address
post
Address address,HttpSession session
JsonResult<Void>

5.3 处理请求

在控制层创建AddressController来处理用户收货地址的请求和响应。

package com.cy.store.controller;import com.cy.store.entity.Address;
import com.cy.store.service.IAddressService;
import com.cy.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RequestMapping("address")
@RestController
public class AddressController extends BaseController{@Autowiredprivate IAddressService addressService;@RequestMapping("add_new_address")public JsonResult<Void> addNewAddress(Address address, HttpSession session) {Integer uid =getuidFromSession(session);String username=getUsernameFromSession(session);addressService.addNewAddress(uid,username,address);return new JsonResult<>(OK);}
}

AddressController–addNewAddress


测试

先登录用户,再进行测试
http://localhost:8080/address/add_new_address?name=tom&phone=17858802222
在这里插入图片描述

6 新增收货地址-前端页面

addAddress.html

		<script type="text/javascript">$("#btn-add-new-address").click(function() {$.ajax({url: "/addresses/add_new_address",type: "POST",data: $("#form-add-new-address").serialize(),dataType: "JSON",success: function(json) {if (json.state == 200) {alert("新增收货地址成功!");location.href = "address.html";} else {alert("新增收货地址失败!" + json.message);}},error: function(xhr) {alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);location.href = "login.html";}});});</script>

addAddress–add_new_address


测试

README–新增收货地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620903.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

epoll() 多路复用 和 两种工作模式

1.epoll API 介绍 typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */ };常见的Epoll检测事件&#xff1a;- EPOLLIN- EPOLLOUT- …

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

如何识别计算机病毒,怎样识别计算机病毒

电脑病毒不仅影响电脑的正常使用&#xff0c;有时候还会威胁到我们的个人信息包括财务信息的安全。下面就让学习啦小编教大家怎样识别计算机病毒吧。 识别计算机病毒的方法 病毒一般通过自我隐藏的方式来达到自己的目的&#xff0c;那么病毒一般都隐藏在系统的什么地方呢?一般…

计算机病毒为了隐藏,识别计算机病毒的方法

识别计算机病毒的方法 病毒为了能随系统启动而自启动对电脑进行危害操作&#xff0c;通常会把自己设置为自动启动。更有甚者&#xff0c;它们还会将自己注册成系统服务&#xff0c;优先于其他程序启动。下面是小编收集整理的识别计算机病毒的方法&#xff0c;欢迎阅读。 识别计…

可以查杀计算机病毒的软件,怎样彻底查杀计算机病毒

电脑中毒后很可能后导致电脑出现无法开机,卡死等各种的情况&#xff0c;那么怎样彻底查杀计算机病毒呢?学习啦小编分享了彻底查杀计算机病毒的方法&#xff0c;希望对大家有所帮助。 彻底查杀计算机病毒方法一 打开腾讯电脑管家&#xff0c;并找到杀毒页面 选择【闪电查杀】等…

检查和清除计算机病毒可以使用,如何深入检查和杀死计算机病毒

当我们的计算机感染病毒时&#xff01;如果我们想深入查杀&#xff0c;该怎么办&#xff1f;以下是学习编辑器深入检查和杀死计算机病毒的方法的详细介绍&#xff01;希望对您有帮助&#xff01; 一种深度检测计算机病毒的方法: 垃圾清除软件建议安装金山卫士&#xff0c;它可以…

2. 两数相加(中等系列)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

如何根据公司名称来筛选快递

在查询快递物流的时候&#xff0c;如果想要对快递公司名称一致的单号进行筛选&#xff0c;该怎么办呢&#xff1f;不知道如何操作的宝贝们&#xff0c;下面请随小编一起来试试。 需要哪些工具&#xff1f; 快递批量查询高手 快递单号若干 怎么快速查询&#xff1f; 首先&…

关于名字

为什么80%的码农都做不了架构师&#xff1f;>>> 书不尽言&#xff0c;言不尽意。言者所以在意&#xff0c;得意而忘言。先从程序里的变量名说起。作为程序员&#xff0c;我们知道&#xff0c;大部分时候&#xff0c;我们要求程序中的变量名是唯一的。比如数据库里的…

2023-2029全球与中国电子级丙二醇甲醚醋酸酯市场现状及未来发展趋

电子级丙二醇甲醚醋酸酯的定义 丙二醇甲醚醋酸酯(PMA)&#xff0c;也称丙二醇单甲醚乙酸酯&#xff0c;是一种无色、有特殊气味的高级溶剂。PMA分子中既有醚键&#xff0c;又有羰基&#xff0c;羰基又形成了酯的结构&#xff0c;同时又有烷基&#xff1b;PMA同一分子中极性与非…

2022-2028年中国低温固化粉末涂料行业市场发展调研及未来前景规划报告

报告类型:产业研究 报告格式:电子版、纸介版、电子+纸介 出品单位:智研咨询-产业信息网 智研咨询发布的《2022-2028年中国低温固化粉末涂料行业市场发展调研及未来前景规划报告》共十四章。首先介绍了低温固化粉末涂料行业市场发展环境、低温固化粉末涂料整体运行态势等,…

2022-2028年中国化工催化剂行业市场全景评估及发展趋势研究报告

报告类型&#xff1a;产业研究 报告格式&#xff1a;电子版、纸介版、电子纸介 出品单位&#xff1a;智研咨询-产业信息网 智研咨询发布的《2022-2028年中国化工催化剂行业市场全景评估及发展趋势研究报告》共十四章。首先介绍了化工催化剂行业市场发展环境、化工催化剂整体运…

2022年全球市场环氧活性稀释剂总体规模、主要生产商、主要地区、产品和应用细分研究报告

本文研究全球市场、主要地区和主要国家环氧活性稀释剂的销量、销售收入等&#xff0c;同时也重点分析全球范围内主要厂商&#xff08;品牌&#xff09;竞争态势&#xff0c;环氧活性稀释剂销量、价格、收入和市场份额等。 针对过去五年&#xff08;2017-2021&#xff09;年的历…

2021年全球强化采油表面活性剂收入大约202.3百万美元,预计2028年达到297.1百万美元

本文研究全球市场、主要地区和主要国家强化采油表面活性剂的销量、销售收入等&#xff0c;同时也重点分析全球范围内主要厂商&#xff08;品牌&#xff09;竞争态势&#xff0c;强化采油表面活性剂销量、价格、收入和市场份额等。 针对过去五年&#xff08;2017-2021&#xff0…

Modbus转Profinet网关连接三菱变频器博图快速配置

本案例将分享如何使用兴达易控的modbus转profinet网关&#xff08;XD-MDPN100&#xff09;来连接西门子1200系列plc&#xff0c;并实现三菱变频器的485通讯兼容转modbusTCP通信。通过在博图中进行配置&#xff0c;我们可以实现设备之间的连接和通信。 首先&#xff0c;我们需要…

[好书推荐] 之 <趣化计算机底层技术>

趣化计算机底层技术 底层技术优势购买 底层技术 相信很多老铁跟我一样, 在深入了解底层技术的时候 — — 就很头大 很多书籍看上去跟一个 老学究 一样, 说的话不是我们这些小白看的懂得… 看不懂就会 打击我们的自信心我们就有可能找一堆理由去玩(理所应当地去玩的那一种, 反…

基于flowplayer的视频缩略图的视频预览

前言 不得不吐槽一下咯&#xff0c;年终奖发了不到半个月的工资&#xff0c;心醉了&#xff0c;心凉了&#xff01;不过技术知识是属于自己的东西&#xff0c;有新的想法&#xff0c;学到新的知识还是的总结出来&#xff0c;和大家分享分享&#xff01; 最近一直在忙公司的项…

php myflow,WordPress安装使用Flowplayer简易指南

本文是简单易懂的现代魔法系列文章的第二弹~ 一、Flowplayer简介FlowPlayer 是一个用Flash开发的在Web上的视频播放器&#xff0c;可以很容易将它集成在任何的网页上。支持HTTP以及流媒体传输。 最新版本为5.1.1&#xff0c;最新版本使用纯 HTML5 CSS3 实现的原生 VIDEO 标签&…

爬虫(bilibili热门课程记录)

什么是爬虫&#xff1f;程序蜘蛛&#xff0c;沿着互联网获取相关信息&#xff0c;收集目标信息。 一、python环境安装 1、先从Download Python | Python.org中下载最新版本的python解释器 2、再从Download PyCharm: Python IDE for Professional Developers by JetBrains中下…

web开源FlowPlayer视频播放器

1.原文地址&#xff1a;http://www.cnblogs.com/babycool/p/3172303.html 2.针对原作者的代码示例修正&#xff01; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …