Upload 上传(图片/文件),回显(图片),下载(文件)

news2024/11/16 20:29:53

1.前端技术:V3 +  Ant Design Vue

2.后端技术:Java

图片上传/回显:

文件上传回显:

表结构:单文件/图片上传为A表对文件C表 (A表field字段 对应 C表id字段)

如图:A表中的 vehicle_driving_license  和 driver_license 存的是C表中的id字段

表结构:多文件/图片上传为A表对文件B表 中的Biz字段,B表中的file_id字段对应C表中的id字段,(B表的 Biz 字段和 file_id 字段是一对多的存在关系)

如图:A表中的 house_type_file_id 和 house_type_balcony_close_file_id 、house_type_balcony_bisect_file_id、house_type_shearwall_file_id 存的是B表中的Biz_id字段,B表中的 field_id 字段对应 C表中的 id 字段,(B表中的Biz_id字段 与 field_id 字段是一对多的关系)

上传:(上传功能不分单个多个)java后台代码(controller):

  @OperationLog
    @ApiOperation("上传文件")
    @PostMapping("/upload")
    public ApiResult<FileInfo> upload(@RequestParam MultipartFile file, HttpServletRequest request) {
        FileInfo result = null;
        try {
            String dir = getUploadDir();
            File upload = FileServerUtil.upload(file, dir, config.getUploadUuidName());
            String path = upload.getAbsolutePath().replace("\\", "/").substring(dir.length() - 1);
            String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/upload");
            requestURL = "/api/file-info/file/";
            String requestURL2 = "/api/file-info";
            /*if(requestURL.contains("10.1.140.88")){
                requestURL = "https://10.1.140.88/api/file";
            }
            if(requestURL.contains("djshemei.com")){
                requestURL = "https://10.1.140.88/api/file";
            }*/
            String originalName = file.getOriginalFilename();
            result = new FileInfo();
            result.setId(SnowFlakeGenerator.nextId());
            String contentType = FileServerUtil.getContentType(upload);
            result.setFileType(contentType);
            result.setFileName(StrUtil.isBlank(originalName) ? upload.getName() : originalName);
            result.setFilePath(path);
            result.setUrlPath(requestURL+result.getId());
            result.setUrl(requestURL2 + "/" + path);
            //这个用户应该是这个找登录用户
            User loginUser = getLoginUser();
            result.setCreUserId(Long.valueOf(loginUser.getUserId()));
            result.setCreUserName(loginUser.getUsername());
            result.setCreateTime(LocalDateTime.now());
            fileInfoService.save(result);
            return success(result);
        } catch (Exception e) {
            e.printStackTrace();
            return fail("上传失败", result).setError(e.toString());
        }
    }

前端:api代码:

/**
 * 上传文件
 */
export async function uploadFile(file, opt) {
  const formData = new FormData();
  formData.append('file', file);
  const res = await request.post('/community/file-info/upload', formData, opt);
  if (res.data.code === 0 && res.data.data) {
    return res.data.data;
  }
  return Promise.reject(new Error(res.data.message));
}

在页面引入使用

 <a-row>
        <a-col :span="12">
          <a-form-item label="行驶证">
            <ele-image-upload
              class="imagestype"
              :limit="1"
              v-model:value="form1.vehicleDrivingLicenseField"
              @upload="onUpload1"
              @remove="onRemove1"
            />
          </a-form-item>
        </a-col>
        <a-col :span="12">
          <a-form-item label="驾驶证">
            <ele-image-upload
              class="imagestype"
              :limit="1"
              v-model:value="form1.driverLicenseField"
              @upload="onUpload2"
              @remove="onRemove2"
            />
          </a-form-item>
        </a-col>
      </a-row>

使用方法:

  const onUpload1 = ({ file }) => {
    uploadFile(file)
      .then((data) => {
        console.log(data, 'data');
        form1.vehicleDrivingLicenseFieldId1 = data.id;
      })

      .catch((e) => {
        item.status = 'exception';
        message.error(e.message);
      });
  };

