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

news2024/10/5 13:47:08

【尚庭公寓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 {
    
        @Autowired
        private GraphInfoService graphInfoService;
    
        @Autowired
        private ApartmentFacilityService apartmentFacilityService;
    
        @Autowired
        private ApartmentLabelService apartmentLabelService;
    
        @Autowired
        private ApartmentFeeValueService apartmentFeeValueService;
    
        /**
         * 保存或更新公寓信息
         *
         * @param apartmentSubmitVo
         */
        @Override
        @Transactional
        public 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_count
    from (select id,
                 name,
                 introduction,
                 district_id,
                 district_name,
                 city_id,
                 city_name,
                 province_id,
                 province_name,
                 address_detail,
                 latitude,
                 longitude,
                 phone,
                 is_release
          from 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>
          ) ai
             left join
         (select apartment_id,
                 count(*) cnt
          from room_info
          where is_deleted = 0
            and is_release = 1
          group by apartment_id) tc
         on ai.id = tc.apartment_id
             left join
         (select apartment_id,
                 count(*) cnt
          from lease_agreement
          where is_deleted = 0
            and status in (2, 5)
          group by apartment_id) cc
         on 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 mapper
        PUBLIC "-//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">
        select
            fv.id,
            fv.name,
            fv.unit,
            fv.fee_key_id,
            fk.name as fee_key_name
        from fee_value fv
            join fee_key fk on fv.fee_key_id = fk.id
        where fv.is_deleted = 0 and fk.is_deleted = 0
         and 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();
    }

    @Override
    public 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.coloradmin.cn/o/1827249.html

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

相关文章

深度学习(七)——神经网络的卷积操作

卷积操作 一、torch.nn中Convolution Layers函数的介绍 1. 参数介绍 nn.Conv1d: Conv取自Convolution的前四个字母&#xff0c;1d代表的是一个一维操作。 nn.Conv2d: 2d表示是一个二维的操作&#xff0c;比如图像就是一个二维的。 其余参数不常用&#xff0c;见官网文档&am…

分布式事务AP控制方案(下)

分布式事务控制方案 本篇文章给出一种要求高可用性&#xff08;AP思想&#xff09;的分布式事务控制方案 上篇回顾&#xff1a;点我查看 分布式事务控制方案1、前景回顾2、数据库和缓存的操作3、分布式文件系统1&#xff09;页面静态化2&#xff09;远程调用3&#xff09;调用…

adb卸载系统应用

1.进入shell adb shell2.查看所有包 pm list packages3.查找包 如查找vivo相关的包 pm list packages | grep vivo发现包太多了,根本不知道哪个是我们想卸载的应用 于是可以打开某应用,再查看当前运行应用的包名 如下: 4.查找当前前台运行的包名 打开某应用,在亮屏状态输入 …

卫星通讯助力船舶可视化监控:EasyCVR视频汇聚系统新应用

一、背景 随着科技的不断进步和社会治安的日益严峻&#xff0c;视频监控系统已经成为维护公共安全和提升管理效率的重要工具。传统的视频监控主要依赖于有线传输&#xff0c;但受到地域限制、布线成本高等因素的影响&#xff0c;其应用范围和效果受到一定限制。而卫星通讯传输…

学会python——显示进度条(python实例五)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、进度条显示 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

ComfyUI中使用 SD3 模型(附模型下载详细说明)

文章目录 背景安装方式一方式二 测试 背景 StabilityAI近日开源了Stable Diffusion 3 Medium&#xff0c;简称 SD3&#xff0c;该模型拥有着20亿参数。其特点如下&#xff1a; 提升了整体图片的质量、真实感提供了三种文本编码器可组合使用&#xff0c;有助于在性能和效率之间…

《大道平渊》· 拾肆 —— 不要为不属于你负责的事情负责

《平渊》 拾肆 "客观世界如是观照&#xff0c;控制自己&#xff0c;不要介入因果。" 美国开国总统华盛顿说过, 不要干涉欧洲事务。 可是他的后任都不听, 于是纷纷卷入了无穷的麻烦之中。 不要为不属于你负责的事情负责。 别人的行为和你有什么关系&#xff1f; 就…

Stable-Diffusion-WebUI 常用提示词插件

SixGod提示词插件 SixGod提示词插件可以帮助用户快速生成逼真、有创意的图像。其中包含&#xff0c;清空正向提示词”和“清空负向提示词、提示词起手式包含人物、服饰、人物发型等各个维度的提示词、一键清除正面提示词与负面提示词、随机灵感关键词、提示词分类组合随机、动…

