【SpringBoot + Vue 尚庭公寓实战】基本属性接口实现(七)
文章目录
房间基本属性管理共有五个接口,分别是
1、保存或更新属性名称
2、保存或更新属性值
3、查询全部属性名称和属性值列表
4、根据ID删除属性名称
5、根据ID删除属性值
下面逐一是实现
首先在AttrController
中注入AttrKeyService
和AttrValueService
,如下:
@Tag(name = "房间属性管理")
@RestController
@RequestMapping("/admin/attr")
public class AttrController {
@Autowired
private AttrKeyService attrKeyService;
@Autowired
private AttrValueService attrValueService;
}
1、保存或更新属性名称
查看接口
从接口信息可以看出来:
-
POST请求,请求地址为/admin/attr/value/saveOrUpdate
-
请求包含id、name、attrKeyId,是AttrValue对象
@Schema(description = "房间基本属性表") @TableName(value = "attr_key") @Data public class AttrKey extends BaseEntity { private static final long serialVersionUID = 1L; @Schema(description = "属性key") @TableField(value = "name") private String name; }
进行代码开发
因为是单表查询,可以直接使用MyBatisPlus提供的方法实现。在AttrController
中增加如下内容:
@Operation(summary = "新增或更新属性值")
@PostMapping("value/saveOrUpdate")
public Result saveOrUpdateAttrValue(@RequestBody AttrValue attrValue) {
attrValueService.saveOrUpdate(attrValue);
return Result.ok();
}
2、保存或更新属性值
查看接口
从接口信息可以看出来:
-
POST请求,请求地址为/admin/attr/key/saveOrUpdate
-
请求包含id、name,是AttrKey对象
@Schema(description = "房间基本属性表") @TableName(value = "attr_key") @Data public class AttrKey extends BaseEntity { private static final long serialVersionUID = 1L; @Schema(description = "属性key") @TableField(value = "name") private String name; }
进行开发
同为单表,直接使用MyBatisPlus即可,在AttrController
中增加如下内容:
@Operation(summary = "新增或更新属性名称")
@PostMapping("key/saveOrUpdate")
public Result saveOrUpdateAttrKey(@RequestBody AttrKey attrKey) {
attrKeyService.saveOrUpdate(attrKey);
return Result.ok();
}
3、查询全部属性名称和属性值列表
查看接口
从接口信息可以看出来:
-
Get请求,请求地址为/admin/attr/list
-
不需要传任何参数,无请求体
-
响应数据为AttrKeyVo对象
//响应数据示例 { "code": 0, "message": "", "data": [ { "id": 0, "name": "", "attrValueList": [ { "id": 0, "name": "", "attrKeyId": 0 } ] } ] }
查看web-admin模块下的
com.atguigu.lease.web.admin.vo.attr.AttrKeyVo
,内容如下:@Data public class AttrKeyVo extends AttrKey { @Schema(description = "属性value列表") private List<AttrValue> attrValueList; }
进行开发
查询全部属性名称和属性值列表,包含了两个表,因为MyBatis-Plus本身不支持连表查询,所以需要采用自己手写sql的方式
1、首先在AttrController
中添加如下内容
@Operation(summary = "查询全部属性名称和属性值列表")
@GetMapping("list")
public Result<List<AttrKeyVo>> listAttrInfo() {
//因为MyBatisPlus里面不能进行联表查询,所以这边调用业务层方法自己写sql
List<AttrKeyVo> attrKeyVos = attrKeyService.listAttrInfo();
return Result.ok(attrKeyVos);
}
2、编写Service层逻辑,在AttrKeyService
创建接口
List<AttrKeyVo> listAttrInfo();
3、编写Service层实现类,在AttrKeyServiceImpl
中调用Mapper层方法
/**
* @author liubo
* @description 针对表【attr_key(房间基本属性表)】的数据库操作Service实现
* @createDate 2023-07-24 15:48:00
*/
@Service
public class AttrKeyServiceImpl extends ServiceImpl<AttrKeyMapper, AttrKey>
implements AttrKeyService{
@Autowired
private AttrKeyMapper attrKeyMapper;
/**
* 查询全部属性名称和属性值列表
*
* @return
*/
@Override
public List<AttrKeyVo> listAttrInfo() {
List<AttrKeyVo> attrKeyVos = attrKeyMapper.listAttrInfo();
return attrKeyVos;
}
}
4、编写Mapper层逻辑
在AttrKeyMapper
中增加如下内容
List<AttrKeyVo> listAttrInfo();
对应的在AttrKeyMapper.xml
编写sql语句,具体思路如下
通过attrKey的id跟attrValue的attr_key_id进行匹配,需要注意的是,再进行关联时,我们需要进行左连接,同时在判断k.id = v.attr_key_id 需要再加上v.is_deleted = 0,where只做判断k.is_deleted = 0,因为用的是逻辑删除,这样避免k值存在,而v值不存在却查询出来,具体代码如下:
<resultMap id="BaseResultMap" type="com.atguigu.lease.web.admin.vo.attr.AttrKeyVo">
<id property="id" column="id"/>
<result property="name" column="key_name"/>
<collection property="attrValueList" ofType="com.atguigu.lease.model.entity.AttrValue">
<id column="value_id" property="id"/>
<result column="value_name" property="name"/>
<result column="key_id" property="attrKeyId"/>
</collection>
</resultMap>
<select id="listAttrInfo" resultMap="BaseResultMap">
select k.id,
k.name key_name,
v.id value_id,
v.name value_name,
v.attr_key_id key_id
from attr_key k
left join attr_value v on k.id = v.attr_key_id and v.is_deleted = 0
where k.is_deleted = 0
</select>
4、根据ID删除属性名称
查看接口
从接口信息可以看出来:
- DELETE请求,请求地址为/admin/attr/key/deleteById
- 请求参数为attrKeyId
进行开发
删除属性名称时,需要去删除,对应的属性值,因为作为key不存在了,那么值,也没有存在的意义,所以可以通过``LambdaQueryWrapper`进行条件筛选,删除
在AttrController
中增加如下内容
@Operation(summary = "根据id删除属性名称")
@DeleteMapping("key/deleteById")
@Transactional
public Result removeAttrKeyById(@RequestParam Long attrKeyId) {
//删除属性名称
attrKeyService.removeById(attrKeyId);
//删除属性值
LambdaQueryWrapper<AttrValue> attrValueLambdaQueryWrapper = new LambdaQueryWrapper<>();
attrValueLambdaQueryWrapper.eq(AttrValue::getAttrKeyId,attrKeyId);
attrValueService.remove(attrValueLambdaQueryWrapper);
return Result.ok();
}
5、根据ID删除属性值
在AttrController
中增加如下内容
@Operation(summary = "根据id删除属性值")
@DeleteMapping("value/deleteById")
public Result removeAttrValueById(@RequestParam Long id) {
attrValueService.removeById(id);
return Result.ok();
}