【SpringBoot + Vue 尚庭公寓实战】基本属性接口实现(七)
文章目录
- 【SpringBoot + Vue 尚庭公寓实战】基本属性接口实现(七)
- 1、保存或更新属性名称
- 2、保存或更新属性值
- 3、查询全部属性名称和属性值列表
- 4、根据ID删除属性名称
- 5、根据ID删除属性值
房间基本属性管理共有五个接口,分别是
1、保存或更新属性名称
2、保存或更新属性值
3、查询全部属性名称和属性值列表
4、根据ID删除属性名称
5、根据ID删除属性值
下面逐一是实现
首先在AttrController
中注入AttrKeyService
和AttrValueService
,如下:
@Tag(name = "房间属性管理")
@RestController
@RequestMapping("/admin/attr")
public class AttrController {@Autowiredprivate AttrKeyService attrKeyService;@Autowiredprivate 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里面不能进行联表查询,所以这边调用业务层方法自己写sqlList<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{@Autowiredprivate AttrKeyMapper attrKeyMapper;/*** 查询全部属性名称和属性值列表** @return*/@Overridepublic 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_idfrom attr_key kleft join attr_value v on k.id = v.attr_key_id and v.is_deleted = 0where k.is_deleted = 0
</select>
4、根据ID删除属性名称
查看接口
从接口信息可以看出来:
- DELETE请求,请求地址为/admin/attr/key/deleteById
- 请求参数为attrKeyId
进行开发
删除属性名称时,需要去删除,对应的属性值,因为作为key不存在了,那么值,也没有存在的意义,所以可以通过``LambdaQueryWrapper`进行条件筛选,删除
在AttrController
中增加如下内容
@Operation(summary = "根据id删除属性名称")@DeleteMapping("key/deleteById")@Transactionalpublic 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();
}