<Rust><iced>基于rust使用iced库构建GUI实例:图片的格式转换程序

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本文是专栏第二篇实例&#xff0c;是一个图像格式转换程序&#xff0c;基于rust图像处理库image以及文件处理库rfd。 UI演示&…

Python读取wps中的DISPIMG图片格式

需求&#xff1a; 读出excel的图片内容&#xff0c;这放在微软三件套是很容易的&#xff0c;但是由于wps的固有格式&#xff0c;会出现奇怪的问题&#xff0c;只能读出&#xff1a;类似于 DISPIMG(“ID_2B83F9717AE1XXXX920xxxx644C80DB1”,1) 【该DISPIMG函数只有wps才拥有】 …

阿里新发布的UniAnimate现高效人像动画生成;在ComfyUI中使用Stable 3模型;音频版的gpt2o;将 PDF 文档转换为音频播客

✨ 1: UniAnimate 阿里新发布的UniAnimate通过统一的视频扩散模型&#xff0c;实现高效人像动画生成&#xff0c;支持长视频生成 UniAnimate 是一种专注于一致性人像动画生成的统一视频扩散模型。该模型通过映射参考图像、姿势指导和噪声视频到一个共同特征空间&#xff0c;实…

docker安装nginx并且加上映射

随机启动nginx&#xff0c;方便复制配置文件 docker run -p 80:80 --name nginx -d nginx:1.10将容器内的配置文件拷贝到当前目录 docker container cp nginx:/etc/nginx .别忘了后面的点 修改文件名称&#xff1a; mv nginx conf 把这个 conf 移动到/mydata/nginx 下 终止原…

金融行业运维实践案例

确保金融系统的稳定运行和数据安全&#xff0c;业务对可靠性、安全性和合规性具有超高的要求。保障IT系统持续高效稳定运维&#xff0c;是金融行业运维的核心诉求。 在实践应用中&#xff0c;有以下方面问题需要解决。 1、数据分散。业务发展快速&#xff0c;数量多&#xff…

IDEA创建lib目录,导入jar

IDEA创建lib目录&#xff0c;导入jar lib第一种创建方法&#xff1a; 当发现项目没有lib目录时&#xff0c;File>>>Project Structure 打开Artifacts目录 lib第二种创建方法&#xff1a; 按需选择需要的jar包或者全选即可 lib第三种创建方法&#xff1a;

基于51单片机的电子秤的设计

第一章 功能说明 本设计系统以单片机AT89S52为控制核心,实现电子秤的基本控制功能。在设计系统时,为了更好地采用模块化设计法,分步设计了各个单元功能模块。 系统的硬件部分包括最小系统部分、数据采集部分、人机交互界面和系统电源四大部分。最小系统部分主要包括AT89S52和…

【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)

目录 一、合并升序链表问题二、题目&#xff1a;[21. 合并两个有序链表](https://leetcode.cn/problems/merge-two-sorted-lists/description/)1、掌握dummy节点的技巧 三、题目&#xff1a;[23. 合并 K 个升序链表](https://leetcode.cn/problems/merge-k-sorted-lists/descri…

iOS18新增通话录音和应用锁!附升级教程及内置壁纸

一觉睡醒&#xff0c;iOS18终于是揭开面纱了&#xff0c;而且已经有测试版给开发者使用了。 不过还是建议咱们普通用户不要轻易尝试&#xff0c;而且在升级之前一定要用iMazing做个备份&#xff0c;以免测试系统出现问题&#xff0c;丢失数据。 这次WWDC2024与之前爆料完全一样…

宝藏速成秘籍(7)堆排序法

一、前言 1.1、概念 堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法 。堆是一个近似 完全二叉树 的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父节点。 1.2、排…

在VS Code中快速生成Vue模板的技巧

配置vue.json: { "Print to console": {"prefix": "vue","body": ["<template>"," <div class\"\">\n"," </div>","</template>\n","<scri…

[DDR4] 总目录 学习路线

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 传送门: 总目录 目录 基础篇 1-1 DDR4 发展历史 1-2 DDR4 和 DDR3 差异与优势 1-3 DDR4 内部结构 1-4 DDR4 工作原理 协议篇 2-1 DDR4 引脚 设计篇 实践篇 进阶篇 学习路线&#xff1a; 了解DDR4的基本知识…