final

Change-Id: Icf4ec3950a6bd1e066fa4a1976af36721af62a06
diff --git a/front/src/AppealPage.js b/front/src/AppealPage.js
index dfbe307..0f168c3 100644
--- a/front/src/AppealPage.js
+++ b/front/src/AppealPage.js
@@ -1,5 +1,6 @@
 import React, { useState, useEffect } from "react";
 import { API_BASE_URL } from "./config";
+import "./AppealPage.css";
 
 // State for appeals fetched from backend
 export default function AppealPage() {
@@ -30,8 +31,8 @@
         fetchAppeals();
     }, []);
 
-    if (loading) return <div>加载中...</div>;
-    if (error) return <div>加载失败:{error}</div>;
+    if (loading) return <div className="appeal-loading">加载中...</div>;
+    if (error) return <div className="appeal-error">加载失败:{error}</div>;
     const selectedAppeal = appeals.find(a => a.appealid === selectedId) || {};
 
     // Approve selected appeal and refresh
@@ -66,34 +67,25 @@
     };
 
     return (
-        <div style={{ display: "flex", minHeight: "100vh", background: "#f7faff" }}>
+        <div className="appeal-page-container">
             {/* 侧栏 */}
-            <div style={{ width: 180, background: "#fff", borderRight: "1px solid #e0e7ff", padding: 0 }}>
-                <h3 style={{ textAlign: "center", padding: "18px 0 0 0", color: "#1976d2" }}>申诉列表</h3>
-                <div style={{ display: "flex", flexDirection: "column", gap: 12, marginTop: 18 }}>
+            <div className="appeal-sidebar">
+                <h3 className="appeal-sidebar-title">申诉列表</h3>
+                <div className="appeal-list-container">
                     {appeals.map(a => (
                         <div
                             key={a.appealid}
                             onClick={() => setSelectedId(a.appealid)}
-                            style={{
-                                margin: "0 12px",
-                                padding: "16px 10px",
-                                borderRadius: 8,
-                                background: selectedId === a.appealid ? "#e3f2fd" : "#fff",
-                                border: `2px solid ${a.status === 1 || a.status === 2 ? "#43a047" : "#e53935"}`,
-                                color: a.status === 1 || a.status === 2 ? "#43a047" : "#e53935",
-                                fontWeight: 600,
-                                cursor: "pointer",
-                                boxShadow: selectedId === a.appealid ? "0 2px 8px #b2d8ea" : "none",
-                                transition: "all 0.2s"
-                            }}
+                            className={`appeal-list-item ${
+                                selectedId === a.appealid ? 'selected' : ''
+                            } ${
+                                a.status === 1 || a.status === 2 ? 'approved' : 'pending'
+                            }`}
                         >
                             {a.user.username}
-                            <span style={{
-                                float: "right",
-                                fontSize: 12,
-                                color: a.status === 1 || a.status === 2 ? "#43a047" : "#e53935"
-                            }}>
+                            <span className={`appeal-status-label ${
+                                a.status === 1 || a.status === 2 ? 'approved' : 'pending'
+                            }`}>
                                 {a.status === 1 || a.status === 2 ? "已审核" : "未审核"}
                             </span>
                         </div>
@@ -101,52 +93,34 @@
                 </div>
             </div>
             {/* 申诉详情 */}
-            <div style={{ flex: 1, padding: "40px 48px" }}>
-                <h2 style={{ marginBottom: 24, color: "#1976d2" }}>申诉详情</h2>
-                <div style={{ background: "#fff", borderRadius: 12, padding: 32, boxShadow: "0 2px 8px #e0e7ff", marginBottom: 32 }}>
-                    <div style={{ marginBottom: 18 }}>
+            <div className="appeal-main-content">
+                <h2 className="appeal-detail-title">申诉详情</h2>
+                <div className="appeal-detail-card">
+                    <div className="appeal-detail-item">
                         <b>申诉ID:</b>{selectedAppeal.appealid}
                     </div>
-                    <div style={{ marginBottom: 18 }}>
+                    <div className="appeal-detail-item">
                         <b>用户ID:</b>{selectedAppeal.user.userid}
                     </div>
-                    <div style={{ marginBottom: 18 }}>
+                    <div className="appeal-detail-item">
                         <b>申诉内容:</b>{selectedAppeal.content}
                     </div>
-                    <div style={{ marginBottom: 18 }}>
+                    <div className="appeal-detail-item">
                         <b>申诉文件:</b>
                         <FileViewer url={selectedAppeal.fileURL} />
                     </div>
                 </div>
                 {/* 审核按钮 */}
-                <div style={{ display: "flex", gap: 32, justifyContent: "center" }}>
+                <div className="appeal-buttons-container">
                     <button
-                        style={{
-                            background: selectedAppeal.status === 1 ? "#bdbdbd" : "#43a047",
-                            color: "#fff",
-                            border: "none",
-                            borderRadius: 8,
-                            padding: "10px 38px",
-                            fontWeight: 600,
-                            fontSize: 18,
-                            cursor: selectedAppeal.status === 1 ? "not-allowed" : "pointer"
-                        }}
+                        className={`appeal-btn appeal-btn-approve`}
                         disabled={selectedAppeal.status === 1}
                         onClick={handleApprove}
                     >
                         通过
                     </button>
                     <button
-                        style={{
-                            background: selectedAppeal.status === 1 ? "#bdbdbd" : "#e53935",
-                            color: "#fff",
-                            border: "none",
-                            borderRadius: 8,
-                            padding: "10px 38px",
-                            fontWeight: 600,
-                            fontSize: 18,
-                            cursor: selectedAppeal.status === 1 ? "not-allowed" : "pointer"
-                        }}
+                        className={`appeal-btn appeal-btn-reject`}
                         disabled={selectedAppeal.status === 1}
                         onClick={handleReject}
                     >
@@ -163,15 +137,15 @@
     if (!url) return <div>无附件</div>;
     if (url.endsWith(".pdf")) {
         return (
-            <iframe
-                src={url}
-                title="PDF预览"
-                width="100%"
-                height="400px"
-                style={{ border: "1px solid #ccc", borderRadius: 8 }}
-            />
+            <div className="file-viewer-container">
+                <iframe
+                    src={url}
+                    title="PDF预览"
+                    className="file-viewer-iframe"
+                />
+            </div>
         );
     }
     // 这里只做PDF示例,实际可扩展为DOC等
-    return <a href={url} target="_blank" rel="noopener noreferrer">下载附件</a>;
+    return <a href={url} target="_blank" rel="noopener noreferrer" className="file-download-link">下载附件</a>;
 }
\ No newline at end of file