数据结构:

  // 图片
  const form1 = reactive({
    vehicleDrivingLicenseField: [],
    vehicleDrivingLicenseFieldId1: '',
    driverLicenseField: [],
    driverLicenseFieldId2: ''
  });

图片回显:java代码 (controller)

 @ApiOperation("查询文件")
    @GetMapping("/queryFile/{id}")
    public ApiResult<?> getFileInfoByRoomCar (@PathVariable("id") Long id, HttpServletRequest request ) {
        List<RoomCar>  roomCarServiceList = roomCarService.list(new QueryWrapper<RoomCar>().eq("car_id", id));
        if(roomCarServiceList.size() == 0){
            return success(new ArrayList<>());
        }else{
            List<FileInfo> fileIdList = fileInfoService.list(new QueryWrapper<FileInfo>().in("id",  roomCarServiceList.stream().map(RoomCar::getVehicleDrivingLicense).collect(Collectors.toList())));

            if (fileIdList.size() > 0) {
                String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/room-car/queryFile/"+id);
                for (FileInfo record : fileIdList) {
                    if (StrUtil.isNotBlank(record.getFilePath())) {
                        record.setDownloadUrl(requestURL + "/file-info/" + record.getFilePath());
                        record.setUrl(requestURL + "/file-info/" + record.getFilePath());
                    }
                }
            }
            List<FileInfo> fileIdList1 = fileInfoService.list(new QueryWrapper<FileInfo>().in("id",  roomCarServiceList.stream().map(RoomCar::getDriverLicense).collect(Collectors.toList())));

            if (fileIdList1.size() > 0) {
                String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/room-car/queryFile/"+id);
                for (FileInfo record : fileIdList1) {
                    if (StrUtil.isNotBlank(record.getFilePath())) {
                        record.setDownloadUrl(requestURL + "/file-info/" + record.getFilePath());
                        record.setUrl(requestURL + "/file-info/" + record.getFilePath());
                    }
                }
            }
            HashMap<String, List<FileInfo>> data = new HashMap<>();
            data.put("vehicleDrivingLicenseField", fileIdList);
            data.put("driverLicenseField", fileIdList1);
            return success(data);
        }
    }

前端api:

export async function  queryItem(id) {
  const res = await request.get('/community/decoration-manage/queryFile/' + id);
  if (res.data.code === 0) {
    return res.data;
  }
  return Promise.reject(new Error(res.data.message));
}

页面引入使用:

 watch(
    () => props.visible,
    (visible) => {
      if (visible) {
        if (props.data) {
          assignObject(form, {
            ...props.data
          });
          isUpdate.value = true;
          showFile.value = true;
          changeRoomType(props.data.roomTypeId);
          // driverLicense
          // vehicleDrivingLicense
          queryItem(props.data.carId)
            .then((res) => {
              form1.vehicleDrivingLicenseField =
                res.data.vehicleDrivingLicenseField;
              form1.driverLicenseField = res.data.driverLicenseField;
            })
            .catch((e) => {
              message.error(e.message);
            });
          loadingData();
        } else {
          showFile.value = false;
          isUpdate.value = false;
          loadingData();
        }
      } else {
        form1.vehicleDrivingLicenseField = [];
        form1.driverLicenseField = [];
        resetFields();
      }
    }
  );

 多文件上传跟单文件上传一样的,不一样的是显示的方式:

