From 089bf5d2378b3c4a61d795b2a92bede2c193b771 Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:22:58 +0800
Subject: [PATCH] 1

---
 src/components/note/NoteAnnexBox.vue |  246 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 246 insertions(+), 0 deletions(-)

diff --git a/src/components/note/NoteAnnexBox.vue b/src/components/note/NoteAnnexBox.vue
new file mode 100644
index 0000000..a481252
--- /dev/null
+++ b/src/components/note/NoteAnnexBox.vue
@@ -0,0 +1,246 @@
+<template>
+  <div>
+    <p>笔记附件列表({{ files.length }})</p>
+    <div class="annex-box lum-scrollbar">
+      <input ref="uploads" type="file" @change="uploadAnnex" />
+      <div class="annex-main">
+        <p v-show="files.length == 0" class="empty-text">
+          暂无附件
+        </p>
+
+        <div v-for="(file, i) in files" :key="file.id" class="file-item">
+          <div class="suffix">{{ file.suffix }}</div>
+          <div class="content">
+            <div class="filename">{{ file.original_name }}</div>
+            <div class="filetool">
+              <span>{{ formateTime(file.created_at) }}</span>
+              <span class="size">
+                {{ formateSize(file.size) }}
+              </span>
+              <div class="tools">
+                <i class="el-icon-download" @click="downloadAnnex(file.id)" />
+                <i class="el-icon-delete" @click="deleteAnnex(file.id, i)" />
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="annex-footer">
+        <p class="notice-text">最多可支持上传{{ maxNum }}个附件</p>
+        <el-button
+          type="primary"
+          size="small"
+          icon="el-icon-upload"
+          :disabled="files.length >= maxNum"
+          :loading="loadStatus"
+          @click="$refs.uploads.click()"
+          >{{ loadStatus ? '上传中...' : '上传附件' }}
+        </el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  ServeDeleteArticleAnnex,
+  ServeDownloadAnnex as downloadAnnex,
+  ServeUploadArticleAnnex,
+} from '@/api/article'
+import { formateSize, formateTime, parseTime } from '@/utils/functions'
+
+export default {
+  name: 'NoteAnnexBox',
+  props: {
+    id: {
+      type: Number,
+      default: 0,
+    },
+    files: {
+      type: Array,
+      default() {
+        return []
+      },
+    },
+  },
+  data() {
+    return {
+      loadStatus: false,
+      disabled: false,
+      maxNum: 10,
+    }
+  },
+  methods: {
+    // 格式化文件大小
+    formateSize,
+
+    // 格式化时间显示格式
+    formateTime,
+
+    // 下载笔记附件
+    downloadAnnex,
+
+    // 删除笔记附件
+    deleteAnnex(annex_id, index) {
+      ServeDeleteArticleAnnex({
+        annex_id,
+      }).then(({ code }) => {
+        if (code == 200) {
+          this.$delete(this.files, index)
+        }
+      })
+    },
+
+    // 上传笔记附件文件
+    uploadAnnex(e) {
+      if (e.target.files.length == 0) {
+        return false
+      }
+
+      let file = e.target.files[0]
+      if (file.size / (1024 * 1024) > 5) {
+        this.$message('笔记附件不能大于5M!')
+        return false
+      }
+
+      let fileData = new FormData()
+      fileData.append('annex', file)
+      fileData.append('article_id', this.id)
+
+      this.loadStatus = true
+      ServeUploadArticleAnnex(fileData)
+        .then(({ code, data }) => {
+          if (code == 200) {
+            this.files.push({
+              id: data.id,
+              original_name: data.original_name,
+              created_at: parseTime(new Date()),
+              size: data.size,
+              suffix: data.suffix,
+            })
+          }
+        })
+        .finally(() => {
+          this.loadStatus = false
+        })
+    },
+  },
+}
+</script>
+<style lang="less" scoped>
+/* 文件管理弹出层 */
+.annex-box {
+  width: 300px;
+  min-height: 50px;
+  max-height: 675px;
+  background-color: white;
+  overflow-y: auto;
+
+  .annex-main {
+    min-height: 30px;
+    border-bottom: 1px solid rgb(239, 233, 233);
+    margin-bottom: 8px;
+    padding: 5px 0;
+
+    .empty-text {
+      color: #969292;
+      font-size: 12px;
+      margin-top: 10px;
+    }
+
+    .file-item {
+      height: 50px;
+      margin-bottom: 5px;
+      margin-top: 10px;
+
+      .suffix {
+        width: 50px;
+        height: 100%;
+        background-color: #ffcc80;
+        border-radius: 3px;
+        float: left;
+        line-height: 50px;
+        text-align: center;
+        color: white;
+      }
+
+      .content {
+        float: left;
+        width: 247px;
+        height: 100%;
+
+        .filename {
+          padding-left: 5px;
+          color: #172b4d;
+          font-size: 14px;
+          font-weight: 400;
+          line-height: 1.6;
+          white-space: nowrap;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
+
+        .filetool {
+          color: #505f79;
+          font-size: 12px;
+          font-weight: 400;
+          line-height: 1.6;
+          padding-left: 5px;
+          margin-top: 9px;
+          position: relative;
+
+          span {
+            margin: 0 3px;
+            &.size {
+              color: #3a8ee6;
+            }
+          }
+        }
+
+        .tools {
+          position: absolute;
+          top: -5px;
+          right: 5px;
+          width: 55px;
+          height: 24px;
+          text-align: right;
+          line-height: 28px;
+
+          i {
+            font-size: 16px;
+            cursor: pointer;
+            margin-right: 5px;
+          }
+
+          .el-icon-download {
+            color: #66b1ff;
+          }
+
+          .el-icon-delete {
+            color: red;
+          }
+        }
+      }
+    }
+  }
+
+  input {
+    display: none;
+  }
+
+  .annex-footer {
+    .notice-text {
+      font-size: 12px;
+      color: #ccc;
+      text-align: left;
+      float: left;
+      padding-top: 10px;
+    }
+
+    button {
+      float: right;
+    }
+  }
+}
+</style>

--
Gitblit v1.9.3