【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)

【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)


文章目录

      • 【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)
        • 1、业务介绍
        • 2、逻辑模型介绍
        • 3、接口开发
          • 3.1、保存或更新公寓信息
          • 3.2、根据条件分页查询详细信息
          • 3.3、根据ID获取公寓详细信息
          • 3.4、 根据ID删除公寓信息
          • 3.5、根据ID修改公寓发布状态
          • 3.6、根据区县ID查询公寓信息列表

1、业务介绍

公寓管理共有六个接口,分别是

  1. 保存或更新公寓信息
  2. 根据条件分页查询详细信息
  3. 根据ID获取公寓详情信息
  4. 根据ID删除公寓信息
  5. 根据ID修改公寓发布状态
  6. 根据区县ID查询公寓信息列表

image-20240615225107206

2、逻辑模型介绍

image-20240615225155083

3、接口开发
3.1、保存或更新公寓信息

查看接口

image-20240615230105118

image-20240615230119810

进行开发

查看web-admin模块中的com.atguigu.lease.web.admin.vo.apartment.ApartmentSubmitVo类,内容如下:

@Schema(description = "公寓信息")
@Data
public class ApartmentSubmitVo extends ApartmentInfo {@Schema(description="公寓配套id")private List<Long> facilityInfoIds;@Schema(description="公寓标签id")private List<Long> labelIds;@Schema(description="公寓杂费值id")private List<Long> feeValueIds;@Schema(description="公寓图片id")private List<GraphVo> graphVoList;}

编写Controller层逻辑

@Operation(summary = "保存或更新公寓信息")
@PostMapping("saveOrUpdate")
public Result saveOrUpdate(@RequestBody ApartmentSubmitVo apartmentSubmitVo) {service.saveOrUpdateApartment(apartmentSubmitVo);return Result.ok();
}

