新增收货地址
持久层
1.新增 规划sql语句
insert into t_adress(字段列表) values (值列表)
2.一个用户的收货地址规定最多只能由20条数据对应,在插入用户数据之前先做查询操作。收货地址逻辑控制当面的一个异常(如果一个在添加收货地址的时候已经有20个收货地址了)
select count(*) from t_address where uid = #{uid}
3.创建一个新的接口 address 在这个接口中来定义sql语句抽象方法的定义
业务层
1.规划异常
1.如果这个用户是第一次插入用户的收回地址,规则:当用户插入的地址是第一条地址时,需要将当前的地址作为默认的收货地址,如果查询到统计总数为0则将当前的地址的is_default值设置为1.查询统计的结果为0不代表异常
查询的结果大于20了,这时候抛出业务控制的异常AddressCountLimitException 放到service包下,继承ServiceException
2.接口与抽象方法,在定义业务的抽象方法 IAddressService
创建一个实现类 AddressServiceImpl 去实现
3.
public void addNewAddress(Address address, Integer uid, String username)
@Override
public void addNewAddress(Address address, Integer uid, String username) {
Integer integer = addressMapper.countByUid(uid);
if (integer >= maxCount) {
throw new AddressCountLimitException("收货地址超过20条");
}
//uid isDefault
address.setUid(uid);
Integer isDefault = integer == 0 ? 1:0;
address.setIsDefault(isDefault);
//补齐4个日志
address.setCreatedUser(username);
address.setCreatedTime(new Date());
address.setModifiedUser(username);
address.setModifiedTime(new Date());
Integer insert = addressMapper.insert(address);
if (insert != 1) {
throw new InsertException("新增收货地址失败");
}
}
4.测试类
@Test
void addNewAddress(){
Address address = new Address();
address.setName("女朋友2");
address.setPhone("16638992452");
address.setUid(6);
address.setAddress("福建省福州市闽侯县上街镇");
addressService.addNewAddress(address,6,"管理员");
}
控制层
.异常处理 发生AddressCountLimitException异常,在BaseController添加上次异常,进行处理
else if (e instanceof AddressCountLimitException){
result.setState(4001);
result.setMessage("购物车地址超出限制的异常");
}
2.请求设计
/addresses/add_new_address
/post
/Address address HttpSession session
/JsonResult
前端页面
获取省市区列表
持久层:
1.创建sql语句
select * from t_dict_district where parent=? order by code asc
2.抽象方法的定义
DistrictMapper
/**
* 根据父代号查询区域信息
* @param parent
* @return
*/
List<District> findByParent(String parent);
3.测试
@Test
void testFindByParent(){
List<District> byParent = districtMapper.findByParent("210100");
log.info("查询的结果为:{}",byParent);
}
2.业务层
1.准备工作
1.创建一个接口IDistrictService
2.实现类:DistrictServiceImpl
package com.cy.store.service;
import com.cy.store.pojo.District;
import java.util.List;
/**
* 省份列表查询的抽象类 service层
*/
public interface IDistrictService {
/**
* 根据父代号来查询区域的信息(省市区)
* @param parent
* @return
*/
List<District> getByParent(String parent);
}
package com.cy.store.service.impl;
import com.cy.store.mapper.DistrictMapper;
import com.cy.store.pojo.District;
import com.cy.store.service.IDistrictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @PROJECT_NAME: store
* @DESCRIPTION:
* @USER: 28416
* @DATE: 2022/11/5 16:43
*/
@Service
public class DistrictServiceImpl implements IDistrictService {
@Autowired
DistrictMapper districtMapper;
@Override
public List<District> getByParent(String parent) {
List<District> byParent = districtMapper.findByParent(parent);
//在进行网络数据传输时,为了尽量避免无效的数据的传输,可以将无效的数据设置为null,可以节省流量,另一方面提了效率
for (District district : byParent) {
district.setId(null);
district.setParent(null);
}
return byParent;
}
}
请求设计
/districts
/get
String parent
/JsonResult
2.请求处理
创建一个类DistrictController
@RequestMapping({"/",""})
public JsonResult<List<District>> getByParentId(String parent){
List<District> data = departmentService.getByParent(parent);
return new JsonResult<>(OK,data);
}
网页端的书写:
1.注释到js代码相关的数据
2.检查前端页面在提交省市区数据时是否相关name属性和id属性。
3.运行前端看是否还可以正常的保存数据(除了省市区以外)
获取省市区的名称
持久层
1.规划sql语句根据当前code来获取当前省市区的名称,对应的就是一条查询语句
select * from t_dist_district where code = ?
2.在接口中定义出来 findNameByCode
2.业务层
1.定异常
2.接口和抽象方法
/**
* 查询省市区的名称
* @param code
* @return
*/
@Override
public String getNameByCode(String code) {
return districtMapper.findNameByCode(code);
}
}
3.测试可以省略(超过8行都要进行独立的测试)
控制层
1.异常解决(无异常)
2.请求规划 -业务层优化,
/districts/get_name
/get
/String code
/JsonResult
1.在添加地址层依赖于IDistrictService 层
2.在addNewAddress方法中将districtService接口中获取到完整的数据设置到address 则 会返回一个完整的address
//优化代码 将address的数据进行补全 在AddressServiceImpl中进行修改
String provinceName = districtService.getNameByCode(address.getProvinceCode());
String cityName= districtService.getNameByCode(address.getCityCode());
String areaName= districtService.getNameByCode(address.getAreaCode());
address.setProvinceName(provinceName);
address.setCityName(cityName);
address.setAreaName(areaName);
获取省市区-前端页面的
1.addAddress.html页面中来编写对应的省市区展示以及根据用户的不同选择来展示不同的内容
2.编写相关事件代码
gitee连接:https://gitee.com/lmr0226/stores