该系列博客主要记录笔者的开发过程,参考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
/**
* 根据用户id查询用户收获地址数据
* @param uid 用户id
* @return 收获地址列表
*/
List<Address> findByUid(Integer uid);
/**
* 根据aid查询用户收获地址数据
* @param aid
* @return
*/
Address findByAid(Integer aid);
/**
* 根据用户id设置所有的地址为非默认
* @param uid
* @return 影响行数
*/
Integer updateNonDefault(Integer uid);
/**
* 根据aid设置当前地址为默认地址
* @param aid
* @return 影响行数
*/
Integer updateDefalultByAid(Integer aid, String modifiedUser, Date modifiedTime);
/**
* 根据aid删除地址数据
* @param aid
* @return 影响行数
*/
Integer deleteByAid(Integer aid);
/**
* 根据用户uid查询当前用户最后一次被修改的收获地址数据
* @param uid
* @return
*/
Address findLastModified(Integer uid);
1.3 SQL映射
store\src\main\resources\mapper\AddressMapper.xml
<select id="findByUid" resultMap="AddressEntityMap">
SELECT * FROM t_address WHERE uid = #{uid}
ORDER BY is_default DESC, created_time DESC
</select>
<select id="findByAid" resultMap="AddressEntityMap">
SELECT * FROM t_address WHERE aid = #{aid}
</select>
<update id="updateNonDefault">
update t_address SET is_default=0 WHERE uid = #{uid}
</update>
<update id="updateDefalultByAid">
update t_address
SET is_default=1, modified_user = #{modifiedUser}, modified_time = #{modifiedTime}
WHERE aid = #{aid}
</update>
<delete id="deleteByAid">
DELETE FROM t_address WHERE aid =#{aid}
</delete>
<select id="findLastModified" resultMap="AddressEntityMap">
SELECT * FROM t_address
WHERE uid=#{uid}
ORDER BY modified_time DESC LIMIT 0,1
</select>
1.4 单元测试
store\src\test\java\com\cy\store\mapper\AddressMapperTests.java
@Test
public void FindeByUid(){
System.out.println(addressMapper.findByUid(29));
}
@Test
public void findByAid(){
System.out.println(addressMapper.findByAid(1));
}
@Test
public void updateNonDefault(){
addressMapper.updateNonDefault(29);
}
@Test
public void updateDefalultByAid(){
addressMapper.updateDefalultByAid(10,"管理员", new Date());
}
@Test
public void deleteByAid(){
addressMapper.deleteByAid(5);
}
@Test
public void findLastModified(){
System.out.println(addressMapper.findLastModified(29));
}
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
/**
* 根据UID查询地址
* @param uid
* @return
*/
List<Address> getByUid(Integer uid);
/**
* 修改某一条地址数据为默认值
* @param uid
* @param aid
* @param username
*/
void setDefault(Integer uid, Integer aid, String username);
/**
* 删除地址数据
* @param aid
* @param uid
* @param username
*/
void delete(Integer aid, Integer uid, String username);
2.3 抽象方法实现
store\src\main\java\com\cy\store\service\impl\AddressServiceImpl.java
@Override
public List<Address> getByUid(Integer uid) {
List<Address> list = addressMapper.findByUid(uid);
for(Address address:list){
address.setUid(null);
address.setProvinceCode(null);
address.setCityCode(null);
address.setAreaCode(null);
address.setCreatedUser(null);
address.setCreatedTime(null);
address.setModifiedUser(null);
address.setModifiedTime(null);
}
return addressMapper.findByUid(uid);
}
@Override
public void setDefault(Integer uid, Integer aid, String username) {
Address result = addressMapper.findByAid(aid);
if(result==null){
throw new AddressNotFountException("收获地址不存在");
}
//当前的地址数据是否归属与当前用户
if(!result.getUid().equals(uid)){
throw new AccessDeniedException("非法访问数据");
}
//更新操作
Integer rows = addressMapper.updateNonDefault(uid);
if(rows<1){
throw new UpdateException("更新时产生位置异常");
}
rows = addressMapper.updateDefalultByAid(aid, username, new Date());
if(rows!=1){
throw new UpdateException("更新时产生位置异常");
}
}
@Override
public void delete(Integer aid, Integer uid, String username) {
Address result = addressMapper.findByAid(aid);
if(result==null){
throw new AddressNotFountException("收获地址不存在");
}
//当前的地址数据是否归属与当前用户
if(!result.getUid().equals(uid)){
throw new AccessDeniedException("非法访问数据");
}
Integer rows = addressMapper.deleteByAid(aid);
if(rows!=1){
throw new UpdateException("删除时产生位置异常");
}
Integer cnt = addressMapper.countByUid(uid);
if(cnt == 0){
return;
}
if(result.getIsDefault()==1){ //将最新的地址数据修改为默认
Address address = addressMapper.findLastModified(uid);
rows = addressMapper.updateDefalultByAid(address.getAid(),username,new Date());
}
if(rows!=1){
throw new UpdateException("更新时产生位置异常");
}
}
2.4 单元测试
store\src\test\java\com\cy\store\service\AddressServiceImplTests.java
@Test
public void findByUid(){
List<Address> list = addressService.getByUid(29);
for(Address add:list){
System.out.println(add);
}
}
@Test
public void setDefault(){
try {
addressService.setDefault(29,10,"小明");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void delete(){
addressService.delete(9,29,"tt");
}
3.控制层
3.0 处理异常
在store\src\main\java\com\cy\store\controller\BaseController.java中统一处理异常
3.1 请求设计
查询地址:
URL:/addresses
请求参数:HttpSession session
请求方式:GET
返回值:JsonResult<List<Address>>
修改地址的默认值(使用restful风格提交数据):
URL:/addresses/{aid}/set_default
请求参数:@PathVariable("aid")Integer aid, HttpSession session
请求方式:GET
返回值:JsonResult<Void>
删除地址:
URL:/addresses/{aid}/delete
请求参数:@PathVariable("aid")Integer aid, HttpSession session
请求方式:POST
返回值:JsonResult<Void>
3.2 处理请求
在store\src\main\java\com\cy\store\controller\AddressController.java中添加如下接口
@RequestMapping({"","/"})
public JsonResult<List<Address>> getByUid(HttpSession session){
Integer uid = getuidFromSession(session);
List<Address> data= addressService.getByUid(uid);
return new JsonResult<>(OK,data);
}
//Restful风格进行请求
@RequestMapping("{aid}/set_default")
public JsonResult<Void> setDefault(@PathVariable("aid")Integer aid, HttpSession session){
addressService.setDefault(getuidFromSession(session),
aid, getusernameFromSession(session));
return new JsonResult<>(OK);
}
@RequestMapping("{aid}/delete")
public JsonResult<Void> delete(@PathVariable("aid")Integer aid, HttpSession session){
addressService.delete(aid,
getuidFromSession(session),
getusernameFromSession(session));
return new JsonResult<>(OK);
}
3.3 测试
使用对应的接口在浏览器中进行测试.
4.前端页面
在store\src\main\resources\static\web\address.html中添加如下代码:
<script type="text/javascript">
$(document).ready(function () {
showAddressList();
});
function showAddressList() {
$("#address-list").empty();
$.ajax({
url: "/addresses",
type: "GET",
dataType: "JSON",
success: function (json) {
let list = json.data;
for (let i = 0; i < list.length; i++) {
console.log(list[i].name);
let address = '<tr>'
+ '<td>#{tag}</td>'
+ '<td>#{name}</td>'
+ '<td>#{province}#{city}#{area}#{address}</td>'
+ '<td>#{phone}</td>'
+ '<td><a class="btn btn-xs btn-info"><span class="fa fa-edit"></span> 修改</a></td>'
+ '<td><a onclick="deleteByAid(#{aid})" class="btn btn-xs add-del btn-info"><span class="fa fa-trash-o"></span> 删除</a></td>'
+ '<td><a onclick="setDefault(#{aid})" class="btn btn-xs add-def btn-default">设为默认</a></td>'
+ '</tr>';
address = address.replace(/#{aid}/g, list[i].aid);
address = address.replace(/#{tag}/g, list[i].tag);
address = address.replace("#{name}", list[i].name);
address = address.replace("#{province}", list[i].provinceName);
address = address.replace("#{city}", list[i].cityName);
address = address.replace("#{area}", list[i].areaName);
address = address.replace("#{address}", list[i].address);
address = address.replace("#{phone}", list[i].phone);
$("#address-list").append(address);
}
$(".add-def:eq(0)").hide();
}
});
}
function setDefault(aid) {
$.ajax({
url: "/addresses/" + aid + "/set_default",
type: "POST",
dataType: "JSON",
success: function(json) {
if (json.state == 200) {
showAddressList();
} else {
alert("设置默认收货地址失败!" + json.message);
}
},
error: function(json) {
alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + json.status);
location.href = "login.html";
}
});
}
function deleteByAid(aid) {
$.ajax({
url: "/addresses/" + aid + "/delete",
type: "POST",
dataType: "JSON",
success: function(json) {
if (json.state == 200) {
showAddressList();
} else {
alert("删除收货地址失败!" + json.message);
}
},
error: function(xhr) {
alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);
location.href = "login.html";
}
});
}
</script>
测试前端功能