创建数据库表
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=InnoDB DEFAULT CHARSET=utf8;
2.新增收货地址创建实体类
创建一个类Address类,在类中定义表中的相关字段,采用驼峰命名的方式,最后再去继承父类BaseEntity
3.新增收货地址持久层
1.各功能开发顺序
当前收货地址功能模块:列表的展示,修改,删除,设置默认。新增收货地址:开发的顺序新增收货地址,列表的展示,设置默认收货地址,删除收货地址,修改收货地址。
2.对应的是插入语句:insert into t_address (除了aid外字段列表) values (字段值列表)
一个用户的收货地址规定最多只能有20条数据对应,在插入用户数据之前先做查询操作:select count(*) from t_address where uid=?
3.接口与抽象方法
1.创建一个接口addressMapper,在这个接口中来定义上面两个SQL语句抽象方法的定义
4.配置sql映射
创建一个AddressMapper.xml映射文件,在这个文件中添加抽象方法的sql语句。
<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>
4.新增收货地址业务层
1.规划异常
如果用户是第一次插入用户的收货地址:规则:当用户插入的地址是第一条时,需要将当前地址作为默认的收货地址,如果查询到统计总数为0则将当前地址是is_default值设置为1,查询统计的结果为0不代表异常。
查询到的结果大于20,这时候需要抛出业务控制的异常AddressCountLimitException异常,自行创建这个异常。
2.接口与抽象方法
创建一个IAddressService接口,在接口中定义业务的抽象方法
创建一个AddressServiceImpl实现类,去实现接口中的抽象方法
单元测试
5.新增收货地址控制层
1.处理异常
业务层抛出了收货地址总数超出限制异常,需要在BaseController中进行捕获
2.设计请求
3.处理请求
在控制层创建AddressController来处理用户收货地址的请求和响应。
6.新增收货地址前端页面
7.获取省市区列表
1.获取省市区列表数据库
2.获取省市区列表实体类
创建个District实体类
3.获取省市区列表持久层开发
查询语句,根据父代号进行查询:select * from t_dict_district where parent=? order by code ASC
抽象方法定义。DistrictMapper接口
4.获取省市区列表业务层
创建接口IDistrictService,并定义抽象方法
创建DistrictServiceImpl实现类,实现抽象方法
单元测试
5.获取省市区控制层
设计请求
请求方法
创建一个DistrictController类,在类中编写请求方法
6.获取省市区列表前端页面
注释掉通过js来完成省市区列表加载的js代码
检查前端页面在提交省市区数据时是否有相关name属性和id属性
运行前端看是否还可以正常的保存数据(除了省市区之外)
8.获取省市区的名称
1.获取省市区的名称持久层
规划根据当前code来获取当前省市区的名称,对应就是一条查询语句:select * from t_dis_district where code+?
在DistrictMapper接口定义出来
在DistrictMapper.xml中映射出来
单元测试
2.获取省市区名称业务层
在业务层没有异常需要进行处理
定义对应的业务层接口中的抽象方法
在子类中进行实现
3.获取省市区的名称业务层优化
添加地址层还依赖于IDistrictService层。
在addNewAddress方法中将districtService接口中获取到的省市区数据转移到address对象,这对象包含了所有的用户的收货地址的数据
4.获取省市区前端页面
1.在addAddress.html页面中来编写对应的省市区展示及根据用户的不同选择来限制对应的标签中的内容。
2.编写相关事件代码
9.收货地址列表展示
1.持久层
数据库数据的查询操作:select *from t_address where uid=? order by is_default DESC, created_time DESC
接口和抽象方法:
在xml文件中国添加对应的sql映射
单元测试
2.业务层
不用抛出相关的异常
设计业务层的接口和抽象方法
在实现类中实现此方法的逻辑
3.控制层
请求设计
实现请求方法的编写
先登录再请求
4.前端页面
在address.html页面中编写查询用户收货地址数据的展示
10.设置默认收货地址
1.持久层
1.sql语句规划
检测当前用户想设置为默认收货地址的这条数据是否存在:select * from t_address aid=?
在修改用户的默认收货地址之前,先将所有的收货地址设置为非默认:update t_address set is_default=0 where uid=?
将用户当前选中的这条记录设置为默认收货地址:update t_address set is_default=1 ,modified_user=?,modified_time=? where aid=?
2.接口和抽象方法
在AddressMapper接口中来定义和声明
3.配置sql映射
在AddressMapper.xml中映射
4.单元测试
2.业务层
1.异常规划
在执行更新时产生未知的UpdateException异常。已经创建无需重复创建
访问的数据不是当前登录用户的收货地址数据,非法访问,AccessDeniedException异常
收货地址有可能不存在异常:AddressNotFoundException异常
2.抽象方法
在IAddressService编写抽象方法
3.实现抽象方法
在AddressServiceImpl中实现
4.单元测试
3.业务层
1.处理异常
在BaseController类中进行统一的处理。
2.设计请求
3.完成请求
在AddressController类中编写请求处理方法
打开浏览器再去访问一个请求路径
4.前端页面
1.给设置默认收货地址按钮添加一个onlick属性,指向一个方法的调用,在这个方法中来完成ajax请求的方法
address.html页面点击设置默认按钮来发送ajax请求,完成setDefault()方法的声明和定义。
先登录再测试
11.删除收货地址
1.持久层
1.规划需要执行的sql语句
在删除之前判断该数据是否存在,判断该条地址数据的归属是否是当前用户。不用重复开发
执行删除收货地址的信息:delete from t_address where aid=?
如果用户删除的是默认收货地址,将剩下的地址中的某一条设置为默认的收货地址,规则可以自定义:最新修改的收货地址设置为默认的收货地址(modified_time的字段值)limit (n-1)*n,pageSize :select * from t_address where uid=? order by modified_time DESC limit 0,1
如果用户本身就只有一条收货地址的数据,删除后其他操作就可以不进行了。
2.设计抽象方法
在AddressMapper接口中进行抽象方法设计
3.映射sql语句
在AddressMapper.xml文件中进行映射
4.单元测试
2.业务层
1.规划异常
在执行删除的时候可能会产生未知的删除异常导致数据不能够删除成功,则抛出DeleteException异常,需要定义和创建
2.抽象方法设计
在IAddressService中设计
3.实现抽象方法
4.单元测试
3.控制层
1.需要处理异常deleteException放在basecontroller
2.设计请求
3.编写请求处理方法
4.前端页面
在address.html页面中来添加删除按钮的事件。