多文件回显后端 Java代码(controller):

 @ApiOperation("查询文件")
    @GetMapping("/queryFile/{id}")
    public ApiResult<?> getFileInfoByRegionalHouseTypeId(@PathVariable("id") Long id, HttpServletRequest request ) {
        BaseRegionalHouseType mainRec = baseRegionalHouseTypeService.getByIdRel(id);
        List<FileInfo> house_type_file = new ArrayList<>();
        List<FileInfo> house_type_balcony_close_file = new ArrayList<>();
        List<FileInfo> house_type_balcony_bisect_file = new ArrayList<>();
        List<FileInfo> house_type_shearwall_file = new ArrayList<>();
        Long bizId;
        bizId = mainRec.getHouseTypeFileId();
        if (bizId != null) {
            house_type_file = fileInfoService.getfileinfobybiz(bizId);
            String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/base-regional-house-type/queryFile/"+id);
            for (FileInfo record : house_type_file) {
                if (StrUtil.isNotBlank(record.getFilePath())) {
                    record.setDownloadUrl(requestURL + "/file-info/download/" + record.getFilePath());
                }
            }
        }
        bizId = mainRec.getHouseTypeBalconyCloseFileId();
        if (bizId != null) {
            house_type_balcony_close_file = fileInfoService.getfileinfobybiz(bizId);
            String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/base-regional-house-type/queryFile/"+id);
            for (FileInfo record : house_type_balcony_close_file) {
                if (StrUtil.isNotBlank(record.getFilePath())) {
                    record.setDownloadUrl(requestURL + "/file-info/download/" + record.getFilePath());

                }
            }
        }
        bizId = mainRec.getHouseTypeBalconyBisectFileId();
        if (bizId != null) {
            house_type_balcony_bisect_file = fileInfoService.getfileinfobybiz(bizId);
            String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/base-regional-house-type/queryFile/"+id);
            for (FileInfo record : house_type_balcony_bisect_file) {
                if (StrUtil.isNotBlank(record.getFilePath())) {
                    record.setDownloadUrl(requestURL + "/file-info/download/" + record.getFilePath());

                }
            }
        }
        bizId = mainRec.getHouseTypeShearwallFileId();
        if (bizId != null) {
            house_type_shearwall_file = fileInfoService.getfileinfobybiz(bizId);
            String requestURL = StrUtil.removeSuffix(request.getRequestURL(), "/base-regional-house-type/queryFile/"+id);
            for (FileInfo record : house_type_shearwall_file) {
                if (StrUtil.isNotBlank(record.getFilePath())) {
                    record.setDownloadUrl(requestURL + "/file-info/download/" + record.getFilePath());

                }
            }
        }

        HashMap<String, List<FileInfo>> data = new HashMap<>();
        data.put("house_type_file", house_type_file);
        data.put("house_type_balcony_close_file", house_type_balcony_close_file);
        data.put("house_type_balcony_bisect_file", house_type_balcony_bisect_file);
        data.put("house_type_shearwall_file", house_type_shearwall_file);
        return success(data);
    }

前端api:

export async function  queryHouse(id) {
  const res = await request.get('/community/base-regional-house-type/queryFile/' + id);
  if (res.data.code === 0) {
    return res.data;
  }
  return Promise.reject(new Error(res.data.message));
}

页面使用:

