verce-vue-test 0.0.16 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/App.vue +36 -1
- package/src/assets/notice-hero-banner.jpg +0 -0
- package/src/main.ts +2 -1
- package/src/router/index.ts +10 -0
- package/src/views/NoticeAnnouncementView.vue +356 -0
- package/src/views/NoticeDetailView.vue +267 -0
package/package.json
CHANGED
package/src/App.vue
CHANGED
|
@@ -13,11 +13,13 @@ import {
|
|
|
13
13
|
DataLine,
|
|
14
14
|
InfoFilled,
|
|
15
15
|
TrendCharts,
|
|
16
|
+
Bell,
|
|
16
17
|
} from '@element-plus/icons-vue'
|
|
17
18
|
|
|
18
19
|
const isCollapse = ref(false)
|
|
19
20
|
const route = useRoute()
|
|
20
21
|
const isFullscreenRoute = computed(() => route.meta.fullscreen === true)
|
|
22
|
+
const isNoticeRoute = computed(() => route.path.startsWith('/notice-announcement'))
|
|
21
23
|
|
|
22
24
|
function toggleCollapse() {
|
|
23
25
|
isCollapse.value = !isCollapse.value
|
|
@@ -87,6 +89,10 @@ function toggleCollapse() {
|
|
|
87
89
|
<el-icon><TrendCharts /></el-icon>
|
|
88
90
|
<span>总行管理员首页</span>
|
|
89
91
|
</el-menu-item>
|
|
92
|
+
<el-menu-item index="/notice-announcement">
|
|
93
|
+
<el-icon><Bell /></el-icon>
|
|
94
|
+
<span>通知公告</span>
|
|
95
|
+
</el-menu-item>
|
|
90
96
|
<el-menu-item index="/about">
|
|
91
97
|
<el-icon><InfoFilled /></el-icon>
|
|
92
98
|
<span>关于</span>
|
|
@@ -116,9 +122,38 @@ function toggleCollapse() {
|
|
|
116
122
|
</el-dropdown>
|
|
117
123
|
</el-header>
|
|
118
124
|
|
|
119
|
-
<el-main
|
|
125
|
+
<el-main
|
|
126
|
+
class="app-main"
|
|
127
|
+
:class="{ 'is-notice-route': isNoticeRoute }"
|
|
128
|
+
style="height: calc(100vh - 60px); overflow-y: auto"
|
|
129
|
+
>
|
|
120
130
|
<RouterView />
|
|
121
131
|
</el-main>
|
|
122
132
|
</el-container>
|
|
123
133
|
</el-container>
|
|
124
134
|
</template>
|
|
135
|
+
|
|
136
|
+
<style scoped>
|
|
137
|
+
.app-main.is-notice-route {
|
|
138
|
+
scrollbar-width: thin;
|
|
139
|
+
scrollbar-color: #8fa7c9 #edf4ff;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.app-main.is-notice-route::-webkit-scrollbar {
|
|
143
|
+
width: 8px;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.app-main.is-notice-route::-webkit-scrollbar-track {
|
|
147
|
+
background: #edf4ff;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.app-main.is-notice-route::-webkit-scrollbar-thumb {
|
|
151
|
+
border: 2px solid #edf4ff;
|
|
152
|
+
border-radius: 999px;
|
|
153
|
+
background: #8fa7c9;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.app-main.is-notice-route::-webkit-scrollbar-thumb:hover {
|
|
157
|
+
background: #6f8cb7;
|
|
158
|
+
}
|
|
159
|
+
</style>
|
|
Binary file
|
package/src/main.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { createApp } from 'vue'
|
|
|
2
2
|
import { createPinia } from 'pinia'
|
|
3
3
|
import ElementPlus from 'element-plus'
|
|
4
4
|
import 'element-plus/dist/index.css'
|
|
5
|
+
import zhCn from 'element-plus/es/locale/lang/zh-cn'
|
|
5
6
|
import './assets/reset.css'
|
|
6
7
|
|
|
7
8
|
import App from './App.vue'
|
|
@@ -11,6 +12,6 @@ const app = createApp(App)
|
|
|
11
12
|
|
|
12
13
|
app.use(createPinia())
|
|
13
14
|
app.use(router)
|
|
14
|
-
app.use(ElementPlus)
|
|
15
|
+
app.use(ElementPlus, { locale: zhCn })
|
|
15
16
|
|
|
16
17
|
app.mount('#app')
|
package/src/router/index.ts
CHANGED
|
@@ -66,6 +66,16 @@ const router = createRouter({
|
|
|
66
66
|
meta: { fullscreen: true },
|
|
67
67
|
component: () => import('../views/ExecutiveManagementView/index.vue'),
|
|
68
68
|
},
|
|
69
|
+
{
|
|
70
|
+
path: '/notice-announcement',
|
|
71
|
+
name: 'noticeAnnouncement',
|
|
72
|
+
component: () => import('../views/NoticeAnnouncementView.vue'),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
path: '/notice-announcement/detail',
|
|
76
|
+
name: 'noticeDetail',
|
|
77
|
+
component: () => import('../views/NoticeDetailView.vue'),
|
|
78
|
+
},
|
|
69
79
|
],
|
|
70
80
|
})
|
|
71
81
|
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { ref } from 'vue'
|
|
3
|
+
import { useRouter } from 'vue-router'
|
|
4
|
+
import { Search, Top } from '@element-plus/icons-vue'
|
|
5
|
+
import noticeHeroBanner from '@/assets/notice-hero-banner.jpg'
|
|
6
|
+
|
|
7
|
+
interface NoticeItem {
|
|
8
|
+
id: number
|
|
9
|
+
title: string
|
|
10
|
+
date: string
|
|
11
|
+
pinned?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const notices: NoticeItem[] = [
|
|
15
|
+
{
|
|
16
|
+
id: 1001,
|
|
17
|
+
title: '关于系统维护升级的公告(2024年6月15日)',
|
|
18
|
+
date: '2024-06-10',
|
|
19
|
+
pinned: true,
|
|
20
|
+
},
|
|
21
|
+
{ id: 1002, title: '关于优化预填报流程的通知', date: '2024-06-08' },
|
|
22
|
+
{ id: 1003, title: '端午节放假安排通知', date: '2024-06-05' },
|
|
23
|
+
{ id: 1004, title: '系统性能优化完成公告', date: '2024-06-03' },
|
|
24
|
+
{ id: 1005, title: '数据安全重要提醒', date: '2024-05-30' },
|
|
25
|
+
{ id: 1006, title: '关于系统新增功能的使用说明', date: '2024-05-28' },
|
|
26
|
+
{ id: 1007, title: '五一劳动节放假安排通知', date: '2024-04-25' },
|
|
27
|
+
{ id: 1008, title: '系统升级完成公告', date: '2024-04-15' },
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
const currentPage = ref(1)
|
|
31
|
+
const router = useRouter()
|
|
32
|
+
|
|
33
|
+
function goToNoticeDetail(item: NoticeItem) {
|
|
34
|
+
router.push({
|
|
35
|
+
name: 'noticeDetail',
|
|
36
|
+
query: { id: String(item.id) },
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<template>
|
|
42
|
+
<main class="notice-page">
|
|
43
|
+
<section class="notice-hero" aria-label="通知公告">
|
|
44
|
+
<img
|
|
45
|
+
class="notice-hero__image"
|
|
46
|
+
:src="noticeHeroBanner"
|
|
47
|
+
alt=""
|
|
48
|
+
aria-hidden="true"
|
|
49
|
+
decoding="async"
|
|
50
|
+
/>
|
|
51
|
+
|
|
52
|
+
<div class="notice-hero__copy">
|
|
53
|
+
<h1>通知公告</h1>
|
|
54
|
+
<p>了解平台最新动态和重要通知</p>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="notice-search" role="search">
|
|
58
|
+
<input type="search" placeholder="请输入关键词" aria-label="请输入关键词" />
|
|
59
|
+
<el-icon :size="22"><Search /></el-icon>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
</section>
|
|
63
|
+
|
|
64
|
+
<section class="notice-panel" aria-label="公告列表">
|
|
65
|
+
<div class="notice-table__head">
|
|
66
|
+
<span>公告标题</span>
|
|
67
|
+
<span>发布时间</span>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<ul class="notice-list">
|
|
71
|
+
<li v-for="item in notices" :key="`${item.title}-${item.date}`" class="notice-row">
|
|
72
|
+
<button class="notice-title" type="button" @click="goToNoticeDetail(item)">
|
|
73
|
+
<span v-if="item.pinned" class="pin-tag">
|
|
74
|
+
<el-icon :size="18"><Top /></el-icon>
|
|
75
|
+
置顶
|
|
76
|
+
</span>
|
|
77
|
+
<span>{{ item.title }}</span>
|
|
78
|
+
</button>
|
|
79
|
+
<time :datetime="item.date">{{ item.date }}</time>
|
|
80
|
+
</li>
|
|
81
|
+
</ul>
|
|
82
|
+
|
|
83
|
+
<div class="notice-pagination">
|
|
84
|
+
<el-pagination
|
|
85
|
+
v-model:current-page="currentPage"
|
|
86
|
+
:page-size="8"
|
|
87
|
+
:pager-count="5"
|
|
88
|
+
:total="40"
|
|
89
|
+
background
|
|
90
|
+
layout="prev, pager, next, jumper"
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
</section>
|
|
94
|
+
</main>
|
|
95
|
+
</template>
|
|
96
|
+
|
|
97
|
+
<style scoped>
|
|
98
|
+
.notice-page {
|
|
99
|
+
min-height: 100%;
|
|
100
|
+
overflow: visible;
|
|
101
|
+
color: #10182d;
|
|
102
|
+
background:
|
|
103
|
+
linear-gradient(180deg, #f9fbff 0%, #f4f7fc 42%, #f7f9fd 100%);
|
|
104
|
+
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", sans-serif;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.notice-hero {
|
|
108
|
+
position: relative;
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
min-height: 150px;
|
|
111
|
+
padding: 32px clamp(28px, 4.6vw, 72px) 24px;
|
|
112
|
+
border-bottom: 1px solid rgba(219, 226, 237, 0.82);
|
|
113
|
+
background: #eef6ff;
|
|
114
|
+
transform: translateZ(0);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.notice-hero__image {
|
|
118
|
+
position: absolute;
|
|
119
|
+
inset: 0;
|
|
120
|
+
width: 100%;
|
|
121
|
+
height: 100%;
|
|
122
|
+
object-fit: cover;
|
|
123
|
+
object-position: center;
|
|
124
|
+
user-select: none;
|
|
125
|
+
pointer-events: none;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.notice-hero__copy {
|
|
129
|
+
position: relative;
|
|
130
|
+
z-index: 2;
|
|
131
|
+
padding-top: 3px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.notice-hero__copy h1 {
|
|
135
|
+
margin: 0;
|
|
136
|
+
font-size: clamp(28px, 2.6vw, 36px);
|
|
137
|
+
line-height: 1.18;
|
|
138
|
+
font-weight: 800;
|
|
139
|
+
letter-spacing: 0;
|
|
140
|
+
color: #0c172d;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.notice-hero__copy p {
|
|
144
|
+
margin: 18px 0 0;
|
|
145
|
+
font-size: 15px;
|
|
146
|
+
line-height: 1.7;
|
|
147
|
+
color: #748098;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.notice-search {
|
|
151
|
+
position: absolute;
|
|
152
|
+
z-index: 3;
|
|
153
|
+
top: 24px;
|
|
154
|
+
right: clamp(28px, 4.6vw, 72px);
|
|
155
|
+
display: flex;
|
|
156
|
+
align-items: center;
|
|
157
|
+
width: min(288px, calc(100vw - 56px));
|
|
158
|
+
height: 42px;
|
|
159
|
+
padding: 0 15px 0 16px;
|
|
160
|
+
border: 1px solid #d5ddea;
|
|
161
|
+
border-radius: 8px;
|
|
162
|
+
background: rgba(255, 255, 255, 0.84);
|
|
163
|
+
box-shadow: 0 8px 22px rgba(29, 63, 112, 0.05);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.notice-search input {
|
|
167
|
+
width: 100%;
|
|
168
|
+
border: 0;
|
|
169
|
+
outline: 0;
|
|
170
|
+
color: #24314b;
|
|
171
|
+
background: transparent;
|
|
172
|
+
font: inherit;
|
|
173
|
+
font-size: 14px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.notice-search input::placeholder {
|
|
177
|
+
color: #9aa6ba;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.notice-search .el-icon {
|
|
181
|
+
flex: 0 0 auto;
|
|
182
|
+
color: #65738e;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.notice-panel {
|
|
186
|
+
position: relative;
|
|
187
|
+
z-index: 4;
|
|
188
|
+
width: calc(100% - clamp(36px, 3.7vw, 56px));
|
|
189
|
+
margin: -1px auto 32px;
|
|
190
|
+
padding: 32px 42px 20px;
|
|
191
|
+
border: 1px solid #e1e7f0;
|
|
192
|
+
border-radius: 8px;
|
|
193
|
+
background: rgba(255, 255, 255, 0.93);
|
|
194
|
+
box-shadow: 0 8px 24px rgba(32, 58, 95, 0.05);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.notice-table__head,
|
|
198
|
+
.notice-row {
|
|
199
|
+
display: grid;
|
|
200
|
+
grid-template-columns: minmax(0, 1fr) 190px;
|
|
201
|
+
column-gap: 32px;
|
|
202
|
+
align-items: center;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.notice-table__head {
|
|
206
|
+
height: 40px;
|
|
207
|
+
padding: 0 23px;
|
|
208
|
+
border-bottom: 1px solid #dfe6f0;
|
|
209
|
+
color: #6e7b94;
|
|
210
|
+
font-size: 15px;
|
|
211
|
+
font-weight: 500;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.notice-list {
|
|
215
|
+
margin: 0;
|
|
216
|
+
padding: 0;
|
|
217
|
+
list-style: none;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.notice-row {
|
|
221
|
+
min-height: 60px;
|
|
222
|
+
padding: 0 23px;
|
|
223
|
+
border-bottom: 1px solid #e8edf5;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.notice-title {
|
|
227
|
+
display: inline-flex;
|
|
228
|
+
align-items: center;
|
|
229
|
+
min-width: 0;
|
|
230
|
+
gap: 16px;
|
|
231
|
+
padding: 0;
|
|
232
|
+
border: 0;
|
|
233
|
+
color: #0e172b;
|
|
234
|
+
background: transparent;
|
|
235
|
+
cursor: pointer;
|
|
236
|
+
text-decoration: none;
|
|
237
|
+
font-size: 16px;
|
|
238
|
+
line-height: 1.45;
|
|
239
|
+
font-weight: 500;
|
|
240
|
+
font-family: inherit;
|
|
241
|
+
text-align: left;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.notice-title:hover {
|
|
245
|
+
color: #006fff;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.pin-tag {
|
|
249
|
+
display: inline-flex;
|
|
250
|
+
flex: 0 0 auto;
|
|
251
|
+
align-items: center;
|
|
252
|
+
gap: 4px;
|
|
253
|
+
height: 32px;
|
|
254
|
+
padding: 0 7px;
|
|
255
|
+
border-radius: 4px;
|
|
256
|
+
color: #ff2e25;
|
|
257
|
+
background: #ffe8e6;
|
|
258
|
+
font-size: 14px;
|
|
259
|
+
font-weight: 600;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.notice-row time {
|
|
263
|
+
color: #71809c;
|
|
264
|
+
font-size: 16px;
|
|
265
|
+
line-height: 1.4;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.notice-pagination {
|
|
269
|
+
display: flex;
|
|
270
|
+
align-items: center;
|
|
271
|
+
justify-content: center;
|
|
272
|
+
min-height: 66px;
|
|
273
|
+
padding-top: 11px;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
@media (max-width: 920px) {
|
|
277
|
+
.notice-hero {
|
|
278
|
+
min-height: 150px;
|
|
279
|
+
padding-top: 68px;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.notice-hero__image {
|
|
283
|
+
object-position: 62% center;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.notice-panel {
|
|
287
|
+
padding-inline: 20px;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.notice-table__head,
|
|
291
|
+
.notice-row {
|
|
292
|
+
grid-template-columns: minmax(0, 1fr) 128px;
|
|
293
|
+
column-gap: 18px;
|
|
294
|
+
padding-inline: 10px;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.notice-title,
|
|
298
|
+
.notice-row time {
|
|
299
|
+
font-size: 16px;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
@media (max-width: 640px) {
|
|
304
|
+
.notice-hero {
|
|
305
|
+
min-height: 150px;
|
|
306
|
+
padding: 64px 22px 20px;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.notice-search {
|
|
310
|
+
left: 22px;
|
|
311
|
+
right: 22px;
|
|
312
|
+
width: auto;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.notice-hero__image {
|
|
316
|
+
object-position: 66% center;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.notice-panel {
|
|
320
|
+
width: calc(100% - 24px);
|
|
321
|
+
padding: 20px 14px 18px;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.notice-table__head {
|
|
325
|
+
display: none;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.notice-row {
|
|
329
|
+
display: flex;
|
|
330
|
+
min-height: 82px;
|
|
331
|
+
align-items: flex-start;
|
|
332
|
+
justify-content: center;
|
|
333
|
+
flex-direction: column;
|
|
334
|
+
gap: 7px;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.notice-title {
|
|
338
|
+
gap: 9px;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.pin-tag {
|
|
342
|
+
height: 28px;
|
|
343
|
+
font-size: 14px;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.notice-row time {
|
|
347
|
+
font-size: 14px;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.notice-pagination {
|
|
351
|
+
flex-wrap: wrap;
|
|
352
|
+
gap: 8px;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
</style>
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import { useRoute } from 'vue-router'
|
|
4
|
+
import { Top } from '@element-plus/icons-vue'
|
|
5
|
+
|
|
6
|
+
interface ArticleSection {
|
|
7
|
+
heading: string
|
|
8
|
+
paragraphs?: string[]
|
|
9
|
+
items?: string[]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface NoticeDetail {
|
|
13
|
+
id: number
|
|
14
|
+
title: string
|
|
15
|
+
publishTime: string
|
|
16
|
+
views: number
|
|
17
|
+
pinned?: boolean
|
|
18
|
+
salutation: string
|
|
19
|
+
intro: string
|
|
20
|
+
sections: ArticleSection[]
|
|
21
|
+
closing: string
|
|
22
|
+
team: string
|
|
23
|
+
signatureDate: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const noticeDetails: NoticeDetail[] = [
|
|
27
|
+
{
|
|
28
|
+
id: 1001,
|
|
29
|
+
title: '关于系统维护升级的公告(2024年6月15日)',
|
|
30
|
+
publishTime: '2024-06-10 10:00:00',
|
|
31
|
+
views: 1268,
|
|
32
|
+
pinned: true,
|
|
33
|
+
salutation: '尊敬的用户:',
|
|
34
|
+
intro: '为提供更稳定、高效的服务,系统将于以下时间进行维护升级。维护期间,系统部分功能将受到影响,给您带来的不便,敬请谅解!',
|
|
35
|
+
sections: [
|
|
36
|
+
{
|
|
37
|
+
heading: '一、维护时间',
|
|
38
|
+
paragraphs: ['2024年6月15日(周六)02:00 - 06:00(预计4小时)'],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
heading: '二、维护范围',
|
|
42
|
+
paragraphs: ['系统整体升级维护,期间将暂停服务。'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
heading: '三、影响范围',
|
|
46
|
+
items: [
|
|
47
|
+
'系统登录、项目管理、任务协作等功能将无法使用;',
|
|
48
|
+
'维护期间可能无法正常访问平台;',
|
|
49
|
+
'已进行的操作将在系统恢复后正常保存。',
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
heading: '四、注意事项',
|
|
54
|
+
items: [
|
|
55
|
+
'请您提前安排好相关工作,避免在维护期间进行重要操作;',
|
|
56
|
+
'维护完成后,系统将自动恢复服务,无需您进行任何操作;',
|
|
57
|
+
'如有紧急问题,请联系管理员。',
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
closing: '感谢您对我们工作的支持与理解!',
|
|
62
|
+
team: '项目管理平台运营团队',
|
|
63
|
+
signatureDate: '2024年6月10日',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 1002,
|
|
67
|
+
title: '关于优化预填报流程的通知',
|
|
68
|
+
publishTime: '2024-06-08 09:30:00',
|
|
69
|
+
views: 986,
|
|
70
|
+
salutation: '尊敬的用户:',
|
|
71
|
+
intro: '为提升预填报效率,平台已对填报步骤、校验提示和保存逻辑进行优化,请您在办理相关业务时关注页面提示。',
|
|
72
|
+
sections: [
|
|
73
|
+
{ heading: '一、优化内容', items: ['精简重复填写字段;', '优化必填项校验提示;', '增强草稿保存稳定性。'] },
|
|
74
|
+
{ heading: '二、生效时间', paragraphs: ['本次优化自2024年6月8日起正式生效。'] },
|
|
75
|
+
],
|
|
76
|
+
closing: '感谢您的配合。',
|
|
77
|
+
team: '项目管理平台运营团队',
|
|
78
|
+
signatureDate: '2024年6月8日',
|
|
79
|
+
},
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
const route = useRoute()
|
|
83
|
+
const noticeId = computed(() => Number(route.query.id))
|
|
84
|
+
const notice = computed(() => noticeDetails.find((item) => item.id === noticeId.value))
|
|
85
|
+
</script>
|
|
86
|
+
|
|
87
|
+
<template>
|
|
88
|
+
<main class="notice-detail-page">
|
|
89
|
+
<article v-if="notice" class="notice-article">
|
|
90
|
+
<div v-if="notice.pinned" class="pin-tag">
|
|
91
|
+
<el-icon :size="18"><Top /></el-icon>
|
|
92
|
+
置顶
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<h1>{{ notice.title }}</h1>
|
|
96
|
+
|
|
97
|
+
<div class="article-meta">
|
|
98
|
+
<span>发布时间: {{ notice.publishTime }}</span>
|
|
99
|
+
<span>浏览量: {{ notice.views }}</span>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<div class="article-divider"></div>
|
|
103
|
+
|
|
104
|
+
<section class="article-content">
|
|
105
|
+
<p class="salutation">{{ notice.salutation }}</p>
|
|
106
|
+
|
|
107
|
+
<p class="indent">{{ notice.intro }}</p>
|
|
108
|
+
|
|
109
|
+
<template v-for="section in notice.sections" :key="section.heading">
|
|
110
|
+
<h2>{{ section.heading }}</h2>
|
|
111
|
+
<p v-for="paragraph in section.paragraphs" :key="paragraph">{{ paragraph }}</p>
|
|
112
|
+
<ol v-if="section.items?.length">
|
|
113
|
+
<li v-for="item in section.items" :key="item">{{ item }}</li>
|
|
114
|
+
</ol>
|
|
115
|
+
</template>
|
|
116
|
+
|
|
117
|
+
<p>{{ notice.closing }}</p>
|
|
118
|
+
|
|
119
|
+
<footer class="article-signature">
|
|
120
|
+
<p>{{ notice.team }}</p>
|
|
121
|
+
<p>{{ notice.signatureDate }}</p>
|
|
122
|
+
</footer>
|
|
123
|
+
</section>
|
|
124
|
+
</article>
|
|
125
|
+
|
|
126
|
+
<el-empty v-else class="notice-empty" description="未找到公告详情" />
|
|
127
|
+
</main>
|
|
128
|
+
</template>
|
|
129
|
+
|
|
130
|
+
<style scoped>
|
|
131
|
+
.notice-detail-page {
|
|
132
|
+
min-height: 100%;
|
|
133
|
+
padding: 0 0 30px;
|
|
134
|
+
overflow-x: hidden;
|
|
135
|
+
color: #0f172a;
|
|
136
|
+
background:
|
|
137
|
+
radial-gradient(circle at 18% 10%, rgba(35, 116, 255, 0.06), transparent 30%),
|
|
138
|
+
linear-gradient(180deg, #f8fbff 0%, #f5f8fc 100%);
|
|
139
|
+
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", sans-serif;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.notice-article {
|
|
143
|
+
width: min(100%, 1174px);
|
|
144
|
+
margin: 0 auto;
|
|
145
|
+
padding: 46px 46px 62px;
|
|
146
|
+
border: 1px solid #e1e7f0;
|
|
147
|
+
border-radius: 8px;
|
|
148
|
+
background: rgba(255, 255, 255, 0.96);
|
|
149
|
+
box-shadow: 0 14px 42px rgba(32, 58, 95, 0.06);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.pin-tag {
|
|
153
|
+
display: inline-flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
gap: 4px;
|
|
156
|
+
height: 37px;
|
|
157
|
+
padding: 0 10px;
|
|
158
|
+
border-radius: 4px;
|
|
159
|
+
color: #ff2e25;
|
|
160
|
+
background: #ffe8e6;
|
|
161
|
+
font-size: 17px;
|
|
162
|
+
font-weight: 600;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.notice-article h1 {
|
|
166
|
+
margin: 33px 0 22px;
|
|
167
|
+
color: #080f20;
|
|
168
|
+
font-size: clamp(28px, 3vw, 38px);
|
|
169
|
+
line-height: 1.26;
|
|
170
|
+
font-weight: 800;
|
|
171
|
+
letter-spacing: 0;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.article-meta {
|
|
175
|
+
display: flex;
|
|
176
|
+
flex-wrap: wrap;
|
|
177
|
+
gap: 34px 90px;
|
|
178
|
+
color: #6f7e98;
|
|
179
|
+
font-size: 18px;
|
|
180
|
+
line-height: 1.5;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.article-divider {
|
|
184
|
+
height: 1px;
|
|
185
|
+
margin: 35px 0 26px;
|
|
186
|
+
background: #dfe6f0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.article-content {
|
|
190
|
+
font-size: 21px;
|
|
191
|
+
line-height: 2.08;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.article-content p {
|
|
195
|
+
margin: 0 0 28px;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.article-content .salutation {
|
|
199
|
+
margin-bottom: 32px;
|
|
200
|
+
font-weight: 700;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.article-content .indent {
|
|
204
|
+
text-indent: 2em;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.article-content h2 {
|
|
208
|
+
margin: 43px 0 10px;
|
|
209
|
+
color: #0d1527;
|
|
210
|
+
font-size: 22px;
|
|
211
|
+
line-height: 1.75;
|
|
212
|
+
font-weight: 800;
|
|
213
|
+
letter-spacing: 0;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.article-content ol {
|
|
217
|
+
margin: 0 0 28px 30px;
|
|
218
|
+
padding: 0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.article-content li {
|
|
222
|
+
padding-left: 7px;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.article-signature {
|
|
226
|
+
margin-top: 52px;
|
|
227
|
+
text-align: right;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.article-signature p {
|
|
231
|
+
margin: 0 0 8px;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.notice-empty {
|
|
235
|
+
width: min(100%, 1174px);
|
|
236
|
+
min-height: 420px;
|
|
237
|
+
margin: 0 auto;
|
|
238
|
+
border: 1px solid #e1e7f0;
|
|
239
|
+
border-radius: 8px;
|
|
240
|
+
background: rgba(255, 255, 255, 0.96);
|
|
241
|
+
box-shadow: 0 14px 42px rgba(32, 58, 95, 0.06);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
@media (max-width: 768px) {
|
|
245
|
+
.notice-detail-page {
|
|
246
|
+
padding: 0 0 20px;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.notice-article {
|
|
250
|
+
padding: 28px 20px 42px;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.article-meta {
|
|
254
|
+
gap: 8px 28px;
|
|
255
|
+
font-size: 15px;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.article-content {
|
|
259
|
+
font-size: 17px;
|
|
260
|
+
line-height: 1.9;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.article-content h2 {
|
|
264
|
+
font-size: 18px;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
</style>
|