编写Service层逻辑

  • ApartmentInfoService中增加如下内容

    void saveOrUpdateApartment(ApartmentSubmitVo apartmentSubmitVo);
    
  • ApartmentInfoServiceImpl中增加如下内容

    /*** @author liubo* @description 针对表【apartment_info(公寓信息表)】的数据库操作Service实现* @createDate 2023-07-24 15:48:00*/
    @Service
    public class ApartmentInfoServiceImpl extends ServiceImpl<ApartmentInfoMapper, ApartmentInfo>implements ApartmentInfoService {@Autowiredprivate GraphInfoService graphInfoService;@Autowiredprivate ApartmentFacilityService apartmentFacilityService;@Autowiredprivate ApartmentLabelService apartmentLabelService;@Autowiredprivate ApartmentFeeValueService apartmentFeeValueService;/*** 保存或更新公寓信息** @param apartmentSubmitVo*/@Override@Transactionalpublic void apartmentSaveOrUpdate(ApartmentSubmitVo apartmentSubmitVo) {//判断是新增方法还是修改方法boolean isUpdate = apartmentSubmitVo.getId() != null;super.saveOrUpdate(apartmentSubmitVo);if (isUpdate){//进行删除,先删除后再添加//删除图片LambdaQueryWrapper<GraphInfo> graphInfoQueryWrapper = new LambdaQueryWrapper<>();graphInfoQueryWrapper.eq(GraphInfo::getItemType, ItemType.APARTMENT);graphInfoQueryWrapper.eq(GraphInfo::getItemId,apartmentSubmitVo.getId());graphInfoService.remove(graphInfoQueryWrapper);//删除配套列表LambdaQueryWrapper<ApartmentFacility> apartmentFacilityQueryWrapper = new LambdaQueryWrapper<>();apartmentFacilityQueryWrapper.eq(ApartmentFacility::getApartmentId,apartmentSubmitVo.getId());apartmentFacilityService.remove(apartmentFacilityQueryWrapper);//删除标签LambdaQueryWrapper<ApartmentLabel> apartmentLabelQueryWrapper = new LambdaQueryWrapper<>();apartmentLabelQueryWrapper.eq(ApartmentLabel::getApartmentId,apartmentSubmitVo.getId());apartmentLabelService.remove(apartmentLabelQueryWrapper);//删除杂费LambdaQueryWrapper<ApartmentFeeValue> apartmentFeeValueQueryWrapper = new LambdaQueryWrapper<>();apartmentFeeValueQueryWrapper.eq(ApartmentFeeValue::getApartmentId,apartmentSubmitVo.getId());apartmentFeeValueService.remove(apartmentFeeValueQueryWrapper);}//插入图片List<GraphVo> graphVoList = apartmentSubmitVo.getGraphVoList();if (!CollectionUtils.isEmpty(graphVoList)){List<GraphInfo> graphInfoList = new ArrayList<>();//循环添加for (GraphVo graphVo : graphVoList) {GraphInfo graphInfo = GraphInfo.builder().name(graphVo.getName()).url(graphVo.getUrl()).itemId(apartmentSubmitVo.getId()).itemType(ItemType.APARTMENT).build();graphInfoList.add(graphInfo);}graphInfoService.saveBatch(graphInfoList);}}
    }
    
3.2、根据条件分页查询详细信息

查看接口

image-20240615230601651

进行开发

查看请求和响应的数据结构

  • 请求数据结构

    • currentsize为分页相关参数,分别表示当前所处页面每个页面的记录数

    • ApartmentQueryVo为公寓的查询条件,详细结构如下:

@Schema(description = "公寓信息")
@Data
public class ApartmentDetailVo extends ApartmentInfo {@Schema(description = "图片列表")private List<GraphVo> graphVoList;@Schema(description = "标签列表")private List<LabelInfo> labelInfoList;@Schema(description = "配套列表")private List<FacilityInfo> facilityInfoList;@Schema(description = "杂费列表")private List<FeeValueVo> feeValueVoList;
}

响应数据结构

单个公寓信息记录可查看com.atguigu.lease.web.admin.vo.apartment.ApartmentItemVo,内容如下:

@Data
@Schema(description = "后台管理系统公寓列表实体")
public class ApartmentItemVo extends ApartmentInfo {@Schema(description = "房间总数")private Long totalRoomCount;@Schema(description = "空闲房间数")private Long freeRoomCount;}

配置Mybatis-Plus分页插件

common模块中的com.atguigu.lease.common.mybatisplus.MybatisPlusConfiguration中增加如下内容:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;
}

接口实现

  • 编写Controller层逻辑

    ApartmentController中增加如下内容:

@Operation(summary = "根据条件分页查询公寓列表")
@GetMapping("pageItem")
public Result<IPage<ApartmentItemVo>> pageItem(@RequestParam long current, @RequestParam long size, ApartmentQueryVo queryVo) {IPage<ApartmentItemVo> page = new Page<>(current, size);IPage<ApartmentItemVo> list = service.pageApartmentItemByQuery(page, queryVo);return Result.ok(list);
}

编写Service层逻辑

  • ApartmentInfoService中增加如下内容
IPage<ApartmentItemVo> pageApartmentItemByQuery(IPage<ApartmentItemVo> page, ApartmentQueryVo queryVo);

ApartmentInfoServiceImpl中增加如下内容

@Autowired
private ApartmentInfoMapper apartmentInfoMapper;/*** 分页查询* @param page* @param queryVo* @return*/
@Override
public IPage<ApartmentItemVo> pageItem(IPage<ApartmentItemVo> page, ApartmentQueryVo queryVo) {return apartmentInfoMapper.pageItem(page,queryVo);
}

编写Mapper层逻辑

ApartmentInfoMapper中增加如下内容

IPage<ApartmentItemVo> pageApartmentItemByQuery(IPage<ApartmentItemVo> page, ApartmentQueryVo queryVo);

ApartmentInfoMapper.xml中增加如下内容