<template>
  <ele-modal
    :width="1200"
    :visible="visible"
    :confirm-loading="loading"
    title="文件管理"
    :body-style="{ paddingBottom: '8px' }"
    @update:visible="updateVisible"
    @ok="save"
  >
    <div class="ele-body">
      <a-card :bordered="false">
        <div class="content">
          <div class="loudong">
            <div>
              <div
                style="font-size: 18px; font-weight: 600; margin-bottom: 25px"
                >文件上传</div
              >
              <a-row type="flex" style="margin: 20px -15px">
                <a-col :span="24">
                  <a-button
                    type="text"
                    @click="typeclick(0)"
                    :class="btn == 0 ? 'btnColor' : ''"
                    style="width: 150px"
                    >户型图</a-button
                  >
                </a-col>
              </a-row>
              <a-row type="flex" style="margin: 20px -15px">
                <a-col :span="24">
                  <a-button
                    type="text"
                    @click="typeclick(1)"
                    :class="btn == 1 ? 'btnColor' : ''"
                    style="width: 150px"
                    >封闭阳台方案</a-button
                  >
                </a-col>
              </a-row>
              <a-row type="flex" style="margin: 20px -15px">
                <a-col :span="24">
                  <a-button
                    type="text"
                    @click="typeclick(2)"
                    :class="btn == 2 ? 'btnColor' : ''"
                    style="width: 150px"
                    >封闭阳台剖面图</a-button
                  >
                </a-col>
              </a-row>
              <a-row type="flex" style="margin: 20px -15px">
                <a-col :span="24">
                  <a-button
                    type="text"
                    @click="typeclick(3)"
                    :class="btn == 3 ? 'btnColor' : ''"
                    style="width: 150px"
                    >剪力墙标识图</a-button
                  >
                </a-col>
              </a-row>
            </div>
          </div>
          <div class="content-right">
            <div class="ele-body" style="margin-top: -40px">
              <div class="content">
                <div class="content-right">
                  <div class="content-right-header" style="margin-top: 30px">
                    <a-upload
                      :show-upload-list="false"
                      :customRequest="onUploadCardf"
                    >
                      <a-button type="primary" class="ele-btn-icon">
                        <template #icon>
                          <upload-outlined />
                        </template>
                        <span>上传</span>
                      </a-button>
                    </a-upload>
                  </div>
                  <!-- 表格 -->
                  <ele-pro-table
                    bordered
                    ref="tableRef"
                    row-key="id"
                    :columns="columns"
                    :datasource="datasource"
                    :toolkit="false"
                    :scroll="{ x: 800 }"
                  >
                    <template #bodyCell="{ column, record, index }">
                      <template v-if="column.key === 'action'">
                        <a-space>
                          <a
                            :href="record.downloadUrl"
                            target="_blank"
                            :disabled="
                              record.downloadUrl != null ? disabled : true
                            "
                            >下载</a
                          >
                          <a-divider type="vertical" />
                          <a-popconfirm
                            placement="topRight"
                            title="确定要删除此文件吗?"
                            @confirm="remove(record, index)"
                          >
                            <a class="ele-text-danger">删除</a>
                          </a-popconfirm>
                        </a-space>
                      </template>
                    </template>
                  </ele-pro-table>
                </div>
              </div>
            </div>
          </div>
        </div>
      </a-card>

      <!-- <spbuilding-edit
        v-model:visible="showEdit"
        :data="current"
        @done="reload"
      />
      <bar-code :data="barcodedata" v-model:visible="showBarcode" /> -->
    </div>
  </ele-modal>
