公告置顶-重要

This commit is contained in:
WindowBird 2025-11-19 10:34:14 +08:00
parent 02a2ef9449
commit 811fd2c859
3 changed files with 167 additions and 40 deletions

View File

@ -49,3 +49,29 @@ export const getCustomerStatistics = (params = {}) => {
});
};
/**
* 获取公告列表
* @param {Object} params 请求参数
* @param {number} params.pageNum 页码
* @param {number} params.pageSize 每页数量
* @returns {Promise} 返回公告列表
*/
export const getNoticeList = (params = {}) => {
const queryParams = [];
if (params.pageNum !== undefined) {
queryParams.push(`pageNum=${params.pageNum}`);
}
if (params.pageSize !== undefined) {
queryParams.push(`pageSize=${params.pageSize}`);
}
const queryString = queryParams.length > 0 ? `?${queryParams.join('&')}` : '';
return uni.$uv.http.get(`bst/notice/list${queryString}`, {
custom: {
auth: true // 启用 token 认证
}
});
};

View File

@ -79,17 +79,30 @@
<!-- 公告事项 -->
<view class="announcement-section">
<view class="section-header">
<text class="section-icon">📢</text>
<text class="section-title">公告事项</text>
<view class="announcement-header">
<text class="announcement-title-header">公告</text>
<text class="announcement-view-all" @click.stop="viewAllAnnouncements">查看全部</text>
</view>
<view class="announcement-item task-card-base task-card-announcement" v-for="announcement in announcements" :key="announcement.id" @click="viewAnnouncement(announcement)">
<view class="announcement-content">
<text class="announcement-title">{{ announcement.title }}</text>
<text class="announcement-desc">{{ announcement.description }}</text>
<text class="announcement-time">{{ announcement.time }}</text>
<view class="announcement-content-wrapper">
<view class="announcement-title-row">
<text class="announcement-title">{{ announcement.title }}</text>
<view class="announcement-tags">
<view class="announcement-tag tag-pinned" v-if="announcement.top">置顶</view>
<view class="announcement-tag tag-important" v-if="announcement.level === '2'">重要</view>
</view>
</view>
<view class="announcement-meta">
<view class="announcement-meta-item">
<text class="announcement-meta-icon">👤</text>
<text class="announcement-meta-text">{{ announcement.userName }}</text>
</view>
<view class="announcement-meta-item">
<text class="announcement-meta-icon">🕐</text>
<text class="announcement-meta-text">{{ announcement.createTime }}</text>
</view>
</view>
</view>
<text class="arrow"></text>
</view>
</view>
@ -156,7 +169,7 @@
import { ref, onMounted, watch, computed } from 'vue';
import { storeToRefs } from 'pinia';
import { getTaskStatusType, getTaskStatusStyle, getStatusText } from '@/utils/taskConfig.js';
import { getDashboardBrief, getTaskList } from '@/api';
import { getDashboardBrief, getTaskList, getNoticeList } from '@/api';
import { useUserStore } from '@/store/user';
import {truncateText} from "@/utils/textSolve/truncateText";
@ -182,14 +195,7 @@ const taskStats = ref([
const overdueTasks = ref([]);
//
const announcements = ref([
{
id: 1,
title: '·国庆放假通知',
description: '国庆放假安排1号至6号,前后不调休...',
time: '2025-09-26 16:54:46'
}
]);
const announcements = ref([]);
//
const projectStatus = ref([
@ -313,6 +319,33 @@ const loadOverdueTasks = async () => {
}
};
//
const loadAnnouncements = async () => {
try {
const res = await getNoticeList({ pageNum: 1, pageSize: 2 });
console.log('公告列表加载成功:', res);
if (res && res.rows && Array.isArray(res.rows)) {
announcements.value = res.rows.map((item) => {
return {
id: item.id || '',
title: item.title || '',
content: item.content || '',
userName: item.userName || '',
createTime: item.createTime || '',
top: item.top || false,
level: item.level || ''
};
});
} else {
announcements.value = [];
}
} catch (err) {
console.error('加载公告列表失败:', err);
announcements.value = [];
}
};
//
const loadDashboardData = async () => {
try {
@ -349,6 +382,9 @@ const loadDashboardData = async () => {
//
await loadOverdueTasks();
//
await loadAnnouncements();
} catch (err) {
console.error('加载看板数据失败:', err);
uni.showToast({
@ -415,12 +451,22 @@ const handleOverdueTask = (task) => {
//
const viewAnnouncement = (announcement) => {
console.log('查看公告:', announcement);
// TODO:
uni.showToast({
title: '查看公告详情',
icon: 'none'
});
};
//
const viewAllAnnouncements = () => {
// TODO:
uni.showToast({
title: '查看全部公告',
icon: 'none'
});
};
//
const getProjectStatusType = (label) => {
const typeMap = {
@ -706,7 +752,6 @@ const getTagCustomStyle = (status) => {
.project-status-section,
.customer-status-section {
margin-top: 8px;
}
.section-header {
@ -726,45 +771,101 @@ const getTagCustomStyle = (status) => {
color: #333;
}
.announcement-item {
//
.announcement-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid #f0f0f0;
}
.announcement-title-header {
font-size: 16px;
font-weight: 600;
color: #333;
}
.announcement-view-all {
font-size: 14px;
color: #2885ff;
cursor: pointer;
}
.announcement-item {
display: flex;
flex-direction: column;
margin-bottom: 12px;
}
.task-card-announcement {
border-left: 4px solid #2885ff;
border-left: none;
padding: 16px;
}
.announcement-content {
flex: 1;
.announcement-content-wrapper {
display: flex;
flex-direction: column;
gap: 8px;
gap: 12px;
}
.announcement-title-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.announcement-title {
font-size: 14px;
font-weight: 500;
color: #333;
color: #f56c6c;
flex: 1;
}
.announcement-desc {
.announcement-tags {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
.announcement-tag {
padding: 2px 8px;
border-radius: 4px;
font-size: 12px;
color: #fff;
white-space: nowrap;
}
.tag-pinned {
background-color: #f56c6c;
}
.tag-important {
background-color: #ff9800;
}
.announcement-meta {
display: flex;
align-items: center;
gap: 16px;
}
.announcement-meta-item {
display: flex;
align-items: center;
gap: 4px;
}
.announcement-meta-icon {
font-size: 14px;
}
.announcement-meta-text {
font-size: 12px;
color: #666;
line-height: 1.5;
}
.announcement-time {
font-size: 12px;
color: #999;
}
.arrow {
font-size: 20px;
color: #999;
margin-left: 12px;
}
.status-grid {

View File

@ -10,8 +10,8 @@ export const Request = () => {
// 初始化请求配置
uni.$uv.http.setConfig((config) => {
/* config 为默认全局配置*/
// config.baseURL = 'http://192.168.1.4:4001'; /* 根域名 */
config.baseURL = 'https://pm.ccttiot.com/prod-api'; /* 根域名 */
config.baseURL = 'http://192.168.1.4:4001'; /* 根域名 */
// config.baseURL = 'https://pm.ccttiot.com/prod-api'; /* 根域名 */
return config
})