通知中心优化
This commit is contained in:
		
							parent
							
								
									5933289d6e
								
							
						
					
					
						commit
						70cdc6fea4
					
				
							
								
								
									
										312
									
								
								app/static/css/announcement-list.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										312
									
								
								app/static/css/announcement-list.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,312 @@
 | 
			
		||||
/* Fresh & Vibrant Style for Announcement List */
 | 
			
		||||
 | 
			
		||||
:root {
 | 
			
		||||
    --mint-green: #A8E6CF;
 | 
			
		||||
    --pale-yellow: #FFD3B6;
 | 
			
		||||
    --coral-pink: #FFAAA5;
 | 
			
		||||
    --sky-blue: #BDE4F4;
 | 
			
		||||
    --clean-white: #FFFFFF;
 | 
			
		||||
    --bright-orange: #FF8C69; /* Emphasis for buttons/key info */
 | 
			
		||||
    --lemon-yellow: #FFFACD;
 | 
			
		||||
 | 
			
		||||
    --text-dark: #424242;
 | 
			
		||||
    --text-medium: #616161; /* Slightly darker medium for better contrast */
 | 
			
		||||
    --text-light: #888888; /* Adjusted light text */
 | 
			
		||||
 | 
			
		||||
    --font-title: 'Poppins', sans-serif;
 | 
			
		||||
    --font-body: 'Nunito Sans', sans-serif;
 | 
			
		||||
 | 
			
		||||
    --card-shadow: 0 5px 18px rgba(0, 0, 0, 0.07);
 | 
			
		||||
    --card-hover-shadow: 0 8px 25px rgba(0, 0, 0, 0.12);
 | 
			
		||||
    --border-radius-main: 16px; /* Slightly larger radius for a softer look */
 | 
			
		||||
    --border-radius-small: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Apply base font and background to body (likely in base.css) */
 | 
			
		||||
body {
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    background-color: #fcfdfe; /* Very light off-white, almost white */
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    line-height: 1.65;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-container {
 | 
			
		||||
    padding: 25px 30px;
 | 
			
		||||
    max-width: 960px;
 | 
			
		||||
    margin: 25px auto;
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
    border-radius: var(--border-radius-main);
 | 
			
		||||
    /* Optional: Subtle gradient background for the container itself */
 | 
			
		||||
    /* background-image: linear-gradient(to bottom right, #f0f9ff, #ffffff); */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.page-header {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    margin-bottom: 30px;
 | 
			
		||||
    padding-bottom: 20px;
 | 
			
		||||
    border-bottom: 1px solid #eef2f5; /* Softer border */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.page-header h1 {
 | 
			
		||||
    font-family: var(--font-title);
 | 
			
		||||
    font-size: 2.2rem;
 | 
			
		||||
    font-weight: 700;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
.page-icon { /* Icon for page title */
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    margin-right: 12px;
 | 
			
		||||
    font-size: 1.8rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Optional: Style for a "Create New" button if you add one */
 | 
			
		||||
.btn-fresh-create {
 | 
			
		||||
    background-color: var(--mint-green);
 | 
			
		||||
    color: #3a7c68; /* Darker mint for text */
 | 
			
		||||
    border: none;
 | 
			
		||||
    padding: 10px 20px;
 | 
			
		||||
    border-radius: 25px;
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    transition: all 0.3s ease;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
    box-shadow: 0 2px 8px rgba(168, 230, 207, 0.4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.btn-fresh-create:hover {
 | 
			
		||||
    background-color: #97e0c6;
 | 
			
		||||
    transform: translateY(-2px);
 | 
			
		||||
    box-shadow: 0 4px 12px rgba(168, 230, 207, 0.5);
 | 
			
		||||
}
 | 
			
		||||
.btn-fresh-create i {
 | 
			
		||||
    margin-right: 8px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.announcement-list {
 | 
			
		||||
    margin-top: 20px;
 | 
			
		||||
    display: grid;
 | 
			
		||||
    gap: 25px; /* Spacing between announcement items */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-item {
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
    border-radius: var(--border-radius-main);
 | 
			
		||||
    box-shadow: var(--card-shadow);
 | 
			
		||||
    padding: 25px 30px;
 | 
			
		||||
    position: relative; /* For pin-badge */
 | 
			
		||||
    transition: transform 0.25s ease-out, box-shadow 0.25s ease-out;
 | 
			
		||||
    overflow: hidden; /* If using pseudo-elements for borders */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-item:hover {
 | 
			
		||||
    transform: translateY(-5px) scale(1.01);
 | 
			
		||||
    box-shadow: var(--card-hover-shadow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-item.pinned {
 | 
			
		||||
    /* Use a top border or a more distinct background */
 | 
			
		||||
    border-top: 4px solid var(--mint-green);
 | 
			
		||||
    background-color: #f6fffb; /* Light mint */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pin-badge {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0px;
 | 
			
		||||
    right: 0px;
 | 
			
		||||
    background: linear-gradient(135deg, var(--mint-green), #8fdcc3);
 | 
			
		||||
    color: var(--clean-white);
 | 
			
		||||
    padding: 6px 15px 6px 20px;
 | 
			
		||||
    border-radius: 0 0 0 var(--border-radius-main); /* Creative corner */
 | 
			
		||||
    font-size: 0.8rem;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    box-shadow: -2px 2px 8px rgba(168, 230, 207, 0.3);
 | 
			
		||||
}
 | 
			
		||||
.pin-badge i {
 | 
			
		||||
    margin-right: 6px;
 | 
			
		||||
    font-size: 0.75rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: flex-start; /* Align date to top if title wraps */
 | 
			
		||||
    margin-bottom: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header h3 {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    font-size: 1.4rem; /* Slightly larger title */
 | 
			
		||||
    font-family: var(--font-title);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    line-height: 1.3;
 | 
			
		||||
    margin-right: 15px; /* Space between title and date */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header h3 a {
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    transition: color 0.2s ease;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header h3 a:hover {
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.date {
 | 
			
		||||
    color: var(--text-light);
 | 
			
		||||
    font-size: 0.85rem;
 | 
			
		||||
    font-weight: 400;
 | 
			
		||||
    white-space: nowrap; /* Prevent date from wrapping */
 | 
			
		||||
    padding-top: 3px; /* Align better with h3 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-preview {
 | 
			
		||||
    margin: 15px 0;
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    line-height: 1.7;
 | 
			
		||||
    font-size: 0.95rem;
 | 
			
		||||
    letter-spacing: 0.1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-footer {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    margin-top: 20px;
 | 
			
		||||
    padding-top: 15px;
 | 
			
		||||
    border-top: 1px solid #f0f4f7; /* Lighter separator */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.publisher {
 | 
			
		||||
    color: var(--text-light);
 | 
			
		||||
    font-size: 0.85rem;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
.publisher i {
 | 
			
		||||
    margin-right: 6px;
 | 
			
		||||
    color: var(--sky-blue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.read-more {
 | 
			
		||||
    color: var(--bright-orange);
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    display: inline-flex; /* Allows icon alignment and hover effects */
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    padding: 6px 12px;
 | 
			
		||||
    border-radius: 20px;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    transition: background-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.read-more:hover {
 | 
			
		||||
    background-color: var(--bright-orange);
 | 
			
		||||
    color: var(--clean-white);
 | 
			
		||||
    transform: translateX(3px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.read-more i {
 | 
			
		||||
    margin-left: 6px;
 | 
			
		||||
    transition: transform 0.2s ease-in-out;
 | 
			
		||||
}
 | 
			
		||||
/* .read-more:hover i {
 | 
			
		||||
    transform: translateX(4px);
 | 
			
		||||
} */ /* Handled by transform on .read-more now */
 | 
			
		||||
 | 
			
		||||
/* Pagination Styles (copied and adapted from previous for consistency) */
 | 
			
		||||
.pagination-container {
 | 
			
		||||
    margin-top: 40px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    list-style: none;
 | 
			
		||||
    padding-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item .page-link {
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
    border: 1px solid var(--pale-yellow);
 | 
			
		||||
    margin: 0 5px; /* Slightly more spacing */
 | 
			
		||||
    border-radius: 50%;
 | 
			
		||||
    width: 40px; /* Slightly larger */
 | 
			
		||||
    height: 40px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    font-size: 0.95rem;
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    transition: all 0.25s ease-in-out;
 | 
			
		||||
    box-shadow: 0 1px 3px rgba(0,0,0,0.05);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item .page-link:hover {
 | 
			
		||||
    background-color: var(--pale-yellow);
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    border-color: var(--coral-pink);
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    transform: translateY(-2px);
 | 
			
		||||
    box-shadow: 0 3px 8px rgba(255, 211, 182, 0.5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item.active .page-link {
 | 
			
		||||
    background-color: var(--coral-pink);
 | 
			
		||||
    border-color: var(--coral-pink);
 | 
			
		||||
    color: var(--clean-white);
 | 
			
		||||
    box-shadow: 0 4px 10px rgba(255, 170, 165, 0.6);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item.disabled .page-link {
 | 
			
		||||
    color: #cccccc;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    border-color: #eeeeee;
 | 
			
		||||
    pointer-events: none;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    padding: 60px 30px;
 | 
			
		||||
    background-color: #fffaf8; /* Very light coral/yellow tint */
 | 
			
		||||
    border-radius: var(--border-radius-main);
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    margin-top: 20px;
 | 
			
		||||
    box-shadow: var(--card-shadow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records-icon {
 | 
			
		||||
    width: 60px;
 | 
			
		||||
    height: 60px;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    opacity: 0.9;
 | 
			
		||||
}
 | 
			
		||||
/* Fallback for FontAwesome if SVG doesn't load or is removed */
 | 
			
		||||
.no-records .fas.fa-info-circle {
 | 
			
		||||
    font-size: 3.5rem;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    opacity: 0.8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records p {
 | 
			
		||||
    font-size: 1.15rem;
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
}
 | 
			
		||||
@ -1,130 +0,0 @@
 | 
			
		||||
.announcement-container {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.page-header {
 | 
			
		||||
    margin-bottom: 25px;
 | 
			
		||||
    border-bottom: 1px solid #e3e3e3;
 | 
			
		||||
    padding-bottom: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-list {
 | 
			
		||||
    margin-top: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-item {
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    box-shadow: 0 2px 5px rgba(0,0,0,0.05);
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    transition: transform 0.2s, box-shadow 0.2s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-item:hover {
 | 
			
		||||
    transform: translateY(-3px);
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-item.pinned {
 | 
			
		||||
    border-left: 4px solid #dc3545;
 | 
			
		||||
    background-color: #fff9f9;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pin-badge {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    right: 0;
 | 
			
		||||
    background-color: #dc3545;
 | 
			
		||||
    color: white;
 | 
			
		||||
    padding: 5px 10px;
 | 
			
		||||
    border-radius: 0 8px 0 8px;
 | 
			
		||||
    font-size: 0.8rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header h3 {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    font-size: 1.3rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header h3 a {
 | 
			
		||||
    color: #333;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-header h3 a:hover {
 | 
			
		||||
    color: #007bff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.date {
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-preview {
 | 
			
		||||
    margin: 15px 0;
 | 
			
		||||
    color: #495057;
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.announcement-footer {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    margin-top: 15px;
 | 
			
		||||
    padding-top: 15px;
 | 
			
		||||
    border-top: 1px solid #f1f1f1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.publisher {
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.read-more {
 | 
			
		||||
    color: #007bff;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    font-weight: 500;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.read-more i {
 | 
			
		||||
    margin-left: 5px;
 | 
			
		||||
    transition: transform 0.2s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.read-more:hover i {
 | 
			
		||||
    transform: translateX(3px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination-container {
 | 
			
		||||
    margin-top: 30px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    padding: 50px 20px;
 | 
			
		||||
    background-color: #f8f9fa;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records i {
 | 
			
		||||
    font-size: 3rem;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records p {
 | 
			
		||||
    font-size: 1.2rem;
 | 
			
		||||
}
 | 
			
		||||
@ -1,148 +1,338 @@
 | 
			
		||||
/* Fresh & Vibrant Style for Notifications */
 | 
			
		||||
 | 
			
		||||
:root {
 | 
			
		||||
    --mint-green: #A8E6CF;
 | 
			
		||||
    --pale-yellow: #FFD3B6;
 | 
			
		||||
    --coral-pink: #FFAAA5;
 | 
			
		||||
    --sky-blue: #BDE4F4;
 | 
			
		||||
    --clean-white: #FFFFFF;
 | 
			
		||||
    --bright-orange: #FF8C69; /* Emphasis for buttons/key info */
 | 
			
		||||
    --lemon-yellow: #FFFACD; /* Can be used for subtle highlights */
 | 
			
		||||
 | 
			
		||||
    --text-dark: #424242; /* Slightly softer than pure black */
 | 
			
		||||
    --text-medium: #757575;
 | 
			
		||||
    --text-light: #9E9E9E;
 | 
			
		||||
 | 
			
		||||
    --font-title: 'Poppins', sans-serif;
 | 
			
		||||
    --font-body: 'Nunito Sans', sans-serif;
 | 
			
		||||
 | 
			
		||||
    --card-shadow: 0 4px 15px rgba(0, 0, 0, 0.06);
 | 
			
		||||
    --card-hover-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
 | 
			
		||||
    --border-radius-main: 12px;
 | 
			
		||||
    --border-radius-small: 8px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Apply base font and background to body (likely in base.css, but good for context) */
 | 
			
		||||
body {
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    background-color: var(--clean-white); /* Or a very light tint like #FDFCFA */
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
    font-weight: 400;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notifications-container {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    padding: 25px 30px;
 | 
			
		||||
    max-width: 900px;
 | 
			
		||||
    margin: 20px auto;
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
    /* Optional: add a subtle pattern or a large soft circular gradient */
 | 
			
		||||
    /* background-image: linear-gradient(135deg, var(--mint-green) -20%, var(--clean-white) 30%); */
 | 
			
		||||
    border-radius: var(--border-radius-main);
 | 
			
		||||
   /* box-shadow: 0 10px 30px rgba(168, 230, 207, 0.2); */ /* Subtle shadow for container */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.page-header {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    margin-bottom: 25px;
 | 
			
		||||
    border-bottom: 1px solid #e3e3e3;
 | 
			
		||||
    padding-bottom: 15px;
 | 
			
		||||
    margin-bottom: 30px;
 | 
			
		||||
    padding-bottom: 20px;
 | 
			
		||||
    border-bottom: 1px solid #f0f0f0; /* Softer border */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-actions {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    gap: 10px;
 | 
			
		||||
.page-header h1 {
 | 
			
		||||
    font-family: var(--font-title);
 | 
			
		||||
    font-size: 2rem; /* Slightly larger */
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Fresh Action Button Style */
 | 
			
		||||
.btn-fresh-action {
 | 
			
		||||
    background-color: var(--bright-orange);
 | 
			
		||||
    color: var(--clean-white);
 | 
			
		||||
    border: none;
 | 
			
		||||
    padding: 10px 20px;
 | 
			
		||||
    border-radius: 25px; /* Pill shape */
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    transition: all 0.3s ease;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
    box-shadow: 0 2px 8px rgba(255, 140, 105, 0.3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.btn-fresh-action:hover {
 | 
			
		||||
    background-color: #ff7b5a; /* Slightly darker orange */
 | 
			
		||||
    color: var(--clean-white);
 | 
			
		||||
    transform: translateY(-2px);
 | 
			
		||||
    box-shadow: 0 4px 12px rgba(255, 140, 105, 0.4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.btn-fresh-action i {
 | 
			
		||||
    margin-right: 8px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.filter-tabs {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    border-bottom: 1px solid #dee2e6;
 | 
			
		||||
    margin-bottom: 25px;
 | 
			
		||||
    gap: 10px;
 | 
			
		||||
    /* border-bottom: 2px solid var(--pale-yellow); */ /* Optional subtle line */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.filter-tab {
 | 
			
		||||
    padding: 10px 20px;
 | 
			
		||||
    color: #495057;
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    border-bottom: 2px solid transparent;
 | 
			
		||||
    font-weight: 500;
 | 
			
		||||
    border-radius: var(--border-radius-small); /* Rounded tabs */
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    font-size: 0.95rem;
 | 
			
		||||
    transition: all 0.3s ease;
 | 
			
		||||
    border-bottom: 3px solid transparent; /* Underline effect for active */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.filter-tab:hover {
 | 
			
		||||
    color: #007bff;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    background-color: rgba(255, 170, 165, 0.1); /* Light coral tint on hover */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.filter-tab.active {
 | 
			
		||||
    color: #007bff;
 | 
			
		||||
    border-bottom-color: #007bff;
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    border-bottom-color: var(--coral-pink);
 | 
			
		||||
    /* background-color: var(--coral-pink); */
 | 
			
		||||
    /* color: var(--clean-white); */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notifications-list {
 | 
			
		||||
    margin-top: 20px;
 | 
			
		||||
    display: grid;
 | 
			
		||||
    gap: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-card {
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    box-shadow: 0 2px 5px rgba(0,0,0,0.05);
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
    transition: transform 0.2s, box-shadow 0.2s;
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
    border-radius: var(--border-radius-main);
 | 
			
		||||
    box-shadow: var(--card-shadow);
 | 
			
		||||
    padding: 20px 25px;
 | 
			
		||||
    transition: transform 0.25s ease, box-shadow 0.25s ease;
 | 
			
		||||
    display: flex; /* For icon alignment */
 | 
			
		||||
    align-items: flex-start; /* Align icon to top of content */
 | 
			
		||||
    gap: 15px;
 | 
			
		||||
    border-left: 5px solid transparent; /* Placeholder for unread state */
 | 
			
		||||
}
 | 
			
		||||
.notification-icon-area {
 | 
			
		||||
    font-size: 1.5rem;
 | 
			
		||||
    color: var(--sky-blue);
 | 
			
		||||
    padding-top: 5px; /* Align with title */
 | 
			
		||||
}
 | 
			
		||||
.notification-card.unread .notification-icon-area {
 | 
			
		||||
    color: var(--mint-green);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.notification-card:hover {
 | 
			
		||||
    transform: translateY(-2px);
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
 | 
			
		||||
    transform: translateY(-4px);
 | 
			
		||||
    box-shadow: var(--card-hover-shadow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-card.unread {
 | 
			
		||||
    border-left: 4px solid #007bff;
 | 
			
		||||
    background-color: #f8fbff;
 | 
			
		||||
    border-left-color: var(--mint-green);
 | 
			
		||||
    background-color: #f6fffb; /* Very light mint */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-content {
 | 
			
		||||
    flex-grow: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-title {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    margin-top: 0;
 | 
			
		||||
    margin-bottom: 10px;
 | 
			
		||||
    font-size: 1.2rem;
 | 
			
		||||
    margin-bottom: 8px;
 | 
			
		||||
    font-size: 1.15rem; /* Adjusted size */
 | 
			
		||||
    font-family: var(--font-title);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-title a {
 | 
			
		||||
    color: #333;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    transition: color 0.2s ease;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-title a:hover {
 | 
			
		||||
    color: #007bff;
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.unread-badge {
 | 
			
		||||
    background-color: #007bff;
 | 
			
		||||
    background-color: var(--bright-orange);
 | 
			
		||||
    color: white;
 | 
			
		||||
    font-size: 0.75rem;
 | 
			
		||||
    padding: 2px 8px;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    font-size: 0.7rem;
 | 
			
		||||
    padding: 4px 10px;
 | 
			
		||||
    border-radius: 15px; /* Pill shape */
 | 
			
		||||
    margin-left: 10px;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    letter-spacing: 0.5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-text {
 | 
			
		||||
    color: #495057;
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
    line-height: 1.5;
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
    letter-spacing: 0.2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-meta {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
    font-size: 0.85rem;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    color: var(--text-light);
 | 
			
		||||
    font-size: 0.8rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-type {
 | 
			
		||||
    background-color: #f1f1f1;
 | 
			
		||||
    padding: 2px 8px;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    background-color: var(--sky-blue); /* Sky Blue for type */
 | 
			
		||||
    color: #3E84A8; /* Darker text for contrast on sky blue */
 | 
			
		||||
    padding: 3px 10px;
 | 
			
		||||
    border-radius: var(--border-radius-small);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-time {
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Pagination */
 | 
			
		||||
.pagination-container {
 | 
			
		||||
    margin-top: 30px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    list-style: none;
 | 
			
		||||
    padding-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item .page-link {
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
    border: 1px solid var(--pale-yellow);
 | 
			
		||||
    margin: 0 4px;
 | 
			
		||||
    border-radius: 50%; /* Circular pagination items */
 | 
			
		||||
    width: 36px;
 | 
			
		||||
    height: 36px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
    transition: all 0.2s ease-in-out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item .page-link:hover {
 | 
			
		||||
    background-color: var(--pale-yellow);
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    border-color: var(--coral-pink);
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item.active .page-link {
 | 
			
		||||
    background-color: var(--coral-pink);
 | 
			
		||||
    border-color: var(--coral-pink);
 | 
			
		||||
    color: var(--clean-white);
 | 
			
		||||
    box-shadow: 0 2px 5px rgba(255, 170, 165, 0.5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.pagination .page-item.disabled .page-link {
 | 
			
		||||
    color: #ccc;
 | 
			
		||||
    background-color: #f8f8f8;
 | 
			
		||||
    border-color: #eee;
 | 
			
		||||
    pointer-events: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.no-records {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    padding: 50px 20px;
 | 
			
		||||
    background-color: #f8f9fa;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
    background-color: #fafffd; /* Very light mint/yellow mix */
 | 
			
		||||
    border-radius: var(--border-radius-main);
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    margin-top: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-records i {
 | 
			
		||||
    font-size: 3rem;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
.no-records-icon { /* Style for the inline SVG */
 | 
			
		||||
    width: 60px;
 | 
			
		||||
    height: 60px;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    opacity: 0.8;
 | 
			
		||||
}
 | 
			
		||||
/* If using Font Awesome for no-records icon: */
 | 
			
		||||
.no-records .fas.fa-bell-slash {
 | 
			
		||||
    font-size: 3.5rem;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    color: var(--mint-green);
 | 
			
		||||
    opacity: 0.7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.no-records p {
 | 
			
		||||
    font-size: 1.2rem;
 | 
			
		||||
    font-size: 1.1rem;
 | 
			
		||||
    font-family: var(--font-body);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 通知下拉菜单样式 */
 | 
			
		||||
/* Notification Dropdown Styles (assuming this is for a navbar dropdown or similar) */
 | 
			
		||||
/* These are kept minimal as the main focus was the page content */
 | 
			
		||||
.notification-dropdown {
 | 
			
		||||
    width: 320px;
 | 
			
		||||
    width: 350px; /* Wider for more content */
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    max-height: 400px;
 | 
			
		||||
    max-height: 450px;
 | 
			
		||||
    overflow-y: auto;
 | 
			
		||||
    border-radius: var(--border-radius-small);
 | 
			
		||||
    box-shadow: 0 5px 25px rgba(0,0,0,0.1);
 | 
			
		||||
    background-color: var(--clean-white);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-header {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    padding: 0.5rem 1rem;
 | 
			
		||||
    padding: 12px 15px;
 | 
			
		||||
    background-color: var(--pale-yellow); /* Light yellow header */
 | 
			
		||||
    border-bottom: 1px solid #f0e0d0;
 | 
			
		||||
}
 | 
			
		||||
.notification-header h5 {
 | 
			
		||||
    margin:0;
 | 
			
		||||
    font-family: var(--font-title);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.mark-all-read {
 | 
			
		||||
.mark-all-read { /* Link in dropdown header */
 | 
			
		||||
    font-size: 0.8rem;
 | 
			
		||||
    color: #007bff;
 | 
			
		||||
    color: var(--coral-pink);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
.mark-all-read:hover {
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-items {
 | 
			
		||||
@ -151,38 +341,61 @@
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-item {
 | 
			
		||||
    padding: 10px 15px;
 | 
			
		||||
    border-bottom: 1px solid #f1f1f1;
 | 
			
		||||
    padding: 12px 15px;
 | 
			
		||||
    border-bottom: 1px solid #f5f5f5;
 | 
			
		||||
    transition: background-color 0.2s ease;
 | 
			
		||||
}
 | 
			
		||||
.notification-item:last-child {
 | 
			
		||||
    border-bottom: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-item:hover {
 | 
			
		||||
    background-color: var(--mint-green-light, #e6f7f0); /* Very light mint on hover */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-item.unread {
 | 
			
		||||
    background-color: #f8fbff;
 | 
			
		||||
    background-color: #fff8f0; /* Very light orange/yellow for unread in dropdown */
 | 
			
		||||
    border-left: 3px solid var(--bright-orange);
 | 
			
		||||
    padding-left: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-content h6 {
 | 
			
		||||
.notification-item .notification-content h6 { /* Assuming title in dropdown is h6 */
 | 
			
		||||
    margin-bottom: 5px;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
    font-family: var(--font-title);
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: var(--text-dark);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-text {
 | 
			
		||||
.notification-item .notification-text { /* Text snippet in dropdown */
 | 
			
		||||
    font-size: 0.8rem;
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    margin-bottom: 5px;
 | 
			
		||||
    line-height: 1.4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notification-time {
 | 
			
		||||
.notification-item .notification-time {
 | 
			
		||||
    font-size: 0.75rem;
 | 
			
		||||
    color: #999;
 | 
			
		||||
    color: var(--text-light);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.view-all {
 | 
			
		||||
.view-all { /* Footer link in dropdown */
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    font-weight: 500;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    padding: 12px 15px;
 | 
			
		||||
    display: block;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    color: var(--bright-orange);
 | 
			
		||||
    background-color: #fffaf5;
 | 
			
		||||
    transition: background-color 0.2s ease;
 | 
			
		||||
}
 | 
			
		||||
.view-all:hover {
 | 
			
		||||
    background-color: var(--pale-yellow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-notifications {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
.no-notifications { /* Message in empty dropdown */
 | 
			
		||||
    padding: 25px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    color: #6c757d;
 | 
			
		||||
    color: var(--text-medium);
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,13 +3,20 @@
 | 
			
		||||
{% block title %}通知公告 - 图书管理系统{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block head %}
 | 
			
		||||
<link rel="preconnect" href="https://fonts.googleapis.com">
 | 
			
		||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
 | 
			
		||||
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&family=Nunito+Sans:wght@400;600&display=swap" rel="stylesheet">
 | 
			
		||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/announcement-list.css') }}">
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="announcement-container">
 | 
			
		||||
    <div class="page-header">
 | 
			
		||||
        <h1>通知公告</h1>
 | 
			
		||||
        <h1><i class="fas fa-bullhorn page-icon"></i> 通知公告</h1>
 | 
			
		||||
        {# Optional: Add a create button if applicable for admins #}
 | 
			
		||||
        {# <a href="{{ url_for('announcement.create_announcement') }}" class="btn btn-fresh-create">
 | 
			
		||||
            <i class="fas fa-plus"></i> 发布新公告
 | 
			
		||||
        </a> #}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="announcement-list">
 | 
			
		||||
@ -18,19 +25,24 @@
 | 
			
		||||
                <div class="announcement-item {% if announcement.is_top %}pinned{% endif %}">
 | 
			
		||||
                    {% if announcement.is_top %}
 | 
			
		||||
                    <div class="pin-badge">
 | 
			
		||||
                        <i class="fas fa-thumbtack"></i> 置顶
 | 
			
		||||
                        <i class="fas fa-thumbtack"></i> 置顶推荐
 | 
			
		||||
                    </div>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                    <div class="announcement-header">
 | 
			
		||||
                        <h3><a href="{{ url_for('announcement.announcement_detail', announcement_id=announcement.id) }}">{{ announcement.title }}</a></h3>
 | 
			
		||||
                        <span class="date">{{ announcement.created_at }}</span>
 | 
			
		||||
                        <span class="date">{{ announcement.created_at.strftime('%Y年%m月%d日') }}</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="announcement-preview">
 | 
			
		||||
                        {{ announcement.content|striptags|truncate(150) }}
 | 
			
		||||
                        {{ announcement.content|striptags|truncate(130) }}
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="announcement-footer">
 | 
			
		||||
                        <span class="publisher">发布者: {{ announcement.publisher.username if announcement.publisher else '系统' }}</span>
 | 
			
		||||
                        <a href="{{ url_for('announcement.announcement_detail', announcement_id=announcement.id) }}" class="read-more">阅读更多 <i class="fas fa-arrow-right"></i></a>
 | 
			
		||||
                        <span class="publisher">
 | 
			
		||||
                            <i class="fas fa-user-circle"></i>
 | 
			
		||||
                            发布者: {{ announcement.publisher.username if announcement.publisher else '系统管理员' }}
 | 
			
		||||
                        </span>
 | 
			
		||||
                        <a href="{{ url_for('announcement.announcement_detail', announcement_id=announcement.id) }}" class="read-more">
 | 
			
		||||
                            阅读全文 <i class="fas fa-arrow-right"></i>
 | 
			
		||||
                        </a>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
@ -54,7 +66,7 @@
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
 | 
			
		||||
                        {% for page_num in pagination.iter_pages(left_edge=2, right_edge=2, left_current=2, right_current=2) %}
 | 
			
		||||
                        {% for page_num in pagination.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=1) %}
 | 
			
		||||
                            {% if page_num %}
 | 
			
		||||
                                {% if page_num == pagination.page %}
 | 
			
		||||
                                <li class="page-item active">
 | 
			
		||||
@ -91,8 +103,8 @@
 | 
			
		||||
            </div>
 | 
			
		||||
        {% else %}
 | 
			
		||||
            <div class="no-records">
 | 
			
		||||
                <i class="fas fa-info-circle"></i>
 | 
			
		||||
                <p>目前没有通知公告</p>
 | 
			
		||||
                 <img src="data:image/svg+xml;charset=UTF-8,%3csvg width='80' height='80' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM13 17H11V15H13V17ZM13 13H11V7H13V13Z' fill='%23FFAAA5'/%3e%3c/svg%3e" alt="No announcements icon" class="no-records-icon">
 | 
			
		||||
                <p>暂时还没有新的通知公告哦,敬请期待!</p>
 | 
			
		||||
            </div>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </div>
 | 
			
		||||
@ -100,5 +112,6 @@
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block scripts %}
 | 
			
		||||
<script src="{{ url_for('static', filename='js/announcement-list.js') }}"></script>
 | 
			
		||||
{# <script src="{{ url_for('static', filename='js/announcement-list.js') }}"></script> #}
 | 
			
		||||
{# Assuming announcement-list.js is for interactivity not directly tied to styling #}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,9 @@
 | 
			
		||||
{% block title %}我的通知 - 图书管理系统{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block head %}
 | 
			
		||||
<link rel="preconnect" href="https://fonts.googleapis.com">
 | 
			
		||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
 | 
			
		||||
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&family=Nunito+Sans:wght@400;600&display=swap" rel="stylesheet">
 | 
			
		||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/notifications.css') }}">
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@ -12,7 +15,7 @@
 | 
			
		||||
        <h1>我的通知</h1>
 | 
			
		||||
        <div class="notification-actions">
 | 
			
		||||
            {% if pagination.items and not (unread_only and pagination.total == 0) %}
 | 
			
		||||
                <a href="{{ url_for('announcement.mark_all_as_read') }}" class="btn btn-outline-primary">
 | 
			
		||||
                <a href="{{ url_for('announcement.mark_all_as_read') }}" class="btn btn-fresh-action">
 | 
			
		||||
                    <i class="fas fa-check-double"></i> 全部标为已读
 | 
			
		||||
                </a>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
@ -28,6 +31,14 @@
 | 
			
		||||
        {% if pagination.items %}
 | 
			
		||||
            {% for notification in pagination.items %}
 | 
			
		||||
                <div class="notification-card {% if notification.status == 0 %}unread{% endif %}">
 | 
			
		||||
                    <div class="notification-icon-area">
 | 
			
		||||
                        <!-- Example: could use different icons based on notification.type -->
 | 
			
		||||
                        {% if notification.status == 0 %}
 | 
			
		||||
                            <i class="fas fa-envelope"></i> {# Icon for unread #}
 | 
			
		||||
                        {% else %}
 | 
			
		||||
                            <i class="fas fa-envelope-open-text"></i> {# Icon for read #}
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="notification-content">
 | 
			
		||||
                        <h3 class="notification-title">
 | 
			
		||||
                            <a href="{{ url_for('announcement.view_notification', notification_id=notification.id) }}">{{ notification.title }}</a>
 | 
			
		||||
@ -35,7 +46,7 @@
 | 
			
		||||
                                <span class="unread-badge">未读</span>
 | 
			
		||||
                            {% endif %}
 | 
			
		||||
                        </h3>
 | 
			
		||||
                        <div class="notification-text">{{ notification.content|striptags|truncate(150) }}</div>
 | 
			
		||||
                        <div class="notification-text">{{ notification.content|striptags|truncate(120) }}</div>
 | 
			
		||||
                        <div class="notification-meta">
 | 
			
		||||
                            <span class="notification-type">{{ notification.type }}</span>
 | 
			
		||||
                            <span class="notification-time">{{ notification.created_at.strftime('%Y-%m-%d %H:%M') }}</span>
 | 
			
		||||
@ -63,7 +74,7 @@
 | 
			
		||||
                        </li>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
 | 
			
		||||
                        {% for page_num in pagination.iter_pages(left_edge=2, right_edge=2, left_current=2, right_current=2) %}
 | 
			
		||||
                        {% for page_num in pagination.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=1) %}
 | 
			
		||||
                            {% if page_num %}
 | 
			
		||||
                                {% if page_num == pagination.page %}
 | 
			
		||||
                                <li class="page-item active">
 | 
			
		||||
@ -100,8 +111,9 @@
 | 
			
		||||
            </div>
 | 
			
		||||
        {% else %}
 | 
			
		||||
            <div class="no-records">
 | 
			
		||||
                <i class="fas fa-bell-slash"></i>
 | 
			
		||||
                <p>{{ '暂无未读通知' if unread_only else '暂无通知' }}</p>
 | 
			
		||||
                {# Suggestion: Use a more vibrant/friendly icon or illustration #}
 | 
			
		||||
                <img src="data:image/svg+xml;charset=UTF-8,%3csvg width='80' height='80' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z' stroke='%23A8E6CF' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M12 16.5C12.9665 16.5 13.75 15.7165 13.75 14.75C13.75 13.7835 12.9665 13 12 13C11.0335 13 10.25 13.7835 10.25 14.75C10.25 15.7165 11.0335 16.5 12 16.5Z' fill='%23A8E6CF'/%3e%3cpath d='M12 7V10' stroke='%23A8E6CF' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e" alt="No notifications icon" class="no-records-icon">
 | 
			
		||||
                <p>{{ '还没有未读通知哦~' if unread_only else '这里空空如也,暂时没有新通知。' }}</p>
 | 
			
		||||
            </div>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
    </div>
 | 
			
		||||
@ -109,5 +121,6 @@
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block scripts %}
 | 
			
		||||
<script src="{{ url_for('static', filename='js/notifications.js') }}"></script>
 | 
			
		||||
{# <script src="{{ url_for('static', filename='js/notifications.js') }}"></script> #}
 | 
			
		||||
{# Assuming notifications.js is for interactivity not directly tied to styling #}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user