el-draw的文件列表和清单内容布局实现

效果:左中右布局:左侧是清单内容,中间是清单的文件列表,点击文件列表可以预览文件详情,右侧是文件预览效果

el-draw部分:

 <el-drawer :title="showPdfViewer.title" :close-on-click-modal="false" v-model="showPdfViewer.visible" size="100%" append-to-body>
      <div class="shenpi-content">
        <el-card shadow="hover" style="width: 25%; margin-right: 10px; ">
          <template #header>
            <span style="color: #409EFF;">备案信息</span>
          </template>
          <div class="shenpi-form">
            <el-form ref="beianShenpiFormRef" :model="form" :rules="rules" label-width="100px">
              <el-form-item label="技术名称" prop="techName">
                {{form.techName}}
              </el-form-item>
              <!--            <el-form-item label="医院名称" prop="hospName">-->
              <!--              {{form.hospName}}-->
              <!--            </el-form-item>-->
              <el-form-item label="申请类型" prop="shenqingLeixing">
                {{ CaoZuoLeiXingLabelMap[form.shenqingLeixing]  }}
              </el-form-item>
              <el-form-item label="申请人姓名" prop="shenqingren">
                {{form.shenqingren}}
              </el-form-item>
              <el-form-item label="申请日期" prop="shenqingRiqi">
                {{form.shenqingRiqi}}
              </el-form-item>
              <el-form-item label="审批人" prop="shenpiRen">
                {{form.shenqingRiqi}}
              </el-form-item>
              <el-form-item label="审批时间" prop="shenpiShijian">
                {{form.shenpiShijian}}
              </el-form-item>
              <el-form-item label="状态" prop="zhuangtai">
                <el-tag v-if="form.zhuangtai == '1'" type="warning" effect="light">待审批</el-tag>
                <el-tag v-if="form.zhuangtai == '2'" type="success" effect="light">审批通过</el-tag>
                <el-tag v-if="form.zhuangtai == '3'" type="danger" effect="light">审批驳回</el-tag>
              </el-form-item>

              <el-form-item label="备注" prop="remark">
                {{form.remark}}
              </el-form-item>
              <el-form-item label="审批意见" prop="shenpiYijian">
                <el-input type="textarea" :disabled="form.zhuangtai!=1" :rows="5" v-model="form.shenpiYijian"></el-input>
              </el-form-item>
              <el-form-item label="操作" v-if="form.zhuangtai == '1'">
                <el-row :gutter="10" style="display: flex; align-items: center;">
                  <el-col :span="12">
                    <el-button type="primary" @click="shenpiTongGuo()" style="width: 100%;">审批通过</el-button>
                  </el-col>
                  <el-col :span="12">
                    <el-button type="warning" @click="shenpiBohui()" style="width: 100%;">审批驳回</el-button>
                  </el-col>
                </el-row>
              </el-form-item>
            </el-form>
          </div>
        </el-card>
        <el-card shadow="hover" style="width:28%; margin-right: 10px;" >
          <template #header>
            <span style="color: #409EFF;">附件列表</span>
          </template>
          <div class="shenpi-fujians">
            <div class="file-list" style="max-height: 700px; overflow-y: auto;">
              <ul class="file-list-ul">
                <li
                  class="file-list-item"
                  :class="{ selected: showPdfViewer.ossId === item.ossId }"
                  :key="item.ossId"
                  @click="handleShowPdfViewer(item)"
                  v-for="item in beianFiles"
                >
                  <span v-if="item.shenQingLeiXing" style="color: red">【{{ CaoZuoLeiXingLabelMap[item.shenQingLeiXing]}}】</span>
                  {{ item.detptAndRenYuanName ? '(' + item.detptAndRenYuanName + ')' + item.cailiaoMingcheng : item.cailiaoMingcheng }}
                </li>
              </ul>
            </div>
          </div>
        </el-card>
        <div style="height: 100%;width: 70%;" v-if="showPdfViewer.ossId">
          <oss-pdf-viewer v-if="showPdfViewer.visible" :oss-id="showPdfViewer.ossId"></oss-pdf-viewer>
        </div>
      </div>
    </el-drawer>

style部分:

<style lang="scss">
.shenpi-content {
  height: 100%;
  display: flex;
  gap: 10px;
  // 表单
  .shenpi-form {
    display: flex;
  }
  // 附件列表
  .shenpi-fujians {
    display: flex;
    margin-left: 20px;
    width: 100%;
  }
}
// 文件列表
.file-list-ul {
  list-style: none;
  padding: 0;
  margin: 0;
  width: 300px;
  .file-list-item {
    width: 100%;
    padding: 10px;
    margin-bottom: 5px;
    background-color: #f9f9f9;
    border-radius: 4px;
    cursor: pointer;
    transition: background-color 0.3s ease;
    font-size: 14px;
    &:hover {
      background-color: #e0e0e0;
    }

    &.selected {
      background-color: #d1e7dd; /* 选中时的背景颜色 */
      font-weight: bold; /* 选中时的字体加粗 */
    }
  }
}
</style>

 pdf组件预览组件:

proxy?.$download.ossBlod(props.ossId)替换成自己的实际下载方法就行返回Promise<Blob>,我用的是若依框架

预览组件:

<template>
  <!--  {{pdfUrl}}-->
  <iframe :src="pdfUrl" style="border: none; width: 100%; height: 100%;"></iframe>
  <!--    <pdf-viewer :pdf-url="pdfUrl"></pdf-viewer>-->
</template>

<script setup name="OssPdfViewer" lang="ts">
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const props = defineProps({
  ossId: {
    type: [String , Number],
    required: true,
  },
});
const pdfUrl = ref('')
const handleDownload = () => {
  proxy?.$download.ossBlod(props.ossId).then(data=>{
    const blob = new Blob([data],{
      type:'application/pdf'
    })
    let url = window.URL.createObjectURL(blob)
    pdfUrl.value = url

  })
}
watch(()=>props.ossId,()=>{
  handleDownload()
})

onMounted(()=>{
  handleDownload()
})
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值