| <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 ; | |
| print-color-adjust: exact ; | |
| } | |
| 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.