<select id="pageItem" resultType="com.atguigu.lease.web.admin.vo.apartment.ApartmentItemVo">select ai.id,ai.name,ai.introduction,ai.district_id,ai.district_name,ai.city_id,ai.city_name,ai.province_id,ai.province_name,ai.address_detail,ai.latitude,ai.longitude,ai.phone,ai.is_release,ifnull(tc.cnt,0) total_room_count,ifnull(tc.cnt,0) - ifnull(cc.cnt,0) free_room_countfrom (select id,name,introduction,district_id,district_name,city_id,city_name,province_id,province_name,address_detail,latitude,longitude,phone,is_releasefrom apartment_info<where>is_deleted=0<if test="queryVo.provinceId != null">and province_id=#{queryVo.provinceId}</if><if test="queryVo.cityId != null">and city_id=#{queryVo.cityId}</if><if test="queryVo.districtId != null">and district_id=#{queryVo.districtId}</if></where>) aileft join(select apartment_id,count(*) cntfrom room_infowhere is_deleted = 0and is_release = 1group by apartment_id) tcon ai.id = tc.apartment_idleft join(select apartment_id,count(*) cntfrom lease_agreementwhere is_deleted = 0and status in (2, 5)group by apartment_id) ccon ai.id = cc.apartment_id</select>

注意:

默认情况下Knife4j为该接口生成的接口文档如下图所示,其中的queryVo参数不方便调试

可在application.yml文件中增加如下配置,将queryVo做打平处理

image-20240615231518354

springdoc:default-flat-param-object: true

spring.default-flat-param-object参数设置为true后,效果如下。

image-20240615231529102

3.3、根据ID获取公寓详细信息

查看接口

image-20240615232418668

image-20240615232446248

查看响应数据结构

查看web-admin下的com.atguigu.lease.web.admin.vo.apartment.ApartmentDetailVo,内容如下

@Schema(description = "公寓信息")
@Data
public class ApartmentDetailVo extends ApartmentInfo {@Schema(description = "图片列表")private List<GraphVo> graphVoList;@Schema(description = "标签列表")private List<LabelInfo> labelInfoList;@Schema(description = "配套列表")private List<FacilityInfo> facilityInfoList;@Schema(description = "杂费列表")private List<FeeValueVo> feeValueVoList;
}

编写Controller层逻辑

ApartmentController中增加如下内容

@Operation(summary = "根据ID获取公寓详细信息")
@GetMapping("getDetailById")
public Result<ApartmentDetailVo> getDetailById(@RequestParam Long id) {ApartmentDetailVo apartmentDetailVo = apartmentInfoService.getDetailById(id);return Result.ok(apartmentDetailVo);
}

编写Service层逻辑

ApartmentInfoService中增加如下内容

ApartmentDetailVo getApartmentDetailById(Long id);

ApartmentInfoServiceImpl中增加如下内容

@Autowired
private GraphInfoMapper graphInfoMapper;@Autowired
private LabelInfoMapper labelInfoMapper;@Autowired
private FacilityInfoMapper facilityInfoMapper;@Autowired
private FeeValueMapper feeValueMapper;/*** 根据id获取公寓详细信息** @param id* @return*/
@Override
public ApartmentDetailVo getDetailById(Long id) {//1、根据id或获取公寓信息ApartmentInfo apartmentInfo = this.getById(id);if (apartmentInfo == null){return null;}//2、获取图片列表List<GraphVo> graphVoList = graphInfoMapper.getByIdGraphList(id,ItemType.APARTMENT);//3、获取标签列表List<LabelInfo> labelInfoList = labelInfoMapper.selectListByApartmentId(id);//4、查询配套列表List<FacilityInfo> facilityInfoList =  facilityInfoMapper.selectListByApartmentId(id);//5、查询杂费信息列表List<FeeValueVo> feeValueVoList = feeValueMapper.selectListByApartmentId(id);ApartmentDetailVo apartmentDetailVo = new ApartmentDetailVo();//复制属性BeanUtils.copyProperties(apartmentInfo,apartmentDetailVo);//增加属性apartmentDetailVo.setGraphVoList(graphVoList);apartmentDetailVo.setLabelInfoList(labelInfoList);apartmentDetailVo.setFacilityInfoList(facilityInfoList);apartmentDetailVo.setFeeValueVoList(feeValueVoList);return apartmentDetailVo;
}

编写Mapper层逻辑

编写公寓图片查询逻辑,在GraphInfoMapper中增加如下内容

/**
* @author liubo
* @description 针对表【graph_info(图片信息表)】的数据库操作Mapper
* @createDate 2023-07-24 15:48:00
* @Entity com.atguigu.lease.model.GraphInfo
*/
public interface GraphInfoMapper extends BaseMapper<GraphInfo> {@Select("select name,url from graph_info where is_deleted=0 and item_id = #{id} and item_id = #{itemType}")List<GraphVo> getByIdGraphList(Long id,ItemType itemType);
}

编写公寓标签查询逻辑

LabelInfoMapper中增加如下内容

/**
* @author liubo
* @description 针对表【label_info(标签信息表)】的数据库操作Mapper
* @createDate 2023-07-24 15:48:00
* @Entity com.atguigu.lease.model.LabelInfo
*/
public interface LabelInfoMapper extends BaseMapper<LabelInfo> {/*** 获取标签列表* @param id* @return*/@Select("select id, type, name from label_info where label_info.is_deleted = 0 and id in " +"(select apartment_label.label_id from apartment_label where apartment_label.is_deleted = 0 and  apartment_id = #{id})")List<LabelInfo> selectListByApartmentId(Long id);
}

编写公寓配套查询逻辑

FacilityInfoMapper中增加如下内容

/**
* @author liubo
* @description 针对表【facility_info(配套信息表)】的数据库操作Mapper
* @createDate 2023-07-24 15:48:00
* @Entity com.atguigu.lease.model.FacilityInfo
*/
public interface FacilityInfoMapper extends BaseMapper<FacilityInfo> {/*** 根据id查询配套信息* @param id* @return*/@Select("select id,type,name,icon from facility_info where " +"is_deleted=0 and  id in " +"(select facility_id from apartment_facility where is_deleted = 0 and apartment_id = #{id})")List<FacilityInfo> selectListByApartmentId(Long id);
}List<FacilityInfo> selectListByApartmentId(Long id);

编写公寓杂费查询逻辑

FeeValueMapper中增加如下内容

/**
* @author liubo
* @description 针对表【fee_value(杂项费用值表)】的数据库操作Mapper
* @createDate 2023-07-24 15:48:00
* @Entity com.atguigu.lease.model.FeeValue
*/
public interface FeeValueMapper extends BaseMapper<FeeValue> {List<FeeValueVo> selectListByApartmentId(Long id);
}

FeeValueMapper.xml中增加如下内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.lease.web.admin.mapper.FeeValueMapper"><select id="selectListByApartmentId" resultType="com.atguigu.lease.web.admin.vo.fee.FeeValueVo">selectfv.id,fv.name,fv.unit,fv.fee_key_id,fk.name as fee_key_namefrom fee_value fvjoin fee_key fk on fv.fee_key_id = fk.idwhere fv.is_deleted = 0 and fk.is_deleted = 0and fv.id in(select fee_value_id from apartment_fee_value where is_deleted = 0 and apartment_id = #{id})</select>
</mapper>
3.4、 根据ID删除公寓信息

查看接口

image-20240615232524882

编写Controller层逻辑

ApartmentController中增加如下内容

@Operation(summary = "根据id删除公寓信息")
@DeleteMapping("removeById")
public Result removeById(@RequestParam Long id) {apartmentInfoService.removeApartmentById(id);return Result.ok();
}

编写Service层逻辑

ApartmentInfoService中增加如下内容

/*** 根据id删除公寓信息* @param id*/
void removeApartmentById(Long id);

ApartmentInfoServiceImpl中增加如下内容

@Autowired
private RoomInfoMapper roomInfoMapper;/*** 根据id删除公寓信息** @param id*/
@Override
@Transactional
public void removeApartmentById(Long id) {//查询公寓内是否有房间LambdaQueryWrapper<RoomInfo> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(RoomInfo::getApartmentId,id);Long count = roomInfoMapper.selectCount(queryWrapper);if (count > 0){throw new LeaseException(ResultCodeEnum.ADMIN_APARMIN_APARTMENT_DELETE_ERROR);}//删除公寓super.removeById(id);//删除图片LambdaQueryWrapper<GraphInfo> graphInfoQueryWrapper = new LambdaQueryWrapper<>();graphInfoQueryWrapper.eq(GraphInfo::getItemType, ItemType.APARTMENT);graphInfoQueryWrapper.eq(GraphInfo::getItemId,id);graphInfoService.remove(graphInfoQueryWrapper);//删除配套列表LambdaQueryWrapper<ApartmentFacility> apartmentFacilityQueryWrapper = new LambdaQueryWrapper<>();apartmentFacilityQueryWrapper.eq(ApartmentFacility::getApartmentId,id);apartmentFacilityService.remove(apartmentFacilityQueryWrapper);//删除标签LambdaQueryWrapper<ApartmentLabel> apartmentLabelQueryWrapper = new LambdaQueryWrapper<>();apartmentLabelQueryWrapper.eq(ApartmentLabel::getApartmentId,id);apartmentLabelService.remove(apartmentLabelQueryWrapper);//删除杂费LambdaQueryWrapper<ApartmentFeeValue> apartmentFeeValueQueryWrapper = new LambdaQueryWrapper<>();apartmentFeeValueQueryWrapper.eq(ApartmentFeeValue::getApartmentId,id);apartmentFeeValueService.remove(apartmentFeeValueQueryWrapper);}

知识点

由于公寓下会包含房间信息,因此在删除公寓时最好先判断一下该公寓下是否存在房间信息,若存在,则提醒用户先删除房间信息后再删除公寓信息,判断逻辑如下

LambdaQueryWrapper<RoomInfo> roomQueryWrapper = new LambdaQueryWrapper<>();
roomQueryWrapper.eq(RoomInfo::getApartmentId, id);
Long count = roomInfoMapper.selectCount(roomQueryWrapper);
if (count > 0) {//直接为前端返回如下响应:先删除房间信息再删除公寓信息
}

想要直接为前端返回响应,可利用前边配置的全局异常处理功能(此处直接抛出异常,全局异常处理器捕获到异常后,便会直接为前端返回响应结果)。

为灵活设置响应信息,可自定义异常类,如下

common模块创建com.atguigu.lease.common.exception.LeaseException类,内容如下:

@Data
public class LeaseException extends RuntimeException {//异常状态码private Integer code;/*** 通过状态码和错误消息创建异常对象* @param message* @param code*/public LeaseException(String message, Integer code) {super(message);this.code = code;}/*** 根据响应结果枚举对象创建异常对象* @param resultCodeEnum*/public LeaseException(ResultCodeEnum resultCodeEnum) {super(resultCodeEnum.getMessage());this.code = resultCodeEnum.getCode();}@Overridepublic String toString() {return "LeaseException{" +"code=" + code +", message=" + this.getMessage() +'}';}
}

common模块com.atguigu.lease.common.exception.GlobalExceptionHandler类中,增加自定义异常类的处理逻辑

@ExceptionHandler(LeaseException.class)
@ResponseBody
public Result error(LeaseException e){e.printStackTrace();return Result.fail(e.getCode(), e.getMessage());
}

为Result新增一个构造方法,如下

public static <T> Result<T> fail(Integer code, String message) {Result<T> result = build(null);result.setCode(code);result.setMessage(message);return result;
}
3.5、根据ID修改公寓发布状态

查看接口

image-20240615232925369

进行开发

ApartmentController中增加如下内容:

@Operation(summary = "根据id修改公寓发布状态")
@PostMapping("updateReleaseStatusById")
public Result updateReleaseStatusById(@RequestParam Long id, @RequestParam ReleaseStatus status) {LambdaQueryWrapper<ApartmentInfo> apartmentInfoQueryWrapper = new LambdaQueryWrapper<>();apartmentInfoQueryWrapper.eq(ApartmentInfo::getId,id);apartmentInfoQueryWrapper.eq(ApartmentInfo::getIsRelease,status);apartmentInfoService.update(apartmentInfoQueryWrapper);return Result.ok();
}
3.6、根据区县ID查询公寓信息列表

查看接口

image-20240615233103039

进行开发

ApartmentController中增加如下内容:

@Operation(summary = "根据区县id查询公寓信息列表")
@GetMapping("listInfoByDistrictId")
public Result<List<ApartmentInfo>> listInfoByDistrictId(@RequestParam Long id) {LambdaQueryWrapper<ApartmentInfo> apartmentInfoQueryWrapper = new LambdaQueryWrapper<>();apartmentInfoQueryWrapper.eq(ApartmentInfo::getDistrictId,id);List<ApartmentInfo> list = apartmentInfoService.list(apartmentInfoQueryWrapper);return Result.ok(list);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读AI新生:破解人机共存密码笔记02进化

1. 人工智能的标准模型 1.1. 机器优化人类提供的固定目标 1.1.1. 是一条死胡同 1.1.1.1. 当你走进死胡同时&#xff0c;你最好掉头返回&#xff0c;找出走错的地方 1.2. 问题不在于我们可能无法做好构建人工智能系统的工作&…

关于阿里云效流水线自动部署项目教程

1、登录阿里云效:阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 2、点击左侧流水线&#xff1a; 3、在流水线界面&#xff0c;新建流水线 4、我的是php代码&#xff0c;因此选择php模版 5、创建之后添加流程线源&#xff0c;如下图 6、选择相应的源头。比…

【odoo】右上角的提示(通知服务)

概要 在Odoo中&#xff0c;右上角的提示&#xff08;通知服务&#xff09;用于显示系统消息、警告、错误或信息提示。这个功能通过 JavaScript 在前端实现&#xff0c;并且使用 Odoo Web 框架提供的现成功能。 提示类型 信息提示 (Info)&#xff1a;用于显示普通信息。这类提示…

Huggingface-cli 登录最新版(2024)

安装Huggingface-cli pip install -U "huggingface_hub[cli]"设置好git的邮箱和用户名和huggingface的github账号一致 git config --global user.mail xxx git config --global user.name xxx登录 复制token&#xff0c;划红线的地方&#xff0c;在命令行中点击右…

微软OneDrive简介:特点、应用场景、使用方法、注意事项

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

利用Cesium和JS实现地点点聚合功能

引言 在实现基于地图的业务场景时&#xff0c;当地图上需要展示过多的标记点时&#xff0c;大量的分散点会使地图上显得杂乱无章&#xff0c;导致标记点对地图上的其他重要信息造成遮挡和混淆&#xff0c;降低地图整体的可读性。 标记点的聚合就很好的解决了这些痛点的同时&a…

[大模型]XVERSE-MoE-A4.2B Transformers 部署调用

XVERSE-MoE-A4.2B介绍 XVERSE-MoE-A4.2B 是由深圳元象科技自主研发的支持多语言的大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;使用混合专家模型&#xff08;MoE&#xff0c;Mixture-of-experts&#xff09;架构&#xff0c;模型的总参数规模为 258 亿…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说&#xff0c;做了以下事情&#xff1a; ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源&#xff0c;并下载最新的软件包列表。 ③将…

Python 潮流周刊#56:NumPy 2.0 里更快速的字符串函数

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景&#xff1a;帮助所有读者精进 Python 技术&am…

Mysql(一):深入理解Mysql索引底层数据结构与算法

众所众知&#xff0c;MySql的查询效率以及查询方式&#xff0c;基本上和索引息息相关&#xff0c;所以&#xff0c;我们一定要对MySql的索引有一个具体到数据底层上的认知。 这一次也是借着整理的机会&#xff0c;和大家一起重新复习一下MySql的索引底层。 本节也主要有一下的…

【PL理论】(25) C- 语言:表达式求值的推理规则 | 执行语句的推理规则 | 语句执行的推理规则

&#x1f4ad; 写在前面&#xff1a;本章我们将继续更新我们的 "C-" 语言&#xff0c;更新表达式求值的推理规则、执行语句的推理规则以及语句执行的推理规则。 目录 0x00 C- 语言更新&#xff1a;表达式求值的推理规则 0x01 C- 语言更新&#xff1a;执行语句的推…

网页五子棋对战项目测试(selenium+Junit5)

目录 网页五子棋对战项目介绍 网页五子棋对战测试的思维导图​ 网页五子棋对战的UI自动化测试 测试一&#xff1a;测试注册界面 测试二&#xff1a;测试登陆界面 测试三&#xff1a;测试游戏大厅界面 测试四&#xff1a;测试游戏房间界面以及观战房间界面 测试五&#…

软考-架构设计师-综合知识总结(试卷:2009~2022)(下篇)

说明 本文档对2009到2022年试卷的综合知识进行了归纳总结&#xff0c;同时对叶宏主编的《系统架构设计师教程》划分重点。 第十七章&#xff1a;通信系统架构设计 17.2 考题总结 第十八章&#xff1a;安全架构设计 18.1 重要知识点 18.2 考题总结 第十九章&#xff1a;大数据…

传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解

内置数据源 我们回顾一下druid数据源的配置方式 通过type属性指定数据源的类型 导入依赖 starter就使用了spring的自动装配功能 格式二是在引入druid的依赖的基础上 进行的一种配置方式 Tomcat内部也可以进行数据源的配置 轻量级中最快的数据源对象 我们切换德鲁伊连接池 我…

OpenDevin 环境配置及踩坑指南

不惧怕任何环境配置 首先 clone 项目&#xff0c;然后查看开发者文档&#xff1a;https://github.com/OpenDevin/OpenDevin/blob/main/Development.md make setup-config 自定义 LLM 配置 首先这个 devin 写的是支持自定义的 LLM 配置&#xff0c;并且提供了交互式命令供我们…

DzzOffice集成功能最丰富的开源PHP+MySQL办公系统套件

DzzOffice是一套开源办公套件&#xff0c;旨在为企业和团队提供类似“Google企业应用套件”和“微软Office365”的协同办公平台。以下是对DzzOffice的详细介绍&#xff1a; 主要功能和应用&#xff1a; 网盘&#xff1a;支持企业、团队文件的集中管理&#xff0c;提供文件标签…

Python开发示例——使用Python实现炫酷的数据动态图

前言 数据可视化是通过图形、图表、地图等可视元素将数据呈现出来&#xff0c;以便更容易理解、分析和解释。它是将抽象的数据转化为直观形象的过程&#xff0c;有助于发现数据中的模式、趋势和关系。数据可视化对于数据科学、商业分析、决策制定等领域都至关重要。当我们想用…

UniApp+Vue3使用Vant-微信小程序组件

第一步&#xff1a;打开创建好的UniappVue3的项目 第二步&#xff1a;下载Vant-Weapp npm i vant/weapp -S --production 第三步&#xff1a;修改目录名称 wxcomponents 必须是wxcomponents 第四步&#xff1a;将下载好的vant中的dist目录剪切到当前wxcomponents目录下 第五…

牛客网金九银十最新版互联网Java高级工程师面试八股文出炉!面面俱到,太全了

前言 作为一个 Java 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#x…

2024年【陕西省安全员C证】考试及陕西省安全员C证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试参考答案及陕西省安全员C证考试试题解析是安全生产模拟考试一点通题库老师及陕西省安全员C证操作证已考过的学员汇总&#xff0c;相对有效帮助陕西省安全员C证最新解析学员顺利通过考试。 1、【多…