hurx 1 deň pred
rodič
commit
bd3ebe3167

+ 1 - 1
src/layout/components/workbench.vue

@@ -111,7 +111,7 @@ const menuList = ref<MenuItem[]>([
     show: false,
     children: [
       { path: '/enterprise/companyInfo', title: '企业信息' },
-      { path: '/enterprise/messageNotice', title: '消息通知' }, // 接口没返这个,应该被过滤
+      { path: '/enterprise/messageNotice', title: '企业公告' }, // 接口没返这个,应该被过滤
       { path: '/easybuv', title: '地址管理' },
       { path: '/enterprise/invoiceManage', title: '发票抬头管理' },
       { path: '/enterprise/purchasePlan', title: '专属采购方案' },

+ 85 - 1
src/views/enterprise/messageNotice/addNotice.vue

@@ -2,13 +2,30 @@
   <div class="message-notice-container">
     <div class="page-title">
       <i class="title-bar"></i>
-      <span>{{ isEdit ? '编辑消息通知' : '新增消息通知' }}</span>
+      <span>{{ isEdit ? '编辑公告' : '新增公告' }}</span>
     </div>
     <div class="form-wrapper">
       <el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="标题" prop="title">
           <el-input v-model="form.title" placeholder="请输入标题" />
         </el-form-item>
+        <el-form-item label="封面" prop="coverUrl">
+          <el-upload
+            class="cover-upload"
+            :action="uploadAction"
+            :show-file-list="false"
+            :on-success="handleCoverSuccess"
+            :before-upload="beforeCoverUpload"
+          >
+            <div v-if="form.coverUrl" class="cover-preview">
+              <el-image :src="form.coverUrl" fit="cover" />
+            </div>
+            <div v-else class="cover-placeholder">
+              <el-icon :size="24"><Plus /></el-icon>
+              <span>上传</span>
+            </div>
+          </el-upload>
+        </el-form-item>
         <el-form-item label="内容" prop="content">
           <Editor v-model="form.content" :height="400" />
         </el-form-item>
@@ -32,15 +49,40 @@ import Editor from '@/components/Editor/index.vue';
 import { ref, reactive, onMounted } from 'vue';
 import { useRouter, useRoute } from 'vue-router';
 import { ElMessage } from 'element-plus';
+import { Plus } from '@element-plus/icons-vue';
 import { getMessageInfo, addMessage, updateMessage } from '@/api/pc/enterprise';
 
 const router = useRouter();
 const route = useRoute();
 const formRef = ref();
 
+const uploadAction = import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload';
+
+const beforeCoverUpload = (rawFile: any) => {
+  const isImage = rawFile.type.startsWith('image/');
+  if (!isImage) {
+    ElMessage.error('只能上传图片文件!');
+    return false;
+  }
+  if (rawFile.size / 1024 / 1024 > 2) {
+    ElMessage.error('图片大小不能超过2MB!');
+    return false;
+  }
+  return true;
+};
+
+const handleCoverSuccess = (res: any) => {
+  if (res.code == 200) {
+    form.coverUrl = res.data.url;
+  } else {
+    ElMessage.warning(res.msg || '上传失败');
+  }
+};
+
 const form = reactive({
   title: '',
   content: '',
+  coverUrl: '',
   status: '0'
 });
 
@@ -61,6 +103,7 @@ onMounted(async () => {
       if (res.code === 200 && res.data) {
         form.title = res.data.title;
         form.content = res.data.content;
+        form.coverUrl = res.data.coverUrl || '';
         form.status = String(res.data.status);
       }
     } catch (error) {
@@ -80,6 +123,7 @@ const handleSave = async () => {
     const data: any = {
       title: form.title,
       content: form.content,
+      coverUrl: form.coverUrl,
       status: form.status
     };
 
@@ -123,4 +167,44 @@ const handleSave = async () => {
 .form-wrapper {
   margin-top: 30px;
 }
+
+.cover-upload {
+  :deep(.el-upload) {
+    width: 100px;
+    height: 100px;
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    overflow: hidden;
+    transition: border-color 0.2s;
+
+    &:hover {
+      border-color: #e60012;
+    }
+  }
+}
+
+.cover-preview {
+  width: 100px;
+  height: 100px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  .el-image {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.cover-placeholder {
+  width: 100px;
+  height: 100px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  color: #999;
+  font-size: 12px;
+}
 </style>

+ 14 - 2
src/views/enterprise/messageNotice/index.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="message-container">
-    <div class="page-title"><i class="title-bar"></i><span>消息通知</span></div>
+    <div class="page-title"><i class="title-bar"></i><span>企业公告</span></div>
     <!-- 搜索栏 -->
     <div class="search-bar">
-      <div class="search-right"><el-button type="danger" @click="handleAdd">新增消息通知</el-button></div>
+      <div class="search-right"><el-button type="danger" @click="handleAdd">新增公告</el-button></div>
     </div>
     <!-- Tab切换 -->
     <!-- <div class="tab-nav">
@@ -48,6 +48,18 @@
     <!-- 表格 -->
     <el-table :data="messageList" border style="width: 100%">
       <el-table-column prop="title" label="标题" width="120" align="center" />
+      <el-table-column label="封面" width="120" align="center">
+        <template #default="{ row }">
+          <el-image
+            v-if="row.coverUrl"
+            :src="row.coverUrl"
+            fit="cover"
+            style="width: 60px; height: 60px; border-radius: 4px"
+            :preview-src-list="[row.coverUrl]"
+          />
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
       <el-table-column prop="content" label="内容" />
       <el-table-column prop="createTime" label="创建时间" width="160" align="center" />
       <el-table-column prop="status" label="状态" width="160" align="center">

+ 19 - 5
src/views/home/jdcomponents/JDUserPanel.vue

@@ -20,7 +20,7 @@
           </div>
         </div>
         <!-- 下行:公司单独一行,文字用 12px 且加粗,左侧与上面的头像最左侧对齐 -->
-        <p class="company-name">公司:{{ userInfo.companyName }}</p>
+        <p class="company-name">公司:{{ userInfo.customerName }}</p>
       </div>
 
       <!-- 会员额度卡片:炫酷皇家金蓝渐变背景,金色数值,文字用 12px -->
@@ -92,11 +92,11 @@
         </div>
         <div class="class-card flex-between">
           <div class="class-left-info">
-            <span class="week-tag">2026年 第21周</span>
-            <p class="class-desc">防汛防汛特辑 | 工厂园区篇</p>
+            <span class="week-tag">{{ formatWeek(noticeData.createTime) || '' }}</span>
+            <p class="class-desc">{{ noticeData.title || '' }}</p>
           </div>
-          <div class="class-img-box">
-            <!-- <img src="/images/logo.png" class="class-img" /> -->
+          <div class="class-img-box" v-if="noticeData.coverUrl">
+            <img :src="noticeData.coverUrl" class="class-img" />
           </div>
         </div>
       </div>
@@ -126,11 +126,25 @@ getEnterpriseInfo().then((res) => {
   }
 });
 
+const noticeData = ref<any>({});
+
 getNewNotice({}).then((res) => {
   if (res.code == 200) {
+    noticeData.value = res.data || {};
   }
 });
 
+const formatWeek = (dateStr: string) => {
+  if (!dateStr) return '';
+  const date = new Date(dateStr);
+  const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
+  const dayNum = d.getUTCDay() || 7;
+  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
+  const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
+  const weekNo = Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
+  return `${d.getUTCFullYear()}年 第${weekNo}周`;
+};
+
 currentQuickEntryModule({}).then((res) => {
   if (res.code == 200) {
     dataInfo.value = res.data;