tahamajs/IE / Projects /report /presentation_report.html
tahamajs's picture
download
raw
21.7 kB
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>گزارش جامع ارائه پروژه Research Platform 2.0</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css">
<style>
@page {
size: A4;
margin: 20mm 15mm 20mm 15mm;
@bottom-center {
content: "صفحه " counter(page) " از " counter(pages);
font-family: 'Vazirmatn', sans-serif;
font-size: 9pt;
color: #64748b;
}
}
* {
box-sizing: border-box;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
body {
font-family: 'Vazirmatn', 'Segoe UI', Tahoma, sans-serif;
background-color: #ffffff;
color: #1e293b;
line-height: 1.8;
font-size: 11pt;
margin: 0;
padding: 0;
}
.header-container {
background: linear-gradient(135deg, #0f172a 0%, #1e1b4b 50%, #311b92 100%);
color: #ffffff;
padding: 35px 30px;
border-radius: 12px;
margin-bottom: 35px;
box-shadow: 0 10px 25px rgba(0,0,0,0.15);
text-align: center;
}
.header-container h1 {
font-size: 24pt;
margin: 0 0 10px 0;
font-weight: 800;
color: #38bdf8;
letter-spacing: -0.5px;
}
.header-container .subtitle {
font-size: 13pt;
color: #e2e8f0;
margin-bottom: 20px;
font-weight: 300;
}
.meta-badges {
display: flex;
justify-content: center;
gap: 12px;
flex-wrap: wrap;
}
.badge {
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(5px);
padding: 5px 14px;
border-radius: 20px;
font-size: 9.5pt;
border: 1px solid rgba(255, 255, 255, 0.2);
color: #f8fafc;
}
h2 {
color: #1e1b4b;
font-size: 16pt;
border-right: 5px solid #4f46e5;
padding-right: 12px;
margin-top: 35px;
margin-bottom: 18px;
font-weight: 700;
page-break-after: avoid;
}
h3 {
color: #334155;
font-size: 13pt;
margin-top: 25px;
margin-bottom: 12px;
font-weight: 700;
page-break-after: avoid;
}
p, li {
text-align: justify;
color: #334155;
}
ul, ol {
padding-right: 22px;
margin-bottom: 18px;
}
li {
margin-bottom: 8px;
}
.tech-table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
font-size: 10pt;
background: #ffffff;
box-shadow: 0 2px 8px rgba(0,0,0,0.06);
border-radius: 8px;
overflow: hidden;
page-break-inside: avoid;
}
.tech-table th {
background-color: #1e1b4b;
color: #ffffff;
padding: 12px 14px;
text-align: right;
font-weight: 700;
}
.tech-table td {
padding: 10px 14px;
border-bottom: 1px solid #e2e8f0;
}
.tech-table tr:nth-child(even) {
background-color: #f8fafc;
}
.code-block {
background-color: #0f172a;
color: #f8fafc;
padding: 16px;
border-radius: 8px;
font-family: 'Courier New', Courier, monospace;
font-size: 9.5pt;
direction: ltr;
text-align: left;
overflow-x: auto;
margin: 18px 0;
border-left: 4px solid #38bdf8;
line-height: 1.5;
page-break-inside: avoid;
}
.callout {
background-color: #f0f9ff;
border-right: 4px solid #0284c7;
padding: 16px;
border-radius: 6px;
margin: 20px 0;
page-break-inside: avoid;
}
.callout-title {
font-weight: 700;
color: #0369a1;
margin-bottom: 6px;
font-size: 11pt;
}
.slide-card {
background: #f8fafc;
border: 1px solid #cbd5e1;
border-radius: 8px;
padding: 18px;
margin-bottom: 18px;
page-break-inside: avoid;
}
.slide-title {
font-weight: 800;
color: #4338ca;
font-size: 12pt;
margin-bottom: 8px;
border-bottom: 1px solid #e2e8f0;
padding-bottom: 6px;
}
.qa-box {
background: #faf5ff;
border: 1px solid #e9d5ff;
border-radius: 8px;
padding: 16px;
margin-bottom: 18px;
page-break-inside: avoid;
}
.qa-question {
font-weight: 700;
color: #6b21a8;
margin-bottom: 8px;
}
.qa-answer {
color: #374151;
background: #ffffff;
padding: 12px;
border-radius: 6px;
border-right: 3px solid #9333ea;
}
.page-break {
page-break-before: always;
}
.footer-note {
text-align: center;
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid #e2e8f0;
color: #64748b;
font-size: 9pt;
}
</style>
</head>
<body>
<div class="header-container">
<h1>🎓 گزارش جامع ارائه پروژه Research Platform 2.0</h1>
<div class="subtitle">پلتفرم سازمانی پژوهش‌های علمی، داوری همتا، چت زنده و نگارش همزمان</div>
<div class="meta-badges">
<span class="badge">دانشگاه تهران - دانشکده مهندسی برق و کامپیوتر</span>
<span class="badge">درس: مهندسی اینترنت (IE)</span>
<span class="badge">تکنولوژی: Java 17 Spring Boot & React 18</span>
</div>
</div>
<h2>📌 ۱. معرفی کلی پروژه و اهداف سامانه</h2>
<p>
پروژه <strong>Research Platform 2.0</strong> یک اکوسیستم جامع تحت وب برای مدیریت مقالات علمی، داوری همتا (Peer Review)، پیام‌رسانی همزمان (Real-time WebSocket Chat) و ایجاد فضای همکاری علمی بین پژوهشگران است. این پلتفرم فراتر از مخازن سنتی مقالات عمل کرده و تمامی مراحل چرخه حیات تحقیق علمی را پوشش می‌دهد.
</p>
<ul>
<li><strong>کشف ادبیات و تحلیل شکاف علمی (AI Gap Analysis & RAG):</strong> تحلیل هوشمند مقالات علمی، خلاصه‌سازی متون و شناسایی حوزه‌های کم‌کارشده پژوهشی.</li>
<li><strong>نگارش همزمان و الگوریتم OT (Real-time Co-Authoring):</strong> قابلیت هم‌نویسی همزمان مقالات با الگوریتم Operational Transformation بر روی متون LaTeX.</li>
<li><strong>فرآیند کامل داوری همتا (Double-Blind Peer Review):</strong> چرخه مدیریت داوری دو سو کور مقاله و اتصال به سیستم استاندارد Open Journal Systems (OJS).</li>
<li><strong>پیام‌رسانی زنده (Real-time WebSocket Chat):</strong> چت دوتایی، چت گروهی، اعلام تایپ زنده (Typing Indicator) و پینگ ۳۰ ثانیه‌ای روی پورت ۹۰۹۳.</li>
<li><strong>موتور جستجوی سریع (Inverted Index):</strong> جستجوی متنی مقالات با الگوریتم TF-IDF در حافظه جهت پاسخ‌دهی زیر چند میلی‌ثانیه.</li>
<li><strong>فروشگاه ابزارهای ایزوله (Sandboxed Tools Store):</strong> پلتفرم ایزوله مبتنی بر iframe برای ساخت و اجرای ابزارهای توسعه‌دهندگان.</li>
<li><strong>مخزن داده‌های FAIR و Provenance:</strong> انتشار داده‌های پژوهشی مطابق اصول FAIR همراه با ردیابی منشأ داده (Data Provenance).</li>
</ul>
<h2>🏗️ ۲. معماری تفکیک‌شده سیستم و پشته فناوری</h2>
<p>
معماری سیستم بر پایه <strong>Decoupled Three-Tier System</strong> پیاده‌سازی شده تا بالاترین میزان مقیاس‌پذیری و امنیت فراهم شود.
</p>
<table class="tech-table">
<thead>
<tr>
<th>بخش</th>
<th>تکنولوژی</th>
<th>نسخه / جزئیات</th>
<th>نقش در سیستم</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Backend Core</strong></td>
<td>Java / Spring Boot</td>
<td>Java 17 LTS / Spring Boot 2.7.x</td>
<td>فریم‌ورک اصلی برای ساخت REST API و مدیریت دیتابیس</td>
</tr>
<tr>
<td><strong>Security</strong></td>
<td>Spring Security + JJWT</td>
<td>JWT (HMAC-SHA512) + BCrypt</td>
<td>احراز هویت دو لایه بی‌وضعیت و باوضعیت (SessionManager)</td>
</tr>
<tr>
<td><strong>Database ORM</strong></td>
<td>Spring Data JPA / Hibernate</td>
<td>MySQL 8.0 / SQLite / H2</td>
<td>نگاشت اشیا به دیتابیس‌های رابطه‌ای</td>
</tr>
<tr>
<td><strong>Real-time WS</strong></td>
<td>org.java_websocket</td>
<td>Port 9093 Custom Server</td>
<td>سرور سوکت مجزا برای چت زنده، تایپ و وضعیت آنلاین</td>
</tr>
<tr>
<td><strong>Frontend Core</strong></td>
<td>React + TypeScript + Vite</td>
<td>React 18.2 / Vite 5</td>
<td>اپلیکیشن تک‌صفحه‌ای (SPA) با مد تاریک مدرن Slate</td>
</tr>
<tr>
<td><strong>DevOps</strong></td>
<td>Docker & Docker Compose</td>
<td>Docker Engine 24+ / Nginx 1.27</td>
<td>کانتینری‌سازی فرانت‌اند، بک‌اند و پراکسی معکوس Nginx</td>
</tr>
<tr>
<td><strong>Developer CLI</strong></td>
<td>Go & Node.js</td>
<td>ie-cli (agent.go, commands.go)</td>
<td>ابزار خط فرمان اختصاصی جهت تست استرس و مانیتورینگ</td>
</tr>
<tr>
<td><strong>Observability</strong></td>
<td>OpenTelemetry, Prometheus, Grafana</td>
<td>Loki (Logs) & Tempo (Tracing)</td>
<td>پایپ‌لاین مانیتورینگ کارایی، ترِیس‌ها و لاگ‌های متمرکز</td>
</tr>
</tbody>
</table>
<div class="page-break"></div>
<h2>🗄️ ۳. ساختار دیتابیس و انتیتی‌ها (Database Schema)</h2>
<p>دیتابیس سیستم دارای انتیتی‌های اصلی زیر است که به صورت JPA Mappings مدلسازی شده‌اند:</p>
<ul>
<li><strong>User:</strong> شناسه، نام کاربری، ایمیل، کلمه عبور (هش BCrypt)، نقش کاربر (author, reader, moderator, admin)، ORCID، Google Scholar و تعداد دنبال‌کنندگان.</li>
<li><strong>Article:</strong> شناسه، عنوان، چکیده، متن مقاله، نام نویسنده، وضعیت مقاله (DRAFT, UNDER_REVIEW, PUBLISHED, REJECTED)، تعداد لایک و شناسه DOI.</li>
<li><strong>Comment:</strong> شناسه، شناسه مقاله، نام نویسنده، متن دیدگاه، تاریخ ثبت.</li>
<li><strong>Conversation & Message:</strong> گفتگوهای دوتایی، شناسه فرستنده و گیرنده، متن پیام، زمان ارسال و وضعیت خوانده شدن.</li>
<li><strong>GroupChat & GroupMessage:</strong> چت‌های گروهی پژوهشی، پیام‌های پین‌شده و اعضا.</li>
<li><strong>PeerReview:</strong> شناسه مقاله، نام داور، امتیاز (۱ تا ۵)، دیدگاه داور و تصمیم نهایی (ACCEPT, REJECT, REVISION).</li>
<li><strong>FairDataset:</strong> داده‌های پژوهشی مطابق اصول FAIR همراه با هش رمزنگاری منشأ داده (Provenance Hash).</li>
<li><strong>SandboxedTool:</strong> ابزارهای توسعه‌دهندگان به صورت ایزوله در iframe.</li>
</ul>
<h2>💻 ۴. تحلیل تفکیکی و عمیق کدها (Code Walkthrough)</h2>
<h3>الف) بخش امنیت و احراز هویت (Security & Auth)</h3>
<p>تولید توکن در <code>JwtTokenProvider.java</code> با کلید اختصاصی انجام می‌گیرد:</p>
<div class="code-block">
public String generateToken(Authentication authentication) {
UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal();
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);
return Jwts.builder()
.setSubject(userPrincipal.getUsername())
.setIssuedAt(new Date())
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, jwtSecret)
.compact();
}
</div>
<p>کلاس <code>SessionManager.java</code> جهت مدیریت جلسات فعال و جلوگیری از تداخل توکن‌های همزمان در تست‌های میلی‌ثانیه‌ای:</p>
<div class="code-block">
public synchronized void refreshToken(String oldToken, String newToken, String username) {
if (oldToken != null) {
tokenToUser.remove(oldToken);
}
tokenToUser.put(newToken, username);
}
</div>
<h3>ب) بخش سرور چت و ارتباطات زنده (WebSocket Engine)</h3>
<p>سرور سوکت در <code>ChatWebSocketServer.java</code> روی پورت 9093 ورودی‌ها را اعتبارسنجی می‌کند:</p>
<div class="code-block">
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
String token = extractToken(handshake);
if (token != null && sessionManager.isValidToken(token)) {
String username = sessionManager.getUsername(token);
manager.onOpen(conn, username);
} else {
conn.close(4001, "Unauthorized");
}
}
</div>
<h3>ج) نگارش همزمان متون با الگوریتم OT</h3>
<p>در <code>OperationalTransformationService.java</code> تداخل کاراکترهای همزمان اصلاح می‌شود:</p>
<div class="code-block">
public Operation transform(Operation opA, Operation opB) {
if (opA.isInsert() && opB.isInsert()) {
if (opA.getPosition() < opB.getPosition()) {
opB.setPosition(opB.getPosition() + opA.getText().length());
}
}
return opB;
}
</div>
<div class="page-break"></div>
<h2>🐞 ۵. باگ‌های کلیدی برطرف‌شده در پروژه (Key Technical Fixes)</h2>
<div class="callout">
<div class="callout-title">۱. رفع باگ تداخل توکن در تست‌های همزمان (401 Unauthorized)</div>
در اجرای همزمان تست‌های JUnit در یک میلی‌ثانیه، کلید توکن قدیمی و جدید یکسان می‌شد. با تغییر ترتیب حذف توکن قدیمی قبل از درج توکن جدید در <code>SessionManager</code>، این مشکل برطرف گردید.
</div>
<div class="callout">
<div class="callout-title">۲. همگام‌سازی اندپوینت‌های REST (خطای 404 Not Found)</div>
ایجاد <code>ConversationController</code> برای اندپوینت <code>/api/conversations</code> و اضافه کردن Alias در <code>NotificationController</code>.
</div>
<div class="callout">
<div class="callout-title">۳. رفع خطای آپلود آواتار (415 Unsupported Media Type)</div>
افزودن متد Overload شده با <code>Consumes(MediaType.MULTIPART_FORM_DATA_VALUE)</code> در کنترلر کاربر.
</div>
<div class="callout">
<div class="callout-title">۴. تنظیم وضعیت پاسخ حذف به 204 No Content</div>
تغییر کد وضعیت از 200 به 204 در تمامی متدهای DELETE مطابق با استاندارد REST.
</div>
<h2>📽️ ۶. راهنمای اسلاید به اسلاید ارائه (Slide-by-Slide Guide)</h2>
<div class="slide-card">
<div class="slide-title">🖼️ اسلاید ۱: عنوان و معرفی پلتفرم</div>
<strong>نکات گفتاری:</strong> "با سلام خدمت استاد گرامی و همکلاسی‌ها. امروز به معرفی پروژه Research Platform 2.0 می‌پردازیم؛ پلتفرم سازمانی برای مدیریت مقالات علمی، داوری همتا، نگارش همزمان و چت زنده."
</div>
<div class="slide-card">
<div class="slide-title">🖼️ اسلاید ۲: معماری سه‌لایه سیستم</div>
<strong>نکات گفتاری:</strong> "معماری سیستم بر پایه Three-Tier Decoupled است: React 18 در فرانت‌اند، Spring Boot در بک‌اند، دیتابیس MySQL 8، سرور سوکت مستقل روی پورت 9093 و پشته مانیتورینگ OpenTelemetry."
</div>
<div class="slide-card">
<div class="slide-title">🖼️ اسلاید ۳: احراز هویت دو لایه (Security)</div>
<strong>نکات گفتاری:</strong> "از ترکیب JWT بی‌وضعیت و SessionManager در حافظه استفاده کردیم تا علاوه بر سرعت، قابلیت ابطال فوری توکن و کنترل جلسات همزمان میسر شود."
</div>
<div class="slide-card">
<div class="slide-title">🖼️ اسلاید ۴: نگارش همزمان مقاله با الگوریتم OT</div>
<strong>نکات گفتاری:</strong> "یکی از بخش‌های پیشرفته، ادیتور همزمان متون LaTeX با الگوریتم Operational Transformation است که از تداخل همزمان نوشتن چند پژوهشگر جلوگیری می‌کند."
</div>
<div class="slide-card">
<div class="slide-title">🖼️ اسلاید ۵: رصدپذیری کامل (Observability)</div>
<strong>نکات گفتاری:</strong> "سیستم کاملاً با Prometheus، Grafana، Loki و Tempo یکپارچه شده و تمامی متریک‌ها، لاگ‌ها و Distributed Tracing را نمایش می‌دهد."
</div>
<h2>❓ ۷. سوالات احتمالی داوران و پاسخ‌های تخصصی</h2>
<div class="qa-box">
<div class="qa-question">❓ سوال ۱: چرا سرور WebSocket را روی پورت مجزای ۹۰۹۳ قرار دادید؟</div>
<div class="qa-answer">
<strong>پاسخ:</strong> برای رعایت اصل Separation of Concerns و جلوگیری از مسدود شدن Thread Loop اصلی بک‌اند هنگام ترافیک سنگین چت زنده.
</div>
</div>
<div class="qa-box">
<div class="qa-question">❓ سوال ۲: نحوه جلوگیری از حمله XSS در متون مقالات چگونه است؟</div>
<div class="qa-answer">
<strong>پاسخ:</strong> توسط کلاس <code>HtmlSanitizer</code> در بک‌اند، تمامی تگ‌ها و اسکریپت‌های مخرب قبل از ذخیره‌سازی در دیتابیس پاکسازی می‌شوند.
</div>
</div>
<div class="qa-box">
<div class="qa-question">❓ سوال ۳: موتور جستجوی Inverted Index چه مزیتی نسبت به دیتابیس دارد؟</div>
<div class="qa-answer">
<strong>پاسخ:</strong> استفاده از `LIKE %query%` روی کلمات مقاله باعث Table Scan کامل دیتابیس می‌شود. Inverted Index کلمات را به شناسه‌ها نگاشت کرده و سرچ را در کسر چند میلی‌ثانیه انجام می‌دهد.
</div>
</div>
<div class="footer-note">
گزارش رسمی ارائه پروژه Research Platform 2.0 | دانشگاه تهران - تیرماه ۱۴۰۵
</div>
</body>
</html>

Xet Storage Details

Size:
21.7 kB
·
Xet hash:
91d2dc0a3b58d3c547de2f9fa91a79465ef481caf3565cb61e052cacadf7cec6

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.