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/group/GroupNotice.vue |  228 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 228 insertions(+), 0 deletions(-)

diff --git a/src/components/group/GroupNotice.vue b/src/components/group/GroupNotice.vue
new file mode 100644
index 0000000..e8ec9e6
--- /dev/null
+++ b/src/components/group/GroupNotice.vue
@@ -0,0 +1,228 @@
+<template>
+  <div class="lum-dialog-mask">
+    <el-container class="lum-dialog-box">
+      <el-header class="header no-select" height="60px">
+        <p>群公告({{ items.length }})</p>
+        <p class="tools">
+          <i class="el-icon-close" @click="$emit('close')" />
+        </p>
+      </el-header>
+      <el-main class="main no-padding">
+        <template v-if="loadStatus == 0">
+          <Loading text="正在努力加载中 ..." />
+        </template>
+        <template v-else-if="loadStatus == 1 && items.length == 0">
+          <div class="loading">
+            <SvgNotData class="svg-icon" />
+            <p>暂无群公告</p>
+          </div>
+        </template>
+        <template v-if="loadStatus == 2">
+          <div class="loading">
+            <i
+              class="el-icon-warning"
+              style="font-size: 50px; color: #ff5151"
+            />
+            <p>
+              加载失败,
+              <a @click="loadNotices" class="pointer">点击重试</a>...
+            </p>
+          </div>
+        </template>
+        <template v-else>
+          <el-scrollbar class="full-height" :native="false" tag="section">
+            <div
+              v-for="(item, index) in items"
+              :key="item.id"
+              class="notice-item"
+            >
+              <div class="title">
+                <span class="left-title">{{ item.title }}</span>
+                <span
+                  class="right-tools no-select"
+                  @click="catNoticeDetail(index)"
+                >
+                  {{ item.isShow ? '收起' : '展开' }}
+                </span>
+              </div>
+              <p class="datetime">
+                <el-avatar :size="15" :src="item.avatar">
+                  <img src="~@/assets/image/detault-avatar.jpg" />
+                </el-avatar>
+                <span class="text nickname" @click="$user(item.user_id)">
+                  {{ item.nickname }}
+                </span>
+                <span class="text">发表于 {{ item.created_at }}</span>
+              </p>
+              <p class="content" :class="{ retract: !item.isShow }">
+                {{ item.content }}
+              </p>
+            </div>
+          </el-scrollbar>
+        </template>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+<script>
+import { ServeGetGroupNotices } from '@/api/group'
+import { SvgNotData } from '@/core/icons'
+import Loading from '@/components/global/Loading'
+export default {
+  name: 'GroupNotice',
+  props: {
+    groupId: {
+      type: [String, Number],
+      default: null,
+    },
+  },
+  components: {
+    SvgNotData,
+    Loading,
+  },
+  data() {
+    return {
+      // 公告列表
+      items: [],
+      loadStatus: 0,
+    }
+  },
+  created() {
+    this.loadNotices()
+  },
+  methods: {
+    // 加载群组公告列表
+    loadNotices() {
+      this.loadStatus = 0
+      ServeGetGroupNotices({
+        group_id: this.groupId,
+      })
+        .then(({ code, data }) => {
+          if (code == 200) {
+            this.items = data.rows.map(item => {
+              item.isShow = false
+              return item
+            })
+
+            this.loadStatus = 1
+          } else {
+            this.loadStatus = 2
+          }
+        })
+        .catch(() => {
+          this.loadStatus = 2
+        })
+    },
+    // 展开/收起群公告详情
+    catNoticeDetail(index) {
+      this.items[index].isShow = !this.items[index].isShow
+    },
+  },
+}
+</script>
+<style lang="less" scoped>
+.lum-dialog-box {
+  width: 650px;
+  max-width: 650px;
+  height: 550px;
+
+  .main {
+    overflow: hidden;
+
+    .loading {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 70%;
+      font-size: 12px;
+
+      p {
+        margin-top: 20px;
+      }
+
+      .svg-icon {
+        width: 80px;
+        margin-bottom: 10px;
+      }
+    }
+
+    .notice-item {
+      cursor: pointer;
+      min-height: 76px;
+      overflow: hidden;
+      border-bottom: 1px dashed #e2dcdc;
+      padding-bottom: 5px;
+      margin: 2px 20px 15px 15px;
+
+      h6 {
+        font-size: 15px;
+        font-weight: 300;
+      }
+
+      .title {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+        height: 30px;
+
+        .left-title {
+          flex: 1 1;
+          height: 100%;
+          line-height: 30px;
+          font-size: 15px;
+        }
+
+        .right-tools {
+          flex-basis: 70px;
+          flex-shrink: 0;
+          height: 100%;
+          line-height: 30px;
+          text-align: right;
+          font-weight: 300;
+          font-size: 12px;
+          color: #2196f3;
+        }
+      }
+
+      .datetime {
+        font-size: 10px;
+        color: #a59696;
+        font-weight: 300;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        margin: 10px 0;
+
+        .text {
+          margin: 0 5px;
+        }
+
+        .nickname {
+          color: #2196f3;
+          font-weight: 400;
+        }
+      }
+
+      .retract {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+
+      .content {
+        font-size: 13px;
+        line-height: 28px;
+        font-weight: 400;
+        color: #706a6a;
+      }
+    }
+  }
+}
+
+/deep/.el-scrollbar__wrap {
+  overflow-x: hidden;
+}
+</style>

--
Gitblit v1.9.3