</template>
<script setup>
  import { ref, watch, onMounted } from 'vue';
  import {
    getfileinfobybiz,
    uploadFile,
    removeFile
  } from '@/api/system/file-info';
  import useFormData from '@/utils/use-form-data';
  import { Form, message } from 'ant-design-vue/es';
  import { messageLoading } from 'ele-admin-pro/es';
  import {
    saveHouse,
    queryHouse
  } from '@/api/baseRegionalPark/base-regional-house-type';
  import { CloudUploadOutlined, FileTextOutlined } from '@ant-design/icons-vue';

  // import FileUpload from './file-upload.vue';
  const emit = defineEmits(['done', 'update:visible']);
  const useForm = Form.useForm;

  const props = defineProps({
    data: Object,
    visible: Boolean
  });

  // 表单
  const { form, resetFields, assignFields } = useFormData({
    regionalHouseTypeId: '',
    // 户型图id
    houseTypeFileId: '',
    // 封闭阳台方案id
    houseTypeBalconyCloseFileId: '',
    // 封闭阳台剖面图id
    houseTypeBalconyBisectFileId: '',
    // 剪力墙标识图id
    houseTypeShearwallFileId: '',
    house_type_file: [],
    house_type_balcony_close_file: [],
    house_type_balcony_bisect_file: [],
    house_type_shearwall_file: []
  });

  // 按钮颜色
  const btn = ref(0);
  // 确定数据
  const datas = ref({
    regionalHouseTypeId: '',
    house_type_file: [],
    house_type_balcony_close_file: [],
    house_type_balcony_bisect_file: [],
    house_type_shearwall_file: [],
    downloadUrl:"",
    // 户型图id
    houseTypeFileId: '',
    // 封闭阳台方案id
    houseTypeBalconyCloseFileId: '',
    // 封闭阳台剖面图id
    houseTypeBalconyBisectFileId: '',
    // 剪力墙标识图id
    houseTypeShearwallFileId: '',

  });

  const typeclick = (type) => {
    switch (type) {
      case 0:
        btn.value = 0;
        datasource.value = datas.value.house_type_file;        
        break;
      case 1:
        btn.value = 1;
        datasource.value = datas.value.house_type_balcony_close_file; 
        break;
      case 2:
        btn.value = 2;
        datasource.value = datas.value.house_type_balcony_bisect_file; 
        break;
      case 3:
        btn.value = 3;
        datasource.value = datas.value.house_type_shearwall_file; 
        break;
    }    
  };

 

  const findPicIds = ref([]);
  // 表格实例
  const tableRef = ref(null);

  // 导入请求状态
  const loading = ref(false);
  const isAdmin = ref(false);
  // 保存按钮
  const save = () => {
    saveHouse(datas.value).then((res) => {
      if (res.code == 0) {
        message.success('保存成功');
        emit('done');
        emit('update:visible', false);
      } else {
        message.error(res.msg);
      }
    });
  };


  // 表格列配置
  const columns = ref([
    {
      title: '序号',
      key: 'index',
      width: 48,
      align: 'center',
      fixed: 'left',
      hideInSetting: true,
      customRender: ({ index }) => index + (tableRef.value?.tableIndex ?? 0)
    },
    {
      title: '文件名',
      dataIndex: 'fileName'
    },
    {
      title: '文件类型',
      dataIndex: 'fileType'
    },
    {
      title: '创建人',
      dataIndex: 'creUserName'
    },
    {
      title: '创建时间',
      dataIndex: 'createTime'
    },
    {
      title: '操作',
      key: 'action',
      width: 160,
      align: 'center',
      hideInSetting: true
    }
  ]);

  //上传文件
  const onUploadCardf = (d) => {
    uploadFile(d.file, {
      onUploadProgress: (e) => {
        if (e.lengthComputable) {
          d.progress = (e.loaded / e.total) * 100;
        }
      }
    })
      .then((data) => {
        d.status = 'done';
  
        if (btn.value == 0) {        
          datas.value.house_type_file.push(data);
        } else if (btn.value == 1) {
          datas.value.house_type_balcony_close_file.push(data);
        } else if (btn.value == 2) {
          datas.value.house_type_balcony_bisect_file.push(data);
        } else if (btn.value == 3) {
          datas.value.house_type_shearwall_file.push(data);
        }
     
        message.success('上传成功');
      })
      .catch((e) => {
        message.error(e.message);
      });
  };

  //     /* 删除单个 */
  const remove = (row, index) => {
    const hide = message.loading('请求中..', 0);
    removeFile(row.id)
      .then((msg) => {
        var arr = [];
        if(btn.value ==0 ){
          arr = datas.value.house_type_file.filter((d) => d.id != row.id);
          datas.value.house_type_file = arr;
        }
        if(btn.value ==1 ){
          arr = datas.value.house_type_balcony_close_file.filter((d) => d.id != row.id);
          datas.value.house_type_balcony_close_file = arr;
        }
        if(btn.value ==2 ){
          arr = datas.value.house_type_balcony_bisect_file.filter((d) => d.id != row.id);
          datas.value.house_type_balcony_bisect_file = arr;
        }
        if(btn.value ==3 ){
          arr = datas.value.house_type_shearwall_file.filter((d) => d.id != row.id);
          datas.value.house_type_shearwall_file = arr;
        }
        typeclick(btn.value);
   
        hide();
        message.success(msg);
 
      })
      .catch((e) => {
        hide();
        message.error(e.message);
      });
  };

  //   // 表格数据源
  const datasource = ref([]);

   /* 更新visible */
   const updateVisible = (value) => {
    emit('update:visible', value);
  };


  watch(
    () => props.visible,
    (visible) => {
      if (visible) {
        if (!props.data) {
          alert('数据为空,请确保传递正确数据');
          return;
        }
        console.log(props.data);
        datas.value.regionalHouseTypeId = props.data.regionalHouseTypeId;   

        queryHouse(datas.value.regionalHouseTypeId).then((res) => {
          datas.value.house_type_file = res.data.house_type_file;
          datas.value.house_type_balcony_close_file = res.data.house_type_balcony_close_file;
          datas.value.house_type_balcony_bisect_file = res.data.house_type_balcony_bisect_file;
          datas.value.house_type_shearwall_file = res.data.house_type_shearwall_file;
          // 默认选中第一个
          typeclick(0);
        });        
      }
    }
  );
</script>
<style lang="less" scoped>
  // .ele-body {
  //   height: 100%;
  // }
  .btnColor {
    background-color: #f4fbf8;
    color: #1677ff;
  }

  .content {
    display: flex;


    .loudong {
      width: 280px;
      margin-right: 15px;
      padding: 15px;
      // height: 80vh;
      background: #fff;
      overflow: auto;
      box-sizing: border-box;
    }

    .search {
      width: 100%;
      padding: 20px 10px 0px 20px;
      background: #f6f5f5;
      margin-bottom: 5px;
    }

    .content-right {
      flex: 1;
    }
  }
</style>

还有一个小细节,java存储文件id的字段一定不要忽略修改的时候传来的null

 

用注解:

@TableField(updateStrategy = FieldStrategy.IGNORED)

就ok啦,暂时先做个笔记,后面有空再慢慢写注解

 

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

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

相关文章

leetcode代码记录和对比(两数相加

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;3. 别人的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个…

世界排名第二的大语言模型,你听说过吗?

前言&#xff1a; 在介绍这个大语言模型之前&#xff0c;我们需要先来回顾一个事情&#xff0c;大家应该都知道&#xff0c;在去年 11 月&#xff0c;OpenAI 经历了 CEO Altman 被解雇&#xff08;后又重返&#xff09;的风波。而微软作为OpenAI的最大股东&#xff0c;直至Alt…

【DAY10 软考中级备考笔记】数据结构 图

数据结构 图 3月11日 – 天气&#xff1a;晴 晚上无线网络突然不能用了&#xff0c;花费好久弄这个&#xff0c;耽误了一些时间 1. 图的定义 这里需要注意完全图的定义&#xff0c;以及完全图的边数 这里需要注意连通图和连通分量的概念。 2. 图的存储结构 图有两种存储结构&a…

PortSwigger 基于dom的漏洞-利用 DOM 破坏来启用 XSS

进入实验随意进入一篇博客 我们可以尝试随意提交一些恶意代码看看会发生什么 很显然我们提交成功了但是我们的恶意代码貌似被过滤了 查看源码发现这里有一个过滤框架 我们打开源码分析 function loadComments(postCommentPath) {let xhr new XMLHttpRequest();xhr.onreadys…

植物病害识别:YOLO水稻病害识别/分类数据集(2000多张,2个类别,yolo标注)

YOLO水稻病害识别/分类数据集&#xff0c;包含疾病和正常2类&#xff0c;共2000多张图像&#xff0c;yolo标注完整&#xff0c;可直接训练。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或其他任何数据集请私信

基于单片机的视觉导航小车设计

目 录 摘 要 I Abstract II 引 言 1 1 总体方案设计 3 1.1 方案论证 3 1.2 项目总体设计 3 2 项目硬件设计 4 2.1 主控模块设计 4 2.1.1单片机选型 4 2.1.2 STM32F103RCT6芯片 4 2.2单片机最小系统电路 5 2.3电机驱动模块设计 7 2.4红外模块设计 8 2.5红外遥控模块设计 9 2.6超…

Logseq电脑端+安卓端同步gitee或github

文章目录 0.初衷1.电脑端1.1 新建仓库1.2 克隆项目&#xff0c;生成秘钥1.3 添加图谱&#xff0c;选择文件目录&#xff0c;我是原本就有笔记&#xff0c;所以会如下所示。1.4 下载脚本文件1.5赋权限 &#xff08;windows可跳过&#xff09;1.6 修改脚本命令1.7 logseq设置同步…

Docker命令大全与实例详解

本文旨在汇总和深入解析日常工作与学习中频繁接触到的Docker核心命令&#xff0c;通过实例演示来巩固记忆&#xff0c;以便读者在实际操作中迅速查阅和高效运用。Docker作为一种轻量级容器技术&#xff0c;已经成为现代应用部署与管理的重要工具。本文将涵盖从基本的Docker环境…

公网ip和局域网ip

什么是公网IP&#xff1f; 公网&#xff0c;俗称外网&#xff0c;又被叫做互联网&#xff0c;是连接不同地区局域网或者城域网计算机的通信的远程网络。通常可以跨接很大的物理范围&#xff0c;连接多个地区、城市和国家提供远距离通信&#xff0c;形成全球性的互联网络。因此…

MySQL临时表创建出错(OS errno 13 - Permission denied)

一个客户向我抱怨&#xff1a;在MySQL查询小表没有问题&#xff0c;查询大表出错&#xff0c;下面是他发给我的出错的部分截屏&#xff08;客户的表名被我隐藏了&#xff09;。 这里的给出的信息已经比较明显了&#xff0c;是向/tmp目录中创建临时表失败&#xff08;临时表的路…

555经典电路

1、555介绍&#xff1a; 555 定时器是一种模拟和数字功能相结合的中规模集成器件。一般用双极性工艺制作的称为 555&#xff0c;用 CMOS 工艺制作的称为 7555&#xff0c;除单定时器外&#xff0c;还有对应的双定时器 556/7556。555 定时器的电源电压范围宽&#xff0c;可在 4…

YoLo进化史《A COMPREHENSIVE REVIEW OF YOLO: FROM YOLOV1 TOYOLOV8 AND BEYOND》

Abstract YOLO已成为机器人、无人驾驶汽车和视频监控应用的核心实时目标检测系统。我们对YOLO的发展进行了全面的分析&#xff0c;研究了从最初的YOLO到YOLOv8的每次迭代中的创新和贡献。我们首先描述标准指标和后处理;然后&#xff0c;我们讨论了网络架构的主要变化和每个模型…

工具篇--分布式定时任务springBoot--elasticjob简单使用(1)

文章目录 前言一、elasticjob 介绍&#xff1a;二、elasticjob 使用&#xff1a;2.1 部署zookeeper&#xff1a;2.2 引入库2.2 定义任务&#xff1a;2.3 任务执行&#xff1a;2.4 任务执行控制台输出&#xff1a; 三、elasticjob 启动错误&#xff1a;3.1 KeeperErrorCode Ope…

数据结构->双向链表带你体验开火车(哨兵)与拼接火车(应用)厢的乐趣

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目的&#xff1a;学习双向带头链表的增&#xff0c;删&#xff0c;查&#xff0c;销毁…

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

PyTorch 源码解读之 torch.cuda.amp: 自动混合精度详解

PyTorch 源码解读之 torch.cuda.amp: 自动混合精度详解 Nvidia 在 Volta 架构中引入 Tensor Core 单元&#xff0c;来支持 FP32 和 FP16 混合精度计算。也在 2018 年提出一个 PyTorch 拓展 apex&#xff0c;来支持模型参数自动混合精度训练。自动混合精度&#xff08;Automati…

2024.03.11作业

1. 提示并输入一个字符串&#xff0c;统计该字符串中大写小写字母个数&#xff0c;数字个数&#xff0c;空格个数以及其他字符个数&#xff0c;要求使用c风格字符串完成 #include <iostream> #include <string>using namespace std;int main() {cout << &qu…

蓝桥杯2023年第十四届Java省赛真题-矩形总面积

题目描述 平面上有个两个矩形 R1 和 R2&#xff0c;它们各边都与坐标轴平行。设 (x1, y1) 和(x2, y2) 依次是 R1 的左下角和右上角坐标&#xff0c;(x3, y3) 和 (x4, y4) 依次是 R2 的左下角和右上角坐标&#xff0c;请你计算 R1 和 R2 的总面积是多少&#xff1f; 注意&…

设计模式深度解析:工厂方法模式与抽象工厂模式的深度对比

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;工厂方法模式文章浏览阅读17k次&#xff0c;点赞105次&#xff0…

根据xlsx文件第一列的网址爬虫(selenium)

seleniumXpath 在与该ipynb文件同文件下新增一个111.xlsx&#xff0c;第一列放一堆需要爬虫的同样式网页 然后使用seleniumXpath爬虫 from selenium import webdriver from selenium.webdriver.common.by import By import openpyxl import timedef crawl_data(driver, url)…