mirror of
https://github.com/AmirAref/paya-university-fault-system.git
synced 2026-11-12 02:53:34 +00:00
Compare commits
3 Commits
45ee92efb0
...
f2c0e0aaac
| Author | SHA1 | Date | |
|---|---|---|---|
| f2c0e0aaac | |||
| 47ac8c1f8e | |||
| 969d2fa188 |
@@ -0,0 +1,371 @@
|
||||
# معماری نرمافزار (Software Architecture) – سامانه مدیریت و گزارش خرابی دانشگاهی
|
||||
|
||||
|
||||
**تهیهکننده:** ارشیا همتیزاده
|
||||
**بازبین:** رضا آدوسی
|
||||
**آخرین بهروزرسانی:** ۱۴۰۵/۰۸/۱۴
|
||||
|
||||
|
||||
---
|
||||
|
||||
## مقدمه
|
||||
|
||||
این سند معماری نرمافزاری سامانهٔ مدیریت و گزارش خرابی دانشگاهی را در سطح **منطقی و مفهومی** تعریف میکند. چون پروژه هنوز وارد فاز پیادهسازی نشده است (طبق `README.md`)، این سند **تعهد به فناوری خاصی ندارد** و انتخابهای فناورانه در بخش «پرسشهای باز» علامتگذاری شدهاند.
|
||||
|
||||
هدف این سند پاسخ به سه پرسش است:
|
||||
|
||||
1. سامانه از چه **مؤلفههایی** تشکیل میشود و مرز مسئولیت هر کدام کجاست؟
|
||||
2. این مؤلفهها چگونه با هم **همکاری** میکنند تا جریانهای توصیفشده در `activity.md` محقق شوند؟
|
||||
3. کدام **نیروهای محرک معماری (Architectural Drivers)** این ساختار را توجیه میکنند؟
|
||||
|
||||
## ۱. نیروهای محرک معماری
|
||||
|
||||
### ۱.۱. نیازمندیهای غیرکارکردی
|
||||
|
||||
| شناسه | نیازمندی | اثر معماری |
|
||||
|---|---|---|
|
||||
| `NFR-01` | امنیت اطلاعات | احراز هویت متمرکز، مجوزدهی سمت سرور، هش رمز، جلوگیری از دسترسی مستقیم به صفحات نقش دیگر |
|
||||
| `NFR-02` | حفظ حریم خصوصی | فیلتر داده بر اساس نقش در لایهٔ برنامه (نه فقط در رابط کاربری) |
|
||||
| `NFR-03` | کاربردپذیری | رابط RTL فارسی، اعتبارسنجی درجا، پیام خطای روشن |
|
||||
| `NFR-04` | زمان پاسخگویی | ایندکسگذاری هدفمند (طبق `data-model.md` §۷)، پرهیز از کوئریهای سنگین در داشبورد |
|
||||
| `NFR-05` | صحت و نگهداری اطلاعات | تاریخچهٔ append-only، قفل خوشبینانه، تراکنشهای اتمیک |
|
||||
| `NFR-06` | قابلیت نگهداری و توسعه | معماری لایهای و ماژولار، جداسازی دامنه از زیرساخت |
|
||||
|
||||
### ۱.۲. محدودیتها
|
||||
|
||||
| محدودیت | منبع | اثر |
|
||||
|---|---|---|
|
||||
| تیم سهنفره، پروژهٔ دانشگاهی | `README.md` | پرهیز از معماریهای توزیعشده و پیچیده |
|
||||
| هنوز فناوری انتخاب نشده | `README.md` («هنوز کدنویسی و پیادهسازی انجام نشده») | معماری باید فناوریمستقل بماند |
|
||||
| فهرست وضعیتها و اولویتها نهایی نیست | پرسشهای باز ۳ و ۴ در `activity.md` | اینها باید **داده** باشند، نه کد |
|
||||
| دامنهٔ فضاها مشخص نیست | ابهام `README.md` | مدل محل خرابی باید قابل گسترش بماند |
|
||||
|
||||
## ۲. سبک معماری انتخابشده
|
||||
|
||||
**سبک پیشنهادی: مونولیت ماژولار لایهای (Modular Layered Monolith)**
|
||||
|
||||
### ۲.۱. مقایسهٔ گزینهها
|
||||
|
||||
| گزینه | مزیت | عیب | تناسب با این پروژه |
|
||||
|---|---|---|---|
|
||||
| **مونولیت لایهای** | سادگی استقرار، دیباگ آسان، مناسب تیم کوچک | مقیاسپذیری مستقل ماژولها ندارد | ✅ **انتخاب شد** |
|
||||
| میکروسرویس | استقلال استقرار، مقیاسپذیری انتخابی | هزینهٔ عملیاتی بالا، نیاز به DevOps، پیچیدگی تراکنش توزیعشده | ❌ برای تیم سهنفره و پروژهٔ درسی توجیه ندارد |
|
||||
| بدون لایه (اسکریپتمحور) | سرعت شروع | نقض `NFR-06`، عدم قابلیت نگهداری | ❌ |
|
||||
|
||||
### ۲.۲. توجیه
|
||||
|
||||
- `NFR-06` قابلیت نگهداری را الزام میکند؛ لایهبندی این را تضمین میکند.
|
||||
- `NFR-05` صحت داده را الزام میکند؛ تراکنش در یک پایگاهدادهٔ واحد بسیار سادهتر از تراکنش توزیعشده است.
|
||||
- مرزهای دامنه (بخش ۳) از `domain-model.md` گرفته شدهاند تا در آیندهٔ دور اگر لازم شد، جداسازی به میکروسرویس **ممکن** باشد، بدون بازنویسی دامنه.
|
||||
|
||||
## ۳. مرزهای ماژول (Bounded Contexts)
|
||||
|
||||
مرزها از `domain-model.md` §۱ گرفته شدهاند:
|
||||
|
||||
| ماژول | مسئولیت | مفاهیم اصلی | نیازمندیها |
|
||||
|---|---|---|---|
|
||||
| **M1 — هویت و دسترسی** | احراز هویت، تشخیص نقش، مجوزدهی | کاربر، نقش، نشست | `FR-01`، `FR-02`، `US-15` |
|
||||
| **M2 — گزارش خرابی** | ثبت، پیگیری، اطلاعات تکمیلی، بازخورد گزارشدهنده | گزارش، اطلاعات تکمیلی، بازخورد | `FR-03`–`FR-05`، `FR-14`، `US-01`–`US-05` |
|
||||
| **M3 — مدیریت تعمیر** | بررسی، اولویتبندی، تخصیص، ثبت نتیجه | اولویت، تخصیص، نتیجهٔ تعمیر | `FR-06`–`FR-13`، `US-06`–`US-14` |
|
||||
| **M4 — اطلاعرسانی** | واکنش به رویدادهای دامنه و ارسال اعلان | اعلان، کانال | `FR-15`، `US-16` |
|
||||
| **M5 — نظارت** | داشبورد و آمار تجمیعی | داشبورد (Read Model) | `FR-17`، `US-17` |
|
||||
|
||||
> **نکته:** M2 و M3 در `data-model.md` روی یک جدول مرکزی (`fault_reports`) کار میکنند. جداسازی این دو **ماژول منطقی** است، نه فیزیکی. مزیت: هر ماژول فقط متدهای مجاز خودش را روی گزارش فراخوانی میکند و قانون «تغییر وضعیت فقط از مسیر مجاز» در یک نقطه کنترل میشود.
|
||||
|
||||
## ۴. لایههای معماری
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph P["لایهٔ نمایش (Presentation)"]
|
||||
P1["رابط وب RTL<br/>SCR-01 تا SCR-12"]
|
||||
end
|
||||
subgraph A["لایهٔ برنامه (Application)"]
|
||||
A1["سرویسهای کاربردی<br/>Use Cases"]
|
||||
A2["اعتبارسنجی ورودی"]
|
||||
A3["کنترل دسترسی"]
|
||||
end
|
||||
subgraph D["لایهٔ دامنه (Domain)"]
|
||||
D1["موجودیتها و Value Objectها"]
|
||||
D2["سیاستهای دامنه"]
|
||||
D3["ماشین حالت گزارش"]
|
||||
D4["رویدادهای دامنه"]
|
||||
end
|
||||
subgraph I["لایهٔ زیرساخت (Infrastructure)"]
|
||||
I1["دسترسی به داده"]
|
||||
I2["سرویس احراز هویت"]
|
||||
I3["ارسال اعلان"]
|
||||
I4["ذخیرهسازی فایل"]
|
||||
end
|
||||
|
||||
P --> A
|
||||
A --> D
|
||||
A --> I
|
||||
D -.->|"بدون وابستگی به زیرساخت"| I
|
||||
|
||||
classDef pres fill:#e3f2fd,stroke:#1565c0
|
||||
classDef app fill:#fff3e0,stroke:#ef6c00
|
||||
classDef dom fill:#e8f5e9,stroke:#2e7d32
|
||||
classDef inf fill:#f3e5f5,stroke:#6a1b9a
|
||||
class P1 pres
|
||||
class A1,A2,A3 app
|
||||
class D1,D2,D3,D4 dom
|
||||
class I1,I2,I3,I4 inf
|
||||
```
|
||||
|
||||
**قاعدهٔ وابستگی:** جهت وابستگی همیشه به سمت **دامنه** است. دامنه به هیچ لایهٔ دیگری وابسته نیست. این قاعده `NFR-06` را تضمین میکند و اجازه میدهد در آینده پایگاهداده یا سرویس احراز هویت عوض شود بدون تغییر منطق کسبوکار.
|
||||
|
||||
## ۵. نمای ظرف (Container View)
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph Client["مرورگر کاربر"]
|
||||
C1["برنامهٔ وب<br/>(رابط RTL فارسی)"]
|
||||
end
|
||||
|
||||
subgraph Server["سرور برنامه"]
|
||||
S1["API / لایهٔ برنامه"]
|
||||
S2["ماژولهای M1 تا M5"]
|
||||
S3["کارگر پسزمینه<br/>(پردازش رویدادها)"]
|
||||
end
|
||||
|
||||
subgraph Data["لایهٔ داده"]
|
||||
DB[("پایگاهدادهٔ رابطهای<br/>مرجع: PostgreSQL")]
|
||||
FS[("ذخیرهسازی فایل<br/>تصاویر اطلاعات تکمیلی")]
|
||||
end
|
||||
|
||||
subgraph External["سرویسهای بیرونی"]
|
||||
AUTH["سرویس احراز هویت"]
|
||||
NOTIF["درگاه اعلان<br/>(درونبرنامه / پیامک / ایمیل)"]
|
||||
end
|
||||
|
||||
C1 -->|"HTTPS / JSON"| S1
|
||||
S1 --> S2
|
||||
S2 --> DB
|
||||
S2 --> FS
|
||||
S2 --> AUTH
|
||||
S2 -.->|"انتشار رویداد"| S3
|
||||
S3 --> NOTIF
|
||||
|
||||
classDef ext fill:#fff8e1,stroke:#f9a825,stroke-dasharray: 4 4
|
||||
class AUTH,NOTIF ext
|
||||
```
|
||||
|
||||
> **توضیح:** پردازش اعلان (M4) بهصورت **غیرهمگام** از طریق رویداد انجام میشود تا `NFR-04` حفظ شود: ثبت گزارش نباید منتظر ارسال پیامک بماند. کانال دقیق اعلان هنوز پرسش باز ۸ است؛ بنابراین `NOTIF` بهعنوان یک **آداپتور قابل تعویض** مدل شده است.
|
||||
|
||||
## ۶. جریانهای کلیدی
|
||||
|
||||
### ۶.۱. ورود به سامانه (AD-01، US-15)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
actor U as کاربر
|
||||
participant UI as رابط کاربری
|
||||
participant APP as لایهٔ برنامه
|
||||
participant AUTH as سرویس احراز هویت
|
||||
participant DB as پایگاهداده
|
||||
|
||||
U->>UI: نام کاربری و رمز عبور
|
||||
UI->>UI: بررسی فیلد خالی
|
||||
alt فیلد خالی
|
||||
UI-->>U: «این فیلد الزامی است»
|
||||
else کامل
|
||||
UI->>APP: درخواست ورود
|
||||
APP->>AUTH: اعتبارسنجی
|
||||
alt سرویس در دسترس نیست
|
||||
AUTH-->>APP: خطا
|
||||
APP-->>UI: «خطا در ورود؛ لطفاً بعداً تلاش کنید»
|
||||
else پاسخ دریافت شد
|
||||
AUTH-->>APP: نتیجه
|
||||
alt نامعتبر
|
||||
APP-->>UI: «نام کاربری یا رمز عبور اشتباه است»
|
||||
UI-->>U: خطای مبهم (بدون افشای فیلد اشتباه)
|
||||
else معتبر
|
||||
APP->>DB: ثبت رویداد ورود
|
||||
APP-->>UI: نشست + نقش
|
||||
UI-->>U: داشبورد متناسب با نقش
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**الزامات امنیتی بازتابیافته:** پیام خطا نباید مشخص کند کدام فیلد اشتباه است (`US-15.feature`). این قاعده در لایهٔ برنامه اعمال میشود، نه در رابط کاربری.
|
||||
|
||||
### ۶.۲. ثبت گزارش خرابی (AD-02، US-01، US-02)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
actor R as گزارشدهنده
|
||||
participant UI as رابط کاربری
|
||||
participant APP as لایهٔ برنامه
|
||||
participant DOM as دامنه
|
||||
participant DB as پایگاهداده
|
||||
|
||||
R->>UI: پر کردن فرم
|
||||
UI->>UI: اعتبارسنجی سمت کلاینت
|
||||
Note over UI: اجباری: عنوان، توضیحات، محل، نوع تجهیز<br/>حداکثر عنوان: ۱۵۰ کاراکتر
|
||||
alt نامعتبر
|
||||
UI-->>R: نمایش خطا کنار فیلد، حفظ مقادیر
|
||||
else معتبر
|
||||
UI->>APP: ارسال
|
||||
APP->>APP: کنترل دسترسی (نقش مجاز)
|
||||
APP->>DOM: اعتبارسنجی مجدد
|
||||
alt نامعتبر
|
||||
DOM-->>APP: نقض قاعده
|
||||
APP-->>UI: خطای اعتبارسنجی
|
||||
UI-->>R: نمایش خطا
|
||||
else معتبر
|
||||
APP->>DB: درج گزارش (وضعیت: ثبتشده)
|
||||
APP->>DB: درج رویداد تاریخچه REPORT_SUBMITTED
|
||||
APP-->>UI: شناسهٔ گزارش
|
||||
UI-->>R: پیام موفقیت + شناسهٔ یکتا
|
||||
APP-)APP: انتشار ReportSubmitted
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**نکتهٔ مهم (الزام `US-01.feature`):** «اعتبارسنجی سمت کلاینت» فقط برای تجربهٔ کاربری است. اعتبارسنجی **معتبر** در لایهٔ برنامه و دامنه انجام میشود. اگر درخواست مستقیماً به API ارسال شود، همان قواعد باید اعمال شوند.
|
||||
|
||||
### ۶.۳. تخصیص تعمیرکار (AD-03، US-08)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
actor F as کارمند تأسیسات
|
||||
participant APP as لایهٔ برنامه
|
||||
participant DOM as دامنه
|
||||
participant DB as پایگاهداده
|
||||
participant N as ماژول اطلاعرسانی
|
||||
|
||||
F->>APP: انتخاب گزارش + تعمیرکار
|
||||
APP->>APP: کنترل دسترسی
|
||||
APP->>DOM: درخواست تخصیص
|
||||
DOM->>DOM: بررسی وضعیت مجاز
|
||||
alt وضعیت مجاز نیست
|
||||
DOM-->>APP: خطا
|
||||
APP-->>F: پیام خطا
|
||||
else مجاز
|
||||
DOM->>DB: درج تخصیص
|
||||
DOM->>DB: تغییر وضعیت به ارجاعشده
|
||||
DOM->>DB: درج رویداد تاریخچه TECHNICIAN_ASSIGNED
|
||||
DOM-)N: انتشار TechnicianAssigned
|
||||
N->>N: ارسال اعلان (غیرهمگام)
|
||||
APP-->>F: پیام موفقیت
|
||||
end
|
||||
```
|
||||
|
||||
### ۶.۴. تأیید یا رد تعمیر (AD-05، US-05)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
actor R as گزارشدهنده
|
||||
participant APP as لایهٔ برنامه
|
||||
participant DOM as دامنه
|
||||
participant DB as پایگاهداده
|
||||
|
||||
R->>APP: درخواست تأیید/رد
|
||||
APP->>APP: کنترل دسترسی
|
||||
APP->>DB: خواندن گزارش با قفل خوشبینانه
|
||||
APP->>DOM: بررسی قواعد تأیید
|
||||
DOM->>DOM: ۱) کاربر = گزارشدهندهٔ همان گزارش؟<br/>۲) وضعیت = تعمیر انجامشده؟<br/>۳) آیا قبلاً بازخورد ثبت شده؟
|
||||
alt یکی از شروط نقض شد
|
||||
DOM-->>APP: رد درخواست
|
||||
APP-->>R: پیام متناسب
|
||||
Note over APP,R: «دسترسی مجاز نیست» یا<br/>«این گزارش در وضعیت قابل تأیید نیست»
|
||||
else مجاز
|
||||
alt رد بدون دلیل
|
||||
APP-->>R: «ذکر دلیل رد الزامی است»
|
||||
else
|
||||
APP->>DB: درج بازخورد (UNIQUE روی نتیجهٔ تعمیر)
|
||||
APP->>DB: درج رویداد تاریخچه
|
||||
alt تأیید
|
||||
APP->>DB: تغییر وضعیت به بستهشده + closed_at
|
||||
end
|
||||
APP-->>R: پیام موفقیت
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**چرا قفل خوشبینانه؟** الزام ایدمپوتنسی در `US-05.feature`: «کلیک دوباره روی تأیید یک تغییر وضعیت بیشتر ایجاد نمیکند». ترکیب `UNIQUE (report_id, repair_result_id)` در `data-model.md` و بررسی `version` تضمین دوگانه میدهد.
|
||||
|
||||
## ۷. دغدغههای عرضی (Cross-Cutting Concerns)
|
||||
|
||||
| دغدغه | راهکار | لایه | مستند مرجع |
|
||||
|---|---|---|---|
|
||||
| **احراز هویت** | سرویس متمرکز؛ در صورت در دسترس نبودن، پیام «خطا در ورود؛ لطفاً بعداً تلاش کنید» و عدم ورود | برنامه | `FR-01`، `US-15.feature` |
|
||||
| **مجوزدهی** | کنترل سمت سرور در **هر** درخواست؛ هرگز فقط مخفیکردن دکمه در رابط کاربری | برنامه | `FR-02`، `US-15.feature` |
|
||||
| **اعتبارسنجی** | دو لایه: رابط کاربری (تجربهٔ کاربری) و دامنه (اعتبار واقعی) | نمایش + دامنه | `US-01.feature` |
|
||||
| **ثبت تاریخچه** | هر تغییر معنادار یک ردیف در `report_history`؛ append-only | برنامه + داده | `FR-16`، `NFR-05` |
|
||||
| **رویدادهای دامنه** | انتشار پس از commit موفق؛ مصرف غیرهمگام | دامنه → اطلاعرسانی | `FR-15` |
|
||||
| **مدیریت خطا** | خطاهای قابل نمایش (اعتبارسنجی/مجوز) در برابر خطاهای فنی؛ در خطای فنی، پیام عمومی و ثبت جزئیات در لاگ | برنامه | `US-01.feature` |
|
||||
| **زمان** | همهٔ زمانها با منطقهٔ زمانی (`timestamptz`) | داده | `data-model.md` §۹ |
|
||||
| **تراکنش** | تغییر وضعیت + درج تاریخچه در یک تراکنش | برنامه + داده | `NFR-05` |
|
||||
|
||||
## ۸. تصمیمهای معماری (ADR)
|
||||
|
||||
| شناسه | تصمیم | جایگزین ردشده | دلیل |
|
||||
|---|---|---|---|
|
||||
| **ADR-01** | مونولیت ماژولار | میکروسرویس | تیم سهنفره، نیاز به تراکنش اتمیک، `NFR-06` |
|
||||
| **ADR-02** | معماری لایهای با وابستگی به سمت دامنه | لایهبندی بدون قاعده | جلوگیری از نشت منطق کسبوکار به رابط کاربری |
|
||||
| **ADR-03** | مجوزدهی **سمت سرور** در هر درخواست | فقط مخفیکردن در رابط کاربری | `FR-02`، `US-15.feature` (سناریوی دسترسی مستقیم به آدرس) |
|
||||
| **ADR-04** | اعلان بر پایهٔ **رویداد دامنه** و غیرهمگام | فراخوانی مستقیم ارسال اعلان در همان تراکنش | `NFR-04`، جداسازی M4 از M2/M3 |
|
||||
| **ADR-05** | قفل خوشبینانه (`version`) | قفل بدبینانه | ایدمپوتنسی `US-05.feature` بدون بلوکهکردن |
|
||||
| **ADR-06** | فهرست وضعیتها و انتقالها بهصورت **داده** | `ENUM` یا `switch` در کد | پرسشهای باز ۳ و ۴ هنوز بسته نشدهاند |
|
||||
| **ADR-07** | تاریخچهٔ append-only | لاگ فایل یا `audit` سطح پایگاهداده | قابل مشاهده برای کاربر (`FR-16`، `US-10`) |
|
||||
| **ADR-08** | شناسههای فنی انگلیسی، متن رابط فارسی | همهچیز فارسی | تعارض با `CONTRIBUTING.md` ندارد؛ آن بند دربارهٔ متن مستندات است |
|
||||
|
||||
## ۹. نمای استقرار (Deployment View)
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph Browser["دستگاه کاربر"]
|
||||
B1["مرورگر"]
|
||||
end
|
||||
subgraph Host["میزبان (تکسرور یا Docker Compose)"]
|
||||
W1["سرور برنامه"]
|
||||
D1[("پایگاهداده")]
|
||||
F1[("ذخیرهسازی فایل")]
|
||||
end
|
||||
B1 -->|HTTPS| W1
|
||||
W1 --> D1
|
||||
W1 --> F1
|
||||
|
||||
classDef future fill:#f5f5f5,stroke:#9e9e9e,stroke-dasharray: 4 4
|
||||
```
|
||||
|
||||
**فرض:** برای یک پروژهٔ دانشگاهی، استقرار تکسروری (یا `docker compose` با سه سرویس) کافی است. جزئیات فناورانه در پرسشهای باز آمدهاند.
|
||||
|
||||
## ۱۰. نگاشت نیازمندیهای غیرکارکردی به راهکار معماری
|
||||
|
||||
| NFR | راهکار معماری | محل تحقق |
|
||||
|---|---|---|
|
||||
| `NFR-01` امنیت | احراز هویت متمرکز، مجوزدهی سمت سرور، هش رمز، عدم افشای فیلد اشتباه | `M1`، لایهٔ برنامه |
|
||||
| `NFR-02` حریم خصوصی | فیلتر نتایج بر اساس نقش در سرویسهای کاربردی | لایهٔ برنامه |
|
||||
| `NFR-03` کاربردپذیری | رابط RTL، اعتبارسنجی درجا، پیامهای دقیق | لایهٔ نمایش (`ui-wireframes.md`) |
|
||||
| `NFR-04` زمان پاسخ | ایندکسهای `data-model.md` §۷، اعلان غیرهمگام، داشبورد بهصورت نمای تجمیعی | داده + `M4` + `M5` |
|
||||
| `NFR-05` صحت داده | تراکنش اتمیک، تاریخچهٔ append-only، قفل خوشبینانه، ممنوعیت حذف فیزیکی | دامنه + داده |
|
||||
| `NFR-06` نگهداشت | لایهبندی، مرز ماژول، جداسازی دامنه از زیرساخت، ADRها | کل معماری |
|
||||
|
||||
## ۱۱. ریسکهای معماری
|
||||
|
||||
| # | ریسک | اثر | کاهش |
|
||||
|---|---|---|---|
|
||||
| R1 | بستهنشدن پرسش باز ۹ (چند نقش برای کاربر) | تغییر در M1 و مدل داده و نمودار کلاس | تصمیمگیری پیش از پیادهسازی؛ در غیر این صورت تغییر سه سند |
|
||||
| R2 | نهایینشدن فهرست وضعیتها (پرسش ۴) | تغییر ماشین حالت و انتقالهای مجاز | ADR-06: انتقالها بهصورت داده |
|
||||
| R3 | رشد دامنه به خوابگاه و فضاهای اداری | تأثیر بر مدل محل و مجوزها | مدل محل قابل گسترش (`data-model.md` D2) |
|
||||
| R4 | انتخاب نشدن کانال اعلان (پرسش ۸) | تأخیر در `M4` | آداپتور قابل تعویض (بخش ۵) |
|
||||
| R5 | انتخابنشدن فناوری | عدم شروع پیادهسازی | پرسش باز ۱۶ |
|
||||
|
||||
## ۱۲. نکات و پرسشهای باز
|
||||
|
||||
| # | پرسش | نیازمند تصمیم |
|
||||
|---|---|---|
|
||||
| ۱۶ | فناوری لایهٔ نمایش، برنامه و داده چیست؟ (زبان، فریمورک، DBMS) | تیم — پیش از فاز پیادهسازی |
|
||||
| ۱۷ | سرویس احراز هویت داخلی ساخته شود یا از راهکار آماده استفاده شود؟ | تیم |
|
||||
| ۱۸ | ذخیرهسازی تصاویر اطلاعات تکمیلی در فایلسیستم یا پایگاهداده؟ | تیم |
|
||||
| ۱۹ | نیاز به API عمومی یا صرفاً مصرف داخلی رابط کاربری؟ | تیم |
|
||||
| ۲۰ | سطح دسترسی دقیق مدیر (پرسش باز ۹ در `activity.md`) چه اثری بر M1 و M5 دارد؟ | تیم |
|
||||
| ۲۱ | آیا نیاز به ثبت تلاشهای ورود ناموفق و قفل حساب وجود دارد؟ (در مستندات نیامده) | تیم |
|
||||
| ۲۲ | آیا رابط کاربری باید واکنشگرا (Responsive) باشد؟ (در `NFR-03` صریح نیست) | تیم |
|
||||
|
||||
---
|
||||
|
||||
**وضعیت سند:** نسخه اولیه (Draft) – آماده بازبینی
|
||||
@@ -0,0 +1,460 @@
|
||||
# رابط کاربری و وایرفریمها (UI Wireframes) – سامانه مدیریت و گزارش خرابی دانشگاهی
|
||||
|
||||
|
||||
**تهیهکننده:** ارشیا همتیزاده
|
||||
**بازبین:** رضا آدوسی
|
||||
**آخرین بهروزرسانی:** ۱۴۰۵/۰۸/۱۴
|
||||
|
||||
|
||||
---
|
||||
|
||||
## مقدمه
|
||||
|
||||
این سند فهرست صفحات، نقشهٔ ناوبری و طرح اولیهٔ چیدمان (Wireframe) رابط کاربری سامانه را ارائه میدهد. هدف، تبدیل داستانهای کاربر و جریانهای `activity.md` به صفحات مشخص است، **پیش از** انتخاب فناوری و شروع کدنویسی.
|
||||
|
||||
> **نکتهٔ نمایش:** متن نهایی سامانه فارسی و راستبهچپ (RTL) است. طرحهای این سند با کاراکترهای ساده رسم شدهاند و **جهت چیدمان آنها نمایندهٔ جهت نهایی نیست**. در پیادهسازی، ستون «منو/اقدام» در سمت راست و ناحیهٔ محتوا در سمت چپ قرار میگیرد.
|
||||
|
||||
## ۱. اصول طراحی
|
||||
|
||||
| # | اصل | توضیح | مستند مرجع |
|
||||
|---|---|---|---|
|
||||
| P1 | **راستبهچپ و فارسی** | همهٔ برچسبها، پیامها و تاریخها فارسی؛ تاریخ شمسی با ارقام فارسی | `NFR-03`، `CONTRIBUTING.md` §۷ |
|
||||
| P2 | **ناوبری نقشمحور** | هر کاربر فقط صفحات نقش خود را در منو میبیند | `FR-02`، `US-15` |
|
||||
| P3 | **اعتبارسنجی درجا** | خطا کنار همان فیلد نمایش داده میشود، نه در بالای صفحه | `US-01.feature` |
|
||||
| P4 | **حفظ ورودی در خطا** | در خطای اعتبارسنجی یا خطای سرور، مقادیر فرم پاک نمیشوند | `US-01.feature` |
|
||||
| P5 | **افشا نکردن علت خطای ورود** | پیام ورود مبهم است و فیلد اشتباه را مشخص نمیکند | `US-15.feature` |
|
||||
| P6 | **پنهاننکردن قابلیت بهجای کنترل دسترسی** | مجوزدهی سمت سرور؛ رابط کاربری فقط بازتاب آن است | `ADR-03` در `software-architecture.md` |
|
||||
| P7 | **بازخورد صریح وضعیت** | هر اقدام موفق یا ناموفق پیام روشن دارد | `NFR-03` |
|
||||
| P8 | **نمایش وضعیت و اولویت بهصورت بصری** | بج رنگی برای وضعیت و اولویت در همهٔ فهرستها | `FR-08`، `US-06` |
|
||||
|
||||
## ۲. فهرست صفحات
|
||||
|
||||
| شناسه | صفحه | نقشهای مجاز | داستانهای کاربر | جریان فعالیت |
|
||||
|---|---|---|---|---|
|
||||
| `SCR-01` | ورود به سامانه | همه | `US-15` | `AD-01` |
|
||||
| `SCR-02` | گزارشهای من | دانشجو، استاد | `US-03` | `AD-02` |
|
||||
| `SCR-03` | ثبت گزارش خرابی | دانشجو، استاد | `US-01`، `US-02` | `AD-02` |
|
||||
| `SCR-04` | جزئیات گزارش (نمای گزارشدهنده) | دانشجو، استاد | `US-03`، `US-04`، `US-05` | `AD-02`، `AD-05` |
|
||||
| `SCR-05` | فهرست گزارشهای باز | کارمند تأسیسات | `US-06` | `AD-03` |
|
||||
| `SCR-06` | جزئیات گزارش (نمای تأسیسات) | کارمند تأسیسات | `US-06`–`US-10` | `AD-03` |
|
||||
| `SCR-07` | مأموریتهای من | تعمیرکار | `US-11` | `AD-04` |
|
||||
| `SCR-08` | جزئیات مأموریت | تعمیرکار | `US-12`، `US-13`، `US-14` | `AD-04` |
|
||||
| `SCR-09` | داشبورد مدیریتی | کارمند تأسیسات، مدیر | `US-17` | `AD-03` |
|
||||
| `SCR-10` | اعلانها | همه | `US-16` | — |
|
||||
| `SCR-11` | خطای دسترسی | همه | `US-15` | `AD-01` |
|
||||
| `SCR-12` | مودال تأیید/رد تعمیر | دانشجو، استاد | `US-05` | `AD-05` |
|
||||
|
||||
## ۳. نقشهٔ ناوبری
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
LOGIN["SCR-01<br/>ورود"] --> ROLE{"نقش کاربر"}
|
||||
|
||||
ROLE -->|"دانشجو / استاد"| R_HOME["SCR-02<br/>گزارشهای من"]
|
||||
R_HOME --> R_NEW["SCR-03<br/>ثبت گزارش"]
|
||||
R_HOME --> R_DETAIL["SCR-04<br/>جزئیات گزارش"]
|
||||
R_DETAIL --> R_MODAL["SCR-12<br/>تأیید یا رد تعمیر"]
|
||||
|
||||
ROLE -->|"کارمند تأسیسات"| F_HOME["SCR-05<br/>گزارشهای باز"]
|
||||
F_HOME --> F_DETAIL["SCR-06<br/>جزئیات گزارش"]
|
||||
F_HOME --> F_DASH["SCR-09<br/>داشبورد"]
|
||||
|
||||
ROLE -->|"تعمیرکار"| T_HOME["SCR-07<br/>مأموریتهای من"]
|
||||
T_HOME --> T_DETAIL["SCR-08<br/>جزئیات مأموریت"]
|
||||
|
||||
ROLE -->|"مدیر"| M_DASH["SCR-09<br/>داشبورد"]
|
||||
|
||||
R_HOME -.-> NOTIF["SCR-10<br/>اعلانها"]
|
||||
F_DETAIL -.-> NOTIF
|
||||
T_DETAIL -.-> NOTIF
|
||||
|
||||
R_HOME -.->|"دسترسی غیرمجاز"| ERR["SCR-11<br/>خطای دسترسی"]
|
||||
F_HOME -.-> ERR
|
||||
T_HOME -.-> ERR
|
||||
```
|
||||
|
||||
## ۴. وایرفریمها
|
||||
|
||||
در هر طرح، کادرهای شمارهدار به عناصر مشخص اشاره دارند و جدول زیر آنها مشخصات کامل هر عنصر را میدهد. این روش از مشکل نمایش راستبهچپ متن فارسی در بلوک کد جلوگیری میکند.
|
||||
|
||||
### ۴.۱. `SCR-01` — ورود به سامانه
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
│ │
|
||||
│ ┌────────────────────────┐ │
|
||||
│ │ [۳] │ │
|
||||
│ │ │ │
|
||||
│ │ [۴] │ │
|
||||
│ │ ┌──────────────────┐ │ │
|
||||
│ │ │ [۵] │ │ │
|
||||
│ │ └──────────────────┘ │ │
|
||||
│ │ [۶] │ │
|
||||
│ │ ┌──────────────────┐ │ │
|
||||
│ │ │ [۷] │ │ │
|
||||
│ │ └──────────────────┘ │ │
|
||||
│ │ [۸] │ │
|
||||
│ │ ┌──────────────────┐ │ │
|
||||
│ │ │ [۹] │ │ │
|
||||
│ │ └──────────────────┘ │ │
|
||||
│ └────────────────────────┘ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۱ | لوگو و نام سامانه | متن | «سامانه مدیریت و گزارش خرابی دانشگاهی» | — | `README.md` |
|
||||
| ۲ | فضای خالی / زبان | — | فعلاً فقط فارسی | — | `NFR-03` |
|
||||
| ۳ | عنوان فرم | تیتر | «ورود به سامانه» | — | `US-15` |
|
||||
| ۴ | برچسب نام کاربری | متن | «نام کاربری» | — | `FR-01` |
|
||||
| ۵ | ورودی نام کاربری | فیلد متنی | — | اجباری؛ در صورت خالیبودن: «این فیلد الزامی است» کنار فیلد | `US-15.feature` |
|
||||
| ۶ | برچسب رمز عبور | متن | «رمز عبور» | — | `FR-01` |
|
||||
| ۷ | ورودی رمز عبور | فیلد رمز | — | اجباری؛ ماسکشده | `US-15.feature` |
|
||||
| ۸ | ناحیهٔ خطا | ناحیهٔ پیام | خالی در حالت عادی | در خطای ورود: «نام کاربری یا رمز عبور اشتباه است» — نام کاربری در فرم میماند | `US-15.feature` |
|
||||
| ۹ | دکمهٔ ورود | دکمهٔ اصلی | «ورود» | پس از موفقیت: انتقال به داشبورد نقش | `AD-01` |
|
||||
|
||||
**حالتهای خطا:**
|
||||
|
||||
| حالت | پیام | رفتار | مرجع |
|
||||
|---|---|---|---|
|
||||
| فیلد خالی | «این فیلد الزامی است» (کنار همان فیلد) | ورود انجام نمیشود | `US-15.feature` |
|
||||
| اعتبارنامهٔ نامعتبر | «نام کاربری یا رمز عبور اشتباه است» | نام کاربری حفظ میشود؛ فیلد اشتباه مشخص نمیشود | `US-15.feature` |
|
||||
| سرویس احراز هویت در دسترس نیست | «خطا در ورود؛ لطفاً بعداً تلاش کنید» | ورود انجام نمیشود | `US-15.feature` |
|
||||
|
||||
> **الزام امنیتی:** هیچ پیام خطایی نباید مشخص کند «نام کاربری وجود ندارد» یا «رمز اشتباه است». تنها پیام مشترک مجاز است (P5).
|
||||
|
||||
### ۴.۲. `SCR-03` — ثبت گزارش خرابی
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
├──────────────┬───────────────────────────────────────────────┤
|
||||
│ │ [۳] │
|
||||
│ [M1] │ ┌──────────────────────────────────────────┐ │
|
||||
│ [M2] │ │ [۴] │ │
|
||||
│ [M3] │ │ ┌──────────────────────────────────────┐ │ │
|
||||
│ [M4] │ │ │ [۵] │ │ │
|
||||
│ │ │ └──────────────────────────────────────┘ │ │
|
||||
│ │ │ [۶] │ │
|
||||
│ │ │ ┌──────────────────────────────────────┐ │ │
|
||||
│ │ │ │ [۷] │ │ │
|
||||
│ │ │ │ │ │ │
|
||||
│ │ │ └──────────────────────────────────────┘ │ │
|
||||
│ │ │ [۸] │ │ │
|
||||
│ │ │ ┌──────────────────────────────────────┐ │ │
|
||||
│ │ │ │ [۹] │ │ │
|
||||
│ │ │ └──────────────────────────────────────┘ │ │
|
||||
│ │ │ [۱۰] │ │ │
|
||||
│ │ │ ┌──────────────────────────────────────┐ │ │
|
||||
│ │ │ │ [۱۱] │ │ │
|
||||
│ │ │ └──────────────────────────────────────┘ │ │
|
||||
│ │ │ [۱۲] [۱۳] │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
└──────────────┴───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۱ | نوار بالا | ناحیه | نام کاربر + خروج | — | `FR-01` |
|
||||
| ۲ | زنگ اعلان | آیکون + شمارنده | تعداد خواندهنشده | کلیک → `SCR-10` | `US-16` |
|
||||
| M1–M4 | منوی نقش | فهرست | «گزارشهای من»، «ثبت گزارش»، «اعلانها»، «خروج» | فقط آیتمهای مجاز نقش | `FR-02` |
|
||||
| ۳ | عنوان صفحه | تیتر | «ثبت گزارش خرابی» | — | `US-01`، `US-02` |
|
||||
| ۴ | برچسب عنوان | متن | «عنوان» + نشان اجباری | — | `FR-03` |
|
||||
| ۵ | ورودی عنوان | فیلد متنی | — | اجباری؛ حداکثر ۱۵۰ کاراکتر؛ شمارندهٔ کاراکتر | `US-01.feature` |
|
||||
| ۶ | برچسب توضیحات | متن | «توضیحات» + نشان اجباری | — | `FR-03` |
|
||||
| ۷ | ورودی توضیحات | ناحیهٔ متنی | — | اجباری | `US-01.feature` |
|
||||
| ۸ | برچسب محل خرابی | متن | «محل خرابی» + نشان اجباری | — | `FR-03` |
|
||||
| ۹ | ورودی محل | فیلد متنی | نمونه: «ساختمان الف - کلاس ۱۰۲» | اجباری | `US-01.feature` |
|
||||
| ۱۰ | برچسب نوع تجهیز | متن | «نوع تجهیز» + نشان اجباری | — | `FR-03` |
|
||||
| ۱۱ | انتخاب نوع تجهیز | فهرست کشویی | روشنایی، تهویه، آسانسور، برق، پروژکتور، سایر | اجباری | `US-01.feature`، `README.md` |
|
||||
| ۱۲ | دکمهٔ انصراف | دکمهٔ ثانویه | «انصراف» | بازگشت به `SCR-02` | — |
|
||||
| ۱۳ | دکمهٔ ثبت | دکمهٔ اصلی | «ثبت گزارش» | ارسال؛ در انتظار: غیرفعال + نشانگر | `AD-02` |
|
||||
|
||||
**حالتهای نتیجه:**
|
||||
|
||||
| حالت | پیام | رفتار | مرجع |
|
||||
|---|---|---|---|
|
||||
| موفقیت | نمایش شناسهٔ یکتا | انتقال به `SCR-04` یا ماندن با پیام موفقیت | `US-01.feature` |
|
||||
| فیلد اجباری خالی | «این فیلد الزامی است» کنار فیلد | هیچ گزارشی ذخیره نمیشود | `US-01.feature` |
|
||||
| عنوان ۱۵۱ کاراکتر | «حداکثر طول عنوان ۱۵۰ کاراکتر است» | هیچ گزارشی ذخیره نمیشود | `US-01.feature` |
|
||||
| خطای سرور | «خطا در ثبت گزارش؛ لطفاً دوباره تلاش کنید» | **مقادیر فرم حفظ میشوند**، هیچ گزارش ناقصی ذخیره نمیشود | `US-01.feature` |
|
||||
|
||||
> **الزام P4:** در حالت خطای سرور، پاککردن فرم **ممنوع** است. این رفتار در `US-01.feature` صریحاً الزام شده است.
|
||||
|
||||
### ۴.۳. `SCR-05` — فهرست گزارشهای باز (کارمند تأسیسات)
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
├──────────────┬───────────────────────────────────────────────┤
|
||||
│ │ [۳] │
|
||||
│ [M1] │ [۴] [۵] [۶] [۷] │
|
||||
│ [M2] │ ┌──────────────────────────────────────────┐ │
|
||||
│ [M3] │ │ [۸] │ [۹] │ [۱۰] │ [۱۱] │ [۱۲] │ [۱۳] │ │
|
||||
│ │ ├──────────────────────────────────────────┤ │
|
||||
│ │ │ ... │ │
|
||||
│ │ │ ... │ │
|
||||
│ │ │ ... │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
│ │ [۱۴] │
|
||||
└──────────────┴───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۱ | نوار بالا | ناحیه | نام کاربر + خروج | — | — |
|
||||
| ۲ | زنگ اعلان | آیکون | — | → `SCR-10` | `US-16` |
|
||||
| M1–M4 | منوی نقش | فهرست | «گزارشهای باز»، «داشبورد»، «اعلانها»، «خروج» | — | `FR-02` |
|
||||
| ۳ | عنوان صفحه | تیتر | «گزارشهای باز» | — | `US-06` |
|
||||
| ۴ | فیلتر وضعیت | کشویی چندگزینه | از `report_statuses` | پیشفرض: همه بهجز «بستهشده» | `FR-08`، `US-06` |
|
||||
| ۵ | فیلتر اولویت | کشویی چندگزینه | از `priorities` | — | `FR-08` |
|
||||
| ۶ | جستوجو | فیلد متنی | جستوجو در عنوان و شناسه | — | `FR-08` |
|
||||
| ۷ | دکمهٔ پاککردن فیلتر | دکمهٔ ثانویه | «پاککردن فیلترها» | بازنشانی | — |
|
||||
| ۸ | ستون شناسه | ستون جدول | `report_no` | قابل مرتبسازی | — |
|
||||
| ۹ | ستون عنوان | ستون جدول | عنوان گزارش | لینک به `SCR-06` | — |
|
||||
| ۱۰ | ستون محل | ستون جدول | محل خرابی | — | `FR-03` |
|
||||
| ۱۱ | ستون اولویت | ستون جدول | بج اولویت | رنگبندی بر اساس سطح | `FR-07` |
|
||||
| ۱۲ | ستون وضعیت | ستون جدول | بج وضعیت | رنگبندی بر اساس وضعیت | `FR-11` |
|
||||
| ۱۳ | ستون تاریخ | ستون جدول | تاریخ ثبت (شمسی) | مرتبسازی پیشفرض: نزولی | — |
|
||||
| ۱۴ | صفحهبندی | ناحیه | تعداد در صفحه | — | `NFR-04` |
|
||||
|
||||
> **تعریف «باز»:** گزارشی که وضعیت آن «بستهشده» نیست. «باز» یک وضعیت رسمی نیست (`data-model.md` §۴.۲).
|
||||
|
||||
### ۴.۴. `SCR-06` — جزئیات گزارش (نمای تأسیسات)
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
├──────────────┬───────────────────────────────────────────────┤
|
||||
│ [M1] │ [۳] [۴] [۵] │
|
||||
│ [M2] │ ┌──────────────────┬────────────────────────┐ │
|
||||
│ [M3] │ │ [۶] │ [۷] │ │
|
||||
│ │ │ [۸] │ [۹] │ │
|
||||
│ │ │ [۱۰] │ [۱۱] │ │
|
||||
│ │ │ [۱۲] │ [۱۳] │ │
|
||||
│ │ │ │ [۱۴] │ │
|
||||
│ │ │ │ [۱۵] │ │
|
||||
│ │ └──────────────────┴────────────────────────┘ │
|
||||
│ │ [۱۶] │
|
||||
│ │ ┌──────────────────────────────────────────┐ │
|
||||
│ │ │ ... │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
└──────────────┴───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۳ | عنوان گزارش | تیتر | عنوان + شناسه | — | `FR-03` |
|
||||
| ۴ | بج وضعیت | بج | وضعیت جاری | — | `FR-11` |
|
||||
| ۵ | بج اولویت | بج | اولویت (در صورت تعیین) | — | `FR-07` |
|
||||
| ۶ | توضیحات | متن | توضیحات گزارشدهنده | — | `FR-03` |
|
||||
| ۷ | محل خرابی | متن | متن محل | — | `FR-03` |
|
||||
| ۸ | نوع تجهیز | متن | برچسب فارسی نوع | — | `FR-03` |
|
||||
| ۹ | گزارشدهنده | متن | نام نمایشی + نقش | — | — |
|
||||
| ۱۰ | تاریخ ثبت | متن | تاریخ شمسی | — | — |
|
||||
| ۱۱ | اطلاعات تکمیلی | فهرست | متن/تصویر + ارائهدهنده + زمان | — | `FR-04`، `US-04` |
|
||||
| ۱۲ | نتیجهٔ تعمیر | ناحیه | توضیحات + تعمیرکار + زمان | فقط در صورت وجود | `FR-12` |
|
||||
| ۱۳ | تعیین اولویت | کشویی + دکمه | «ذخیرهٔ اولویت» | فقط نقش تأسیسات | `FR-07`، `US-07` |
|
||||
| ۱۴ | تخصیص تعمیرکار | کشویی + دکمه | فهرست تعمیرکاران + «تخصیص» | فقط نقش تأسیسات | `FR-09`، `US-08` |
|
||||
| ۱۵ | تغییر وضعیت | کشویی + دکمه | فقط انتقالهای مجاز | گزینههای غیرمجاز نمایش داده نمیشوند | `FR-11`، `US-09` |
|
||||
| ۱۶ | تاریخچه | تایملاین | فهرست اقدامات به ترتیب زمانی | — | `FR-16`، `US-10` |
|
||||
|
||||
> **الزام ADR-06:** گزینههای کشویی «تغییر وضعیت» باید از جدول انتقالهای مجاز خوانده شوند، نه از کد. انتقالهای نامشخص (پرسشهای باز ۶ و ۷) نباید در رابط کاربری ظاهر شوند تا زمانی که تیم تصمیم بگیرد.
|
||||
|
||||
### ۴.۵. `SCR-07` — مأموریتهای من (تعمیرکار)
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
├──────────────┬───────────────────────────────────────────────┤
|
||||
│ [M1] │ [۳] │
|
||||
│ [M2] │ ┌──────────────────────────────────────────┐ │
|
||||
│ │ │ [۴] │ [۵] │ [۶] │ [۷] │ [۸] │ [۹] │ │
|
||||
│ │ ├──────────────────────────────────────────┤ │
|
||||
│ │ │ ... │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
└──────────────┴───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۳ | عنوان صفحه | تیتر | «مأموریتهای من» | — | `US-11` |
|
||||
| ۴ | ستون شناسه | ستون | `report_no` | — | — |
|
||||
| ۵ | ستون عنوان | ستون | عنوان گزارش | لینک به `SCR-08` | — |
|
||||
| ۶ | ستون محل | ستون | محل خرابی | — | — |
|
||||
| ۷ | ستون اولویت | ستون | بج اولویت | — | `FR-07` |
|
||||
| ۸ | ستون وضعیت | ستون | وضعیت تخصیص | — | `US-12`، `US-13` |
|
||||
| ۹ | ستون زمان تخصیص | ستون | تاریخ شمسی | — | — |
|
||||
|
||||
> **واژهشناسی:** «مأموریت» در `US-11` و `AD-04` همان «تخصیص» در `FR-09` است. رابط کاربری از واژهٔ «مأموریت» استفاده میکند چون زبان تعمیرکار است.
|
||||
|
||||
### ۴.۶. `SCR-08` — جزئیات مأموریت (تعمیرکار)
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
├──────────────┬───────────────────────────────────────────────┤
|
||||
│ [M1] │ [۳] [۴] │
|
||||
│ │ ┌──────────────────────────────────────────┐ │
|
||||
│ │ │ [۵] [۶] [۷] │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
│ │ [۸] │
|
||||
│ │ ┌──────────────────────────────────────────┐ │
|
||||
│ │ │ [۹] │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
│ │ [۱۰] [۱۱] [۱۲] │
|
||||
│ │ [۱۳] │
|
||||
│ │ ┌──────────────────────────────────────────┐ │
|
||||
│ │ │ ... │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
└──────────────┴───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۳ | عنوان + شناسه | تیتر | — | — | — |
|
||||
| ۴ | بج وضعیت | بج | — | — | `FR-11` |
|
||||
| ۵ | توضیحات خرابی | متن | — | — | `FR-03` |
|
||||
| ۶ | محل خرابی | متن | — | — | — |
|
||||
| ۷ | نوع تجهیز | متن | — | — | — |
|
||||
| ۸ | دکمهٔ «شروع تعمیر» | دکمه | فقط در وضعیت «ارجاعشده» | تغییر وضعیت به «در حال تعمیر» | `US-12` |
|
||||
| ۹ | فرم ثبت نتیجه | ناحیهٔ متنی + دکمه | توضیحات اقدامات | فقط پس از شروع تعمیر | `FR-12`، `US-13` |
|
||||
| ۱۰ | دکمهٔ «ثبت نتیجه» | دکمهٔ اصلی | — | تغییر وضعیت به «تعمیر انجامشده» | `US-13` |
|
||||
| ۱۱ | دکمهٔ «درخواست اطلاعات» | دکمهٔ ثانویه | — | باز شدن فرم درخواست | `FR-13`، `US-14` |
|
||||
| ۱۲ | فرم درخواست اطلاعات | ناحیهٔ متنی + دکمه | متن درخواست | ارسال به گزارشدهنده | `US-14`، `AD-04` |
|
||||
| ۱۳ | تاریخچه | تایملاین | — | — | `FR-16` |
|
||||
|
||||
> **پرسش باز ۶:** مکانیزم دقیق «انتظار برای دریافت اطلاعات» در `AD-04` علامتگذاری شده است. آیا وضعیت گزارش باید تغییر کند؟ تا تصمیمگیری، رابط کاربری فقط نشانگر «در انتظار پاسخ» نمایش میدهد و وضعیت گزارش را تغییر نمیدهد.
|
||||
|
||||
### ۴.۷. `SCR-09` — داشبورد مدیریتی
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] [۲] │
|
||||
├──────────────┬───────────────────────────────────────────────┤
|
||||
│ [M1] │ [۳] │
|
||||
│ [M2] │ ┌───────────┬───────────┬───────────┐ │
|
||||
│ │ │ [۴] │ [۵] │ [۶] │ │
|
||||
│ │ └───────────┴───────────┴───────────┘ │
|
||||
│ │ [۷] │
|
||||
│ │ ┌──────────────────────────────────────────┐ │
|
||||
│ │ │ [۸] │ │
|
||||
│ │ └──────────────────────────────────────────┘ │
|
||||
└──────────────┴───────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | مرجع |
|
||||
|---|---|---|---|---|
|
||||
| ۳ | عنوان | تیتر | «داشبورد» | `US-17` |
|
||||
| ۴ | کارت آمار | کارت | تعداد گزارشهای باز | `FR-17` |
|
||||
| ۵ | کارت آمار | کارت | تعداد درخواستهای فوری | `FR-17`، `US-17` |
|
||||
| ۶ | کارت آمار | کارت | تعداد کل گزارشها | `FR-17` |
|
||||
| ۷ | نمودار / فهرست | ناحیه | توزیع گزارشها بر اساس وضعیت | `FR-17` |
|
||||
| ۸ | فهرست کوتاه | جدول | آخرین گزارشهای فوری | `US-17` |
|
||||
|
||||
> **تفکیک نقش:** مدیر فقط مشاهده دارد (`FR-17`، `US-17`). کارمند تأسیسات علاوه بر داشبورد به `SCR-05` و `SCR-06` هم دسترسی دارد. سطح دسترسی کامل مدیر پرسش باز ۹ در `activity.md` است.
|
||||
|
||||
### ۴.۸. `SCR-12` — مودال تأیید یا رد تعمیر
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ [۱] │
|
||||
│ ┌────────────────────────────────────────────────────────┐ │
|
||||
│ │ [۲] │ │
|
||||
│ │ [۳] │ │
|
||||
│ │ ┌────────────────────────────────────────────────────┐ │ │
|
||||
│ │ │ [۴] │ │ │
|
||||
│ │ └────────────────────────────────────────────────────┘ │ │
|
||||
│ │ [۵] │ │
|
||||
│ │ [۶] [۷] │ │
|
||||
│ └────────────────────────────────────────────────────────┘ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
| # | عنصر | نوع | محتوا | رفتار | مرجع |
|
||||
|---|---|---|---|---|---|
|
||||
| ۱ | پوشش پسزمینه | لایه | — | کلیک بیرون: بستن مودال | — |
|
||||
| ۲ | عنوان مودال | تیتر | «تأیید یا رد تعمیر» | — | `US-05` |
|
||||
| ۳ | نتیجهٔ تعمیر | متن | توضیحات ثبتشده | — | `FR-12` |
|
||||
| ۴ | دلیل رد | ناحیهٔ متنی | فقط اگر «رد» انتخاب شود | اجباری در حالت رد | `US-05.feature` |
|
||||
| ۵ | ناحیهٔ خطا | پیام | — | «ذکر دلیل رد الزامی است» | `US-05.feature` |
|
||||
| ۶ | دکمهٔ تأیید | دکمهٔ اصلی | «تأیید تکمیل تعمیر» | بستن گزارش | `FR-14` |
|
||||
| ۷ | دکمهٔ رد | دکمهٔ خطر | «رد تعمیر» | ثبت رد + پیگیری | `US-05.feature` |
|
||||
|
||||
**حالتهای خطا:**
|
||||
|
||||
| حالت | پیام | رفتار | مرجع |
|
||||
|---|---|---|---|
|
||||
| رد بدون دلیل | «ذکر دلیل رد الزامی است» | وضعیت بدون تغییر میماند | `US-05.feature` |
|
||||
| کاربر غیرمجاز | «دسترسی مجاز نیست» | وضعیت بدون تغییر | `US-05.feature` |
|
||||
| وضعیت نامناسب | «این گزارش در وضعیت قابل تأیید نیست» | عملیات انجام نمیشود | `US-05.feature` |
|
||||
| کلیک دوباره | — | فقط یک تغییر وضعیت و یک ورودی تاریخچه | `US-05.feature` |
|
||||
|
||||
## ۵. اجزای مشترک (Component Inventory)
|
||||
|
||||
| شناسه | جزء | توضیح | استفاده در | مرجع |
|
||||
|---|---|---|---|---|
|
||||
| `CMP-01` | بج وضعیت | نمایش `label_fa` با رنگ متناظر | `SCR-02`، `SCR-04`، `SCR-05`، `SCR-06`، `SCR-07` | `FR-11` |
|
||||
| `CMP-02` | بج اولویت | نمایش `label_fa` با رنگ متناظر | `SCR-05`، `SCR-06`، `SCR-07` | `FR-07` |
|
||||
| `CMP-03` | جدول داده | ستونبندی، مرتبسازی، صفحهبندی | `SCR-02`، `SCR-05`، `SCR-07` | `NFR-04` |
|
||||
| `CMP-04` | فیلد فرم با اعتبارسنجی | برچسب + نشان اجباری + پیام خطای درجا | `SCR-01`، `SCR-03`، `SCR-12` | `US-01.feature` |
|
||||
| `CMP-05` | تایملاین تاریخچه | فهرست رویدادهای `report_history` | `SCR-04`، `SCR-06`، `SCR-08` | `FR-16` |
|
||||
| `CMP-06` | آپلود تصویر | انتخاب و پیشنمایش تصویر | `SCR-04` | `FR-04` |
|
||||
| `CMP-07` | زنگ اعلان | شمارندهٔ خواندهنشده + لینک به `SCR-10` | همهٔ صفحات داخلی | `US-16` |
|
||||
| `CMP-08` | نوار پیام | پیام موفقیت/خطای سطح صفحه | همهٔ صفحات | `NFR-03` |
|
||||
| `CMP-09` | منوی نقشمحور | آیتمهای منو بر اساس نقش | همهٔ صفحات داخلی | `FR-02` |
|
||||
| `CMP-10` | کادر تأیید | برای اقدامهای برگشتناپذیر (بستن گزارش) | `SCR-12` | `US-05` |
|
||||
|
||||
## ۶. قرارداد رنگی (پیشنهادی)
|
||||
|
||||
> رنگها **پیشنهادی** هستند و باید با پرسش باز ۲۴ تأیید شوند.
|
||||
|
||||
| وضعیت / اولویت | رنگ پیشنهادی | توضیح |
|
||||
|---|---|---|
|
||||
| ثبتشده | خاکستری | تازه ثبت شده، هنوز بررسی نشده |
|
||||
| ارجاعشده | آبی | در انتظار شروع تعمیر |
|
||||
| در حال تعمیر | نارنجی | در جریان |
|
||||
| تعمیر انجامشده | سبز روشن | در انتظار بازخورد گزارشدهنده |
|
||||
| بستهشده | سبز تیره | پایان یافته |
|
||||
| اولویت کم | خاکستری | — |
|
||||
| اولویت متوسط | آبی | — |
|
||||
| اولویت زیاد | نارنجی | — |
|
||||
| اولویت فوری | قرمز | باید در داشبورد برجسته شود (`US-17`) |
|
||||
|
||||
> **الزام دسترسپذیری:** رنگ نباید تنها حامل معنا باشد؛ متن برچسب همیشه در کنار رنگ نمایش داده میشود.
|
||||
|
||||
## ۷. پیامهای استاندارد رابط کاربری
|
||||
|
||||
این جدول، **متن دقیق** پیامها را از فایلهای Feature استخراج کرده تا در پیادهسازی، متن تغییر نکند:
|
||||
|
||||
| شناسه | متن پیام | شرایط | مرجع |
|
||||
|---|---|---|---|
|
||||
| `MSG-01` | «این فیلد الزامی است» | فیلد اجباری خالی | `US-01.feature`، `US-15.feature` |
|
||||
| `MSG-02` | «حداکثر طول عنوان ۱۵۰ کاراکتر است» | عنوان بیش از ۱۵۰ کاراکتر | `US-01.feature` |
|
||||
| `MSG-03` | «خطا در ثبت گزارش؛ لطفاً دوباره تلاش کنید» | خطای سرور در ذخیره | `US-01.feature` |
|
||||
| `MSG-04` | «نام کاربری یا رمز عبور اشتباه است» | اعتبارنامهٔ نامعتبر | `US-15.feature` |
|
||||
| `MSG-05` | «خطا در ورود؛ لطفاً بعداً تلاش کنید» | سرویس احراز هویت در دسترس نیست | `US-15.feature` |
|
||||
| `MSG-06` | «دسترسی مجاز نیست» | تلاش برای دسترسی غیرمجاز | `US-15.feature`، `US-05.feature` |
|
||||
| `MSG-07` | «ذکر دلیل رد الزامی است» | رد تعمیر بدون دلیل | `US-05.feature` |
|
||||
| `MSG-08` | «این گزارش در وضعیت قابل تأیید نیست» | تأیید در وضعیت نامناسب | `US-05.feature` |
|
||||
|
||||
## ۸. نکات و پرسشهای باز
|
||||
|
||||
| # | پرسش | اثر |
|
||||
|---|---|---|
|
||||
| ۲۳ | فناوری و فریمورک رابط کاربری چیست؟ | تعیین روش پیادهسازی همهٔ صفحات |
|
||||
| ۲۴ | پالت رنگی و هویت بصری دانشگاه چیست؟ | بخش ۶ موقت است |
|
||||
| ۲۵ | آیا رابط کاربری باید واکنشگرا (موبایل) باشد؟ | در `NFR-03` صریح نیست؛ بر چیدمان جدولها اثر دارد |
|
||||
| ۲۶ | سطح دسترسی دقیق مدیر (پرسش باز ۹ در `activity.md`) چیست؟ | تعیین آیتمهای منوی مدیر |
|
||||
| ۲۷ | آیا گزارشدهنده میتواند در هر زمان اطلاعات تکمیلی اضافه کند یا فقط پس از درخواست؟ | رفتار دکمهٔ «افزودن اطلاعات» در `SCR-04` |
|
||||
| ۲۸ | کانال اعلان (پرسش باز ۸) چیست؟ | محتوای `SCR-10` و `CMP-07` |
|
||||
| ۲۹ | آیا صفحهٔ «پروفایل کاربر» یا «تغییر رمز» لازم است؟ | در مستندات نیامده |
|
||||
| ۳۰ | آیا گزارشدهنده میتواند گزارش خود را ویرایش یا لغو کند؟ | در مستندات نیامده |
|
||||
|
||||
> **پرسش ۲۷ مهم است:** `AD-02` این را بهعنوان نکتهٔ مدلسازی علامت زده و `US-04` زمان آن را محدود نکرده است. تا تصمیمگیری، رابط کاربری دکمهٔ «افزودن اطلاعات» را فقط پس از درخواست نمایش میدهد (محافظهکارانهترین حالت).
|
||||
|
||||
---
|
||||
|
||||
**وضعیت سند:** نسخه اولیه (Draft) – آماده بازبینی
|
||||
Reference in New Issue
Block a user