分析
规格和规格选项分为两个表存储,向后台传递的json形式如下:
a、b分别是对应数据表的两个实体类
a、b为key,a所对应的value是一个json对象(a类型),b所对应的value值是一个json数组(多个b类型的对象列表)
为了能接收上述形式的json,我们需要定义一个包含a、b两个实体类的pojo
public class Specification implements Serializable {
private TbSpecification specification;
private List<TbSpecificationOption> specificationOption;
public Specification() {
}
public Specification(TbSpecification specification, List<TbSpecificationOption> specificationOption) {
this.specification = specification;
this.specificationOption = specificationOption;
}
public TbSpecification getSpecification() {
return specification;
}
public void setSpecification(TbSpecification specification) {
this.specification = specification;
}
public List<TbSpecificationOption> getSpecificationOption() {
return specificationOption;
}
public void setSpecificationOption(List<TbSpecificationOption> specificationOption) {
this.specificationOption = specificationOption;
}
}
后端代码
controller层
@RequestMapping("/add")
public Result add(@RequestBody Specification specification){
try {
specificationService.add(specification);
return new Result(true, "增加成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "增加失败");
}
}
service层
public void add(Specification specification) {
//插入规格
specificationMapper.insert(specification.getSpecification());
//插入规格选项
for(TbSpecificationOption specificationOption :specification.getSpecificationOption()){
//设置规格id(必须先设置id的回显)
specificationOption.setSpecId(specification.getSpecification().getId());
//插入到数据库
specificationOptionMapper.insert(specificationOption);
}
}
设置id的回显(id是自增的,在执行插入后不用重新获取实体达到id的回显)
需要在mapper层设置 useGeneratedKeys=“true” keyProperty=“id” keyColumn=“id”
<insert id="insert" parameterType="com.weilinyang.pojo.TbSpecification" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into tb_specification (id, spec_name)
values (#{id,jdbcType=BIGINT}, #{specName,jdbcType=VARCHAR})
</insert>
前端页面
1、绑定规格名称
<td><input class="form-control" placeholder="规格名称" ng-model="entity.specification.specName"> </td>
2、添加规格选项,规格选项初始不显示 当点击增加的时候添加一条,给新建按钮绑定model,初始化一个存放b对象的数组,初始为空。
<button type="button" class="btn btn-default" title="新建" data-toggle="modal" data-target="#editModal" ng-click="entity={specificationOption:[]}"><i class="fa fa-file-o"></i> 新建</button>
3、当我们遍历这个数组的时候,开始为空,新建一个条目就给数组添加一个空值
<button type="button" class="btn btn-default" title="新建" ng-click="addRow()"><i class="fa fa-file-o"></i> 新增规格选项</button>
$scope.addRow = function () {
//给数组加个空元素
$scope.entity.specificationOption.push({});
};
4、删除条目
<button type="button" class="btn btn-default" title="删除" ng-click="deleteRow($index)"><i class="fa fa-trash-o"></i> 删除</button>
$scope.deleteRow = function (idx) {//索引
$scope.entity.specificationOption.splice(idx,1);
}
商品规格的修改
注意:商品规格的规格选项修改,每次修改都是添加、删除规格选项列表的操作而不是对原有规格选项进行修改的操作。
所以在后端我们要对数据库中的规格选项删除,然后再用“修改”的规格选项进行添加
public void update(Specification specification){
specificationMapper.updateByPrimaryKey(specification.getSpecification());
//先删除原来的规格选项,再加入新的规格选项
TbSpecificationOptionExample example = new TbSpecificationOptionExample();
TbSpecificationOptionExample.Criteria criteria = example.createCriteria();
criteria.andSpecIdEqualTo(specification.getSpecification().getId());
specificationOptionMapper.deleteByExample(example);
//插入新的规格选项
for (TbSpecificationOption specificationOption : specification.getSpecificationOption()) {
specificationOption.setSpecId(specification.getSpecification().getId());
specificationOptionMapper.insert(specificationOption);
}
}