diff --git a/phase_0/main/IRNazanin.ttf b/phase_0/main/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_0/main/IRNazanin.ttf differ diff --git a/phase_0/main/IRNazaninBold.ttf b/phase_0/main/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_0/main/IRNazaninBold.ttf differ diff --git a/phase_0/main/IRNazaninIrani.ttf b/phase_0/main/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_0/main/IRNazaninIrani.ttf differ diff --git a/phase_0/main/LiberationSerif-Bold.ttf b/phase_0/main/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_0/main/LiberationSerif-Bold.ttf differ diff --git a/phase_0/main/LiberationSerif-BoldItalic.ttf b/phase_0/main/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_0/main/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_0/main/LiberationSerif-Italic.ttf b/phase_0/main/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_0/main/LiberationSerif-Italic.ttf differ diff --git a/phase_0/main/LiberationSerif-Regular.ttf b/phase_0/main/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_0/main/LiberationSerif-Regular.ttf differ diff --git a/phase_0/main/PHASE0.pdf b/phase_0/main/PHASE0.pdf new file mode 100644 index 0000000..3e30330 Binary files /dev/null and b/phase_0/main/PHASE0.pdf differ diff --git a/phase_0/main/PHASE0.tex b/phase_0/main/PHASE0.tex new file mode 100644 index 0000000..3ef1ff3 --- /dev/null +++ b/phase_0/main/PHASE0.tex @@ -0,0 +1,291 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} + +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\sectionfont{\color{sectionColor}} % sets colour of sections + + + +\subsectionfont{\color{subsectionColor}} % sets colour of sections + +\renewcommand{\labelitemii}{$\star$} +\renewcommand{\labelitemiii}{$\star\#$} + +\renewcommand{\baselinestretch}{1.1} +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{ فاز صفر پروژه} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.20cm} + + مهلت ارسال:\\ + \textbf{{28 فروردین - }} + \textbf{{ساعت 23:59:59}} + + \vspace{0.10cm} +نگارش:\\ + \textbf{{احمد سلیمی و امیرمهدی نامجو}} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{فاز صفر} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + \Large \textbf{\\\\ +} + + + + + + +\section* {{\titr مقدمه - فاز صفر یعنی چی؟}} + +در این فاز شما باید مقدمات پروژه را حاضر کنید. این مقدمات شامل ابزارهای مورد استفاده در پروژه و همچنین طراحی معماری پروژه توسط دیاگرام \lr{UML} است. مراحل این فاز عبارت اند از: + +\begin{enumerate} +\item +\hyperref[subsec:trello]{\textcolor{blue}{راه‌اندازی \lr{Trello}}} + +\item +\hyperref[subsec:github]{\textcolor{blue}{راه اندازی مخزن \lr{GitHub}}} + +\item +\hyperref[subsec:uml]{\textcolor{blue}{طراحی \lr{UML} برای منطق پروژه}} + + +\end{enumerate} + +در بخش بعد، هر یک از این موارد شرح داده شده اند. + +\newpage +\section*{{\titr کارهایی که باید در فاز صفر انجام دهید}} + + +\subsection*{{\titr راه‌اندازی Trello}} + +\label{subsec:trello} + +مستند آموزشی این بخش، در پیوست این فاز موجود است. + +در این پروژه، شما بایستی کارهای هر شخص را در \lr{Trello} مشخص کرده و پس از انجام آن کار توسط هر شخص، تسک مربوط به آن را به بخش تسک‌های انجام شده منتقل کنید. + +هر یک از اعضای تیم پروژه، باید در سایت +\href{https://trello.com/}{\textcolor{blue}{\lr{trello.com}}} + یک حساب کاربری بسازد. سپس یکی از اعضای تیم، یک \lr{board} جدید ساخته و مابقی اعضا را به آن دعوت کند. + +حال در \lr{board} ساخته شده، تسک‌های زیر را معین کرده، و هر کدام را به یک نفر اختصاص دهید: + +\begin{itemize} + +\item +ایجاد مخزن \lr{Github} و \lr{commit} نام و شماره دانشجویی در \lr{README.md} (تسک به نفر اول \lr{assign} شود) + +\item +کامیت نام و شماره دانشجویی در \lr{README.md} (تسک به نفر دوم \lr{assign} شود) + +\item +کامیت نام و شماره دانشجویی در \lr{README.md} (تسک به نفر سوم \lr{assign} شود) + +\end{itemize} + +پس از انجام تسک ها آن‌ها را به بخش \lr{done} منتقل کنید. + +در ادامه‌ی کار نیز باید از این ابزار استفاده کنید ‌و تسک‌های خود را مدیریت کنید و در تحویل حضوری هر فاز، بورد شما بررسی می‌شود. + + +\newpage +\subsection*{{\titr راه‌اندازی مخزن GitHub}} +\label{subsec:github} + +همانطور که می‌دانید برای پروژه لازم است با گروهتان بر روی یک مخزن \lr{(repository)} گیت فعالیت کنید. برای ساختن این مخزن، کافیست وارد + \href{https://classroom.github.com/g/5Uo3x-M4}{\textcolor{blue}{\underline{این لینک}}} + شوید. + +ابتدا با لیستی مواجه می‌شوید که شماره دانشجویی تمام افراد در آن موجود است. شماره دانشجویی خود را بیابید و بر روی آن کلیک کنید. + +در صفحه‌ی بعد شما باید تیم خود را انتخاب کنید. چنانچه نفر اول گروه خود (سازنده‌ی مخزن) هستید، باید یک تیم بسازید. تنها شماره‌ی گروه پروژه خود را در قسمت نام تیم وارد کنید و تیم را بسازید. نفرات بعدی گروه شما، باید تیم‌شان را از لیست تیم‌های موجود انتخاب کنند و نیازی به ایجاد تیم ندارند. + +پس از این مراحل مخزن شما آماده خواهد شد و لینک آن در اختیارتان قرار خواهد گرفت. پس از آماده شدن این مخزن، هر یک از اعضای پروژه باید نام و شماره دانشجویی خود را به فایل \lr{README.md} اضافه کند. + +\newpage +\subsection*{{\titr طراحی UML برای منطق پروژه}} +\label{subsec:uml} + +مستند فاز اول پروژه به زودی منتشر خواهد شد. + +برای این بخش، شما لازم است مستند فاز اول پروژه را به طور کامل و دقیق مطالعه نمایید. سپس یک \lr{UML} مناسب برای تمام بخش‌های منطق پروژه طراحی کنید. فایل ارسالی شما باید یک فایل \lr{zip}، حاوی تصاویر مربوط به \lr{UML} باشد. + +نکته: برای رسم uml می توانید از هر ابزار دلخواهی استفاده کنید. + +مستند آموزشی \lr{UML} نیز در پیوست این فاز موجود است. + + + +\end{document} + + + + + + + + + diff --git a/phase_0/main/XB Zar bold.ttf b/phase_0/main/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_0/main/XB Zar bold.ttf differ diff --git a/phase_0/main/XB Zar.ttf b/phase_0/main/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_0/main/XB Zar.ttf differ diff --git a/phase_0/main/sharif.png b/phase_0/main/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_0/main/sharif.png differ diff --git a/phase_0/main/sharif1.png b/phase_0/main/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_0/main/sharif1.png differ diff --git a/phase_0/main/tex.bib b/phase_0/main/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_0/main/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_0/trello/IRNazanin.ttf b/phase_0/trello/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_0/trello/IRNazanin.ttf differ diff --git a/phase_0/trello/IRNazaninBold.ttf b/phase_0/trello/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_0/trello/IRNazaninBold.ttf differ diff --git a/phase_0/trello/IRNazaninIrani.ttf b/phase_0/trello/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_0/trello/IRNazaninIrani.ttf differ diff --git a/phase_0/trello/LiberationSerif-Bold.ttf b/phase_0/trello/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_0/trello/LiberationSerif-Bold.ttf differ diff --git a/phase_0/trello/LiberationSerif-BoldItalic.ttf b/phase_0/trello/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_0/trello/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_0/trello/LiberationSerif-Italic.ttf b/phase_0/trello/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_0/trello/LiberationSerif-Italic.ttf differ diff --git a/phase_0/trello/LiberationSerif-Regular.ttf b/phase_0/trello/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_0/trello/LiberationSerif-Regular.ttf differ diff --git a/phase_0/trello/XB Zar bold.ttf b/phase_0/trello/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_0/trello/XB Zar bold.ttf differ diff --git a/phase_0/trello/XB Zar.ttf b/phase_0/trello/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_0/trello/XB Zar.ttf differ diff --git a/phase_0/trello/images/image1.png b/phase_0/trello/images/image1.png new file mode 100644 index 0000000..3a02574 Binary files /dev/null and b/phase_0/trello/images/image1.png differ diff --git a/phase_0/trello/images/image10.png b/phase_0/trello/images/image10.png new file mode 100644 index 0000000..b5ef941 Binary files /dev/null and b/phase_0/trello/images/image10.png differ diff --git a/phase_0/trello/images/image2.png b/phase_0/trello/images/image2.png new file mode 100644 index 0000000..e6168f1 Binary files /dev/null and b/phase_0/trello/images/image2.png differ diff --git a/phase_0/trello/images/image3.png b/phase_0/trello/images/image3.png new file mode 100644 index 0000000..d769ddf Binary files /dev/null and b/phase_0/trello/images/image3.png differ diff --git a/phase_0/trello/images/image4.png b/phase_0/trello/images/image4.png new file mode 100644 index 0000000..97e0495 Binary files /dev/null and b/phase_0/trello/images/image4.png differ diff --git a/phase_0/trello/images/image5.png b/phase_0/trello/images/image5.png new file mode 100644 index 0000000..8e78577 Binary files /dev/null and b/phase_0/trello/images/image5.png differ diff --git a/phase_0/trello/images/image6.png b/phase_0/trello/images/image6.png new file mode 100644 index 0000000..370d7e4 Binary files /dev/null and b/phase_0/trello/images/image6.png differ diff --git a/phase_0/trello/images/image7.png b/phase_0/trello/images/image7.png new file mode 100644 index 0000000..dbc0e65 Binary files /dev/null and b/phase_0/trello/images/image7.png differ diff --git a/phase_0/trello/images/image8.png b/phase_0/trello/images/image8.png new file mode 100644 index 0000000..77f580c Binary files /dev/null and b/phase_0/trello/images/image8.png differ diff --git a/phase_0/trello/images/image9.png b/phase_0/trello/images/image9.png new file mode 100644 index 0000000..37998dc Binary files /dev/null and b/phase_0/trello/images/image9.png differ diff --git a/phase_0/trello/sharif.png b/phase_0/trello/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_0/trello/sharif.png differ diff --git a/phase_0/trello/sharif1.png b/phase_0/trello/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_0/trello/sharif1.png differ diff --git a/phase_0/trello/tex.bib b/phase_0/trello/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_0/trello/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_0/trello/trello.pdf b/phase_0/trello/trello.pdf new file mode 100644 index 0000000..902194b Binary files /dev/null and b/phase_0/trello/trello.pdf differ diff --git a/phase_0/trello/trello.tex b/phase_0/trello/trello.tex new file mode 100644 index 0000000..2d0ea70 --- /dev/null +++ b/phase_0/trello/trello.tex @@ -0,0 +1,374 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} + +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\sectionfont{\color{sectionColor}} % sets colour of sections + + + +\subsectionfont{\color{subsectionColor}} % sets colour of sections + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{ آشنایی با Trello} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{یاشار ظروفچی}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو}} + + + \vspace{0.05cm} + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{فاز صفر} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + \Large \textbf{\\ +} + + +\section*{{\titr مقدمه - Trello چیست؟}} + +ابزار \lr{Trello} یک نرم‌افزار تحت وب است که برای مدیریت کار (بعضا از آن به‌عنوان مدیریت پروژه نیز یاد می‌شود) به کار می‌رود. این برنامه از ساختار کانبانی تبعیت می‌کند. کلید‌واژه‌های گفته شده به مرور تبیین و توصیف می‌شوند. + +نرم‌افزارهای مدیریت پروژه ابزارهایی هستند که می‌توان از آن‌ها برای برنامه ریزی، هماهنگی، همکاری و تقسیم وظایف در انجام پروژه‌ها استفاده کرد. + +\begin{center} + +\includegraphics[width=0.8\textwidth]{images/image9.png} + +\end{center} + +\newpage + +\section*{{\titr ساختار Trello}} + +کانبان (که در زبان ژاپنی به معنی تختهٔ اعلان است) روشی برای مدیریت و بهبود کار در سیستم‌های توسعهٔ انسانی است. این رویکرد با هدف مدیریت کردن کارها از طریق متعادل کردن تقاضا با ظرفیت‌های موجود، و همچنین بهبود عملکرد تنگناهای سطح سیستم انجام می‌شود. + +تابلوهای کانبان، بر اساس محتوایی که در آن استفاده می‌شود به صورت اختصاصی طراحی می‌شوند بنابراین، به‌طور قابل توجهی با یکدیگر تمایز دارند. در مورد پیاده‌سازی این معماری موارد زیر مطرح می‌شوند: + +\begin{enumerate} +\item +کارهای خود را مجسم کنید. + +\item +کارهای در حال انجام را محدود کنید. + +\item +سیاست‌ها را به صراحت بیان کنید. + +\item +جریان کاری را مدیریت کنید. + +\item +روال‌های بازخورد انجام دهید. + +\item +به صورت مشارکتی پیشرفت کنید. + +\end{enumerate} + +یکی از نکات مهم در انجام پروژه‌های گروهی تقسیم وظایف است. \lr{Trello} ابزاری است که به این مهم کمک می‌کند. همچنین + \lr{Pair programming} + نیز یکی دیگر از مواردی است که در این‌گونه پروژه‌ها لازم است که معادل این فرض است: + +هیچ \lr{task} ای پایان نخواهد پذیرفت مگر همگی به آگاهی لازم برای برخورد با آن بخش پروژه رسیده باشند. + +در \lr{Trello} با قابلیت‌هایی که خواهیم دید متوجه خواهیم شد که انجام این روال‌های گفته شده تا چه حد منظم‌تر خواهد بود. + +\newpage + +\section*{{\titr آغاز کار با Trello}} + +\begin{itemize} + +\item + +مانند عموم برنامه‌های تحت وب می‌بایست یک حساب کاربر در آن ایجاد کنید یا از حساب گوگل خود برای ورود استفاده کنید. + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image1.png} + +\end{center} + +\item + +پس از ساخت حساب و ورود به سایت، شما وارد صفحه‌ای می‌شود که \lr{Board} (تخته)‌ های شما نمایان است. در صورتی که تاکنون \lr{Board}ی نداشته‌اید اقدام به ساخت یک تختهٔ جدید کنید. + +یک \lr{Board} می‌تواند به ۲ صورت زیر باشد: + +\begin{enumerate} + +\item +خصوصی یا \lr{private}؛ تنها به کسانی که شما اجازه می‌دهید امکان مشاهده داده شده است. + +\item +عمومی یا \lr{public}؛ هر کسی می‌تواند تخته شما را رؤیت کند. + +\end{enumerate} + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image4.png} + +\end{center} + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image10.png} + +\end{center} + +\item + +پس از ساخت \lr{Board}، اقدام به تعریف لیست‌های خود کنید. یکی از روش‌های تعریف لیست، تعیین وضعیت کار (\lr{task}) است. برای مثال: تعریف‌شده \lr{(to do)}، در حال پیگیری \lr{(doing)}، در حال بازبینی \lr{(review)} و پایان یافته \lr{(done)}. لیست‌ها باید طوری تعریف شوند که یک \lr{Card} نتواند در دو لیست قرار گیرد. + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image2.png} + +\end{center} + +\item + +آیتم \lr{Card}، کوچکترین کار (\lr{task})ی است که استقلال خود را حفظ می‌کند. برای مثال فرض کنید یک سامانهٔ انتخاب واحد نوشته‌اید. اینکه حین برداشتن درس، در صورتی که ظرفیت داشته باشد جزو درس‌های گرفته شده رود، در صورت باز بودن ظرفیت رزرو، شما را در لیست انتظار قرار دهد وگرنه امکان اخذ واحد را از شما سلب کند، هنگام تعریف پروژه، همه تحت عنوان یک کارت «درخواست درس» قرار خواهند گرفت؛ زیرا اجزای مختلف این فرآیند در صورت ناقص بودن به هیچ‌وجه قابل قبول نخواهند بود؛ به عبارت دیگر، روال‌های گفته شده به یکدیگر وابسته‌اند و نقطهٔ گذاری بین آن‌ها نیست. ولی تعریف یک کارت تحت عنوان « طراحی و عیب‌یابی سامانهٔ انتخاب واحد » صحیح نیست. زیرا این سامانه بخش‌های مختلفی دارد که هرکدام مستقلا کاری را انجام می‌دهند. برای مثال مشاهدهٔ لیست درس‌ها ارتباطی با واحد‌های دریافت شده از نظر عملیاتی ندارد و می‌توانند مستقل از همدیگر یکی درست عمل کند و دیگر نادرست. + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image8.png} + +\end{center} + +\item +هر \lr{Card} محتوا و اشیاء گوناگونی را می‌تواند دربرگیرد: + + +\begin{itemize} +\item +چک‌لسیت + +\item +پیوست + +\item +توضیحات + +\item +شرح فعالیت + +\item +برچسب + +\end{itemize} + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image5.png} + +\end{center} + +\begin{center} + +\includegraphics[width=1.0\textwidth]{images/image6.png} + +\end{center} + +\item +همچنین برای کارت‌ها دو طرف وجود دارد: + +\begin{itemize} + +\item +تحویل گیرنده (\lr{Assigner}) که عموما مسئولیت مشاهده یا \lr{watch} بر عهدهٔ وی است. + +\item +تحویل دهنده (\lr{Assignee}) که در لیست اعضا نامشان آمده است. + +\end{itemize} + +برای هر کارت، ضرب‌الاجل یا \lr{deadline} نیز تحت عنوان \lr{due date} (زمان مقرر) مطرح می‌شود. + +\begin{center} + +\includegraphics[width=0.8\textwidth]{images/image7.png} + +\end{center} + +\end{itemize} + +\end{document} + + + + + + + + + diff --git a/phase_0/uml/IRNazanin.ttf b/phase_0/uml/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_0/uml/IRNazanin.ttf differ diff --git a/phase_0/uml/IRNazaninBold.ttf b/phase_0/uml/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_0/uml/IRNazaninBold.ttf differ diff --git a/phase_0/uml/IRNazaninIrani.ttf b/phase_0/uml/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_0/uml/IRNazaninIrani.ttf differ diff --git a/phase_0/uml/LiberationSerif-Bold.ttf b/phase_0/uml/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_0/uml/LiberationSerif-Bold.ttf differ diff --git a/phase_0/uml/LiberationSerif-BoldItalic.ttf b/phase_0/uml/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_0/uml/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_0/uml/LiberationSerif-Italic.ttf b/phase_0/uml/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_0/uml/LiberationSerif-Italic.ttf differ diff --git a/phase_0/uml/LiberationSerif-Regular.ttf b/phase_0/uml/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_0/uml/LiberationSerif-Regular.ttf differ diff --git a/phase_0/uml/XB Zar bold.ttf b/phase_0/uml/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_0/uml/XB Zar bold.ttf differ diff --git a/phase_0/uml/XB Zar.ttf b/phase_0/uml/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_0/uml/XB Zar.ttf differ diff --git a/phase_0/uml/images/image1.png b/phase_0/uml/images/image1.png new file mode 100644 index 0000000..cf1b6ef Binary files /dev/null and b/phase_0/uml/images/image1.png differ diff --git a/phase_0/uml/images/image10.png b/phase_0/uml/images/image10.png new file mode 100644 index 0000000..a7ef48f Binary files /dev/null and b/phase_0/uml/images/image10.png differ diff --git a/phase_0/uml/images/image11.png b/phase_0/uml/images/image11.png new file mode 100644 index 0000000..f5e2004 Binary files /dev/null and b/phase_0/uml/images/image11.png differ diff --git a/phase_0/uml/images/image12.png b/phase_0/uml/images/image12.png new file mode 100644 index 0000000..51bc7e3 Binary files /dev/null and b/phase_0/uml/images/image12.png differ diff --git a/phase_0/uml/images/image13.png b/phase_0/uml/images/image13.png new file mode 100644 index 0000000..7362b34 Binary files /dev/null and b/phase_0/uml/images/image13.png differ diff --git a/phase_0/uml/images/image14.png b/phase_0/uml/images/image14.png new file mode 100644 index 0000000..78786c4 Binary files /dev/null and b/phase_0/uml/images/image14.png differ diff --git a/phase_0/uml/images/image15.png b/phase_0/uml/images/image15.png new file mode 100644 index 0000000..f5f346f Binary files /dev/null and b/phase_0/uml/images/image15.png differ diff --git a/phase_0/uml/images/image2.png b/phase_0/uml/images/image2.png new file mode 100644 index 0000000..476121d Binary files /dev/null and b/phase_0/uml/images/image2.png differ diff --git a/phase_0/uml/images/image3.png b/phase_0/uml/images/image3.png new file mode 100644 index 0000000..371212f Binary files /dev/null and b/phase_0/uml/images/image3.png differ diff --git a/phase_0/uml/images/image4.png b/phase_0/uml/images/image4.png new file mode 100644 index 0000000..e7b0535 Binary files /dev/null and b/phase_0/uml/images/image4.png differ diff --git a/phase_0/uml/images/image5.png b/phase_0/uml/images/image5.png new file mode 100644 index 0000000..84a904f Binary files /dev/null and b/phase_0/uml/images/image5.png differ diff --git a/phase_0/uml/images/image6.png b/phase_0/uml/images/image6.png new file mode 100644 index 0000000..3e781cd Binary files /dev/null and b/phase_0/uml/images/image6.png differ diff --git a/phase_0/uml/images/image7.png b/phase_0/uml/images/image7.png new file mode 100644 index 0000000..71bbf45 Binary files /dev/null and b/phase_0/uml/images/image7.png differ diff --git a/phase_0/uml/images/image8.png b/phase_0/uml/images/image8.png new file mode 100644 index 0000000..d769ddf Binary files /dev/null and b/phase_0/uml/images/image8.png differ diff --git a/phase_0/uml/images/image9.png b/phase_0/uml/images/image9.png new file mode 100644 index 0000000..0c57dcd Binary files /dev/null and b/phase_0/uml/images/image9.png differ diff --git a/phase_0/uml/sharif.png b/phase_0/uml/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_0/uml/sharif.png differ diff --git a/phase_0/uml/sharif1.png b/phase_0/uml/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_0/uml/sharif1.png differ diff --git a/phase_0/uml/tex.bib b/phase_0/uml/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_0/uml/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_0/uml/uml.pdf b/phase_0/uml/uml.pdf new file mode 100644 index 0000000..07eea69 Binary files /dev/null and b/phase_0/uml/uml.pdf differ diff --git a/phase_0/uml/uml.tex b/phase_0/uml/uml.tex new file mode 100644 index 0000000..0a805b8 --- /dev/null +++ b/phase_0/uml/uml.tex @@ -0,0 +1,649 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} + +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{caption} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\sectionfont{\color{sectionColor}} % sets colour of sections + + + +\subsectionfont{\color{subsectionColor}} % sets colour of sections + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} +\setlength{\parskip}{1.2pt} + + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{آموزش UML} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{زهرا یوسفی جمارانی}} + + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو}} + + \vspace{0.05cm} + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{آموزش UML} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + \Large \textbf{\\ +} + + +\section*{{\titr مقدمه - UML چیست؟}} + +\lr{Unified Modeling Language} یک زبان مدلسازی در مهندسی نرم افزار است که هدف اصلی آن تعریف یک روش استاندارد برای نمایش طراحی سیستم هاست.این زبان در ابتدا در سال های \lr{1994-95} توسعه یافت و امروزه به صورت گسترده برای مدلسازی استفاده میشود. + +\begin{center} + +\includegraphics[width=0.22\textwidth]{images/image4.png} + +\end{center} + + + +\section*{{\titr چرا UML ?}} + +برای شروع یک پروژه ممکن است فردی بدون هیچ فکر قبلی درباره ابعاد پروژه شروع به کد زدن کند و سپس به مرور کد ها را اضافه کند؛ مشکل این روش آن است که در نهایت این پروژه یک معماری مناسب نخواهد داشت و شاید حتی در میانه کار کدنویس گیج شود! + + بهترین کار برای جلوگیری از این مشکل داشتن یک نگاه اجمالی بر پروژه و در نظر گرفتن همه ی ابعاد پروژه است؛ این کار با مدلسازی کل پروژه قبل از شروع به کد زدن توسط زبان‌های مدلسازی از جمله \lr{UML} انجام می‌شود. + +در نتیجه استفاده از یو ام ال هزینه تغییر شیوه ی معماری و تعویض کد را به شدت کاهش می‌دهد! + +در ابتدا شاید کشیدن \lr{UML} کمی سخت باشد اما با توجه به اینکه چیزی که شما می‌کشید مبنای شروع کد زنی شما برای فاز اول پروژه خواهد بود، لازم است تا با تسلط تمام کشیده شود؛پس از پاک کردن و از اول شروع کردن در مرحله \lr{UML} نترسید! + +نمودارهای کلاس (\lr{class diagram}) مشهور ترین نمودارهای \lr{UML} هستند که در اینجا به توضیح آن می‌پردازیم. + +\newpage + +\section*{{\titr اصول و قواعد }} + +نکاتی که باید در طراحی نمودارهای خود به آن ها توجه کنید: + +\begin{itemize} + +\item +نام کلاس‌های شما باید معنا دار باشد + +\item +تمام فرآیندها، مسیرها و روابط باید مشخص شود + +\item +متودها و صفات هر کلاس باید مشخص شود + + + +\end{itemize} + + +\subsection*{{\titr عناصر مهم در نمودار کلاس:}} + +\begin{enumerate} + +\item + +نام کلاس + +\item +صفات + +\item +اعمال + +\item +روابط + +\end{enumerate} + + +\begin{center} + +\includegraphics[width=0.85\textwidth]{images/image11.png} + +\end{center} + +\begin{itemize}[label=\textcolor{listColor}{$\blacklozenge$}] + \item + {\fehrest \textcolor{listColor}{نام کلاس:}} + + + \begin{enumerate} + +\item + با حرف بزرگ شروع شود + +\item +پررنگ نوشته شود + +\item +در وسط نوشته شود (تراز در وسط) + +\item +اگر کلاس \lr{abstract} است به صورت \textit{\lr{italic}} نوشته شود + + + + + \end{enumerate} + + \newpage + + \item + {\fehrest \textcolor{listColor}{صفات: }} + + + در این بخش باید صفاتی که این کلاس مدل می‌کند را اضافه کنید مثلا برای یک دانشجو می‌توان مدلسازی زیر را قائل شد: + + + \begin{center} + +\includegraphics[]{images/image15.png} + +\end{center} + +باید برای هر صفت دسترسی آن نیز مشخص شود که به صورت زیر است: + +\begin{itemize}[label={\textbullet}] + +\item +\lr{Public} (دسترسی در همه جا): + + +\item +\lr{Private} (دسترسی درون کلاسی) : - + +\item +\lr{Protected} (دسترسی در کلاس های فرزند) : \# + +\item +\lr{Package} (درون پکیج) : \char`~ + + + +\end{itemize} + +نکات: + +\begin{itemize}[label={\textbullet}] + +\item +صفات باید نام مناسب داشته باشند. + +\item +برای صفات باید نوع داده آن‌ها را مشخص کنید؛ مثلا: \lr{String} ،\lr{int} و ….. + + +\end{itemize} + + \item + {\fehrest \textcolor{listColor}{اعمال :}} + + + در این قسمت باید تابع های هر کلاس را اضافه کنید و باید توجه داشته باشید که: + +\begin{itemize}[label={\textbullet}] + +\item +ابتدا باید نوع دسترسی تابع را مشخص کنید + +\item +نام معناداری انتخاب کنید + +\item +پارامتر‌های ورودی را همراه نوع داده‌ی آن مشخص کنید + +\item +نوع داده‌ای که تابع بر می‌گرداند \lr{(return type)} را در انتهای خط پس از \linebreak علامت : مشخص کنید + +مثلا : + +\begin{center} +\begin{latin} ++ method ( param : int ) : String + +\end{latin} +\end{center} + + + +\end{itemize} + + +\begin{center} + + +\begin{figure}[h!] + + \includegraphics[width=1.0\textwidth]{images/image7.png} + \captionsetup{labelformat=empty} + \caption{به \lr{in} و \lr{inout} در شکل توجه نکنید +} +\end{figure} + + +\end{center} +\newpage + + + \item + {\fehrest \textcolor{listColor}{روابط: }} + + \begin{itemize}[label={\textbullet}] + \item + + وابستگی + + \item +تعمیم و وراثت + +\item + +انجمنی + +\item + +تفهیم + +\end{itemize} + + \begin{center} + +\includegraphics[]{images/image2.png} + +\end{center} +\newpage +\begin{itemize}[label=\textcolor{umlrelcolor}{$\blacksquare$}] + \item + {\fehrest \textcolor{umlrelcolor}{وابستگی :(Dependency) + }} + + + + وابستگی به معنای رابطه بین دو یا تعداد بیشتری کلاس است که ممکن است تغییر در یک کلاس، تغییر در کلاس دیگر را ایجاب کند. + +همان طور که از اسم این رابطه مشخص است به این معناست که یک کلاس به دیگری وابسته است. + + + \begin{center} + +\includegraphics[]{images/image3.png} + +\end{center} + + + \item + {\fehrest \textcolor{umlrelcolor}{تعمیم و وراثت ( Inheritance and Generalization ): + }} + + + + این رابطه کلاس فرزند را به پدر مربوط می کند؛ در واقع کلاس فرزند از پدر ارث بری می‌کند. +توجه کنید ازین رابطه برای interface ها نباید استفاده کرد!!! + + + \begin{center} + +\includegraphics[width=0.75\textwidth]{images/image10.png} + +\end{center} + +\newpage + + \item + {\fehrest \textcolor{umlrelcolor}{انجمنی :(Association) + }} + + + + برای نمایش روابط ایستا بکار می‌رود مثلا: کارمند \underline{کار می‌کند} برای کارخانه و یا: + + + + \begin{center} + +\includegraphics[]{images/image5.png} + +\end{center} + + انواع روابط انجمنی: + + \begin{enumerate} + +\item +تجمع (\lr{Aggregation}): + + این رابطه یک نوع خاص از روابط انجمنی است که رابطه بین کل و اجزای آن را مدل می‌کند. توجه کنید در این رابطه کلاس ها به طور کامل به هم وابسته نیستند؛ مثلا +در رابطه‌ی زیر کلاس دانشگاه حتی اگر دانشجو نیز نباشد باقی خواهد ماند. + +\begin{center} + + + \includegraphics[]{images/image9.png} + + + + +\end{center} + + \newpage + \item +ترکیب (\lr{Composition}): + +این رابطه نوع قوی‌تر رابطه‌ی قبلی است به این صورت که دو یا چند کلاس کاملا به هم وابسته‌اند؛ مثلا: + + +\begin{center} + + + \includegraphics[]{images/image13.png} + + + + +\end{center} + +در اینجا اگر \lr{O} یا \lr{H} نباشد کلاس \lr{H2O} نمی‌تواند باشد. + + + +\item +نرمال (\lr{Normal}): + + رابطه‌ی عادی بین دو کلاس مثلا: + + + \begin{center} + + + \includegraphics[]{images/image6.png} + + + + +\end{center} + + +\end{enumerate} + + \newpage + + \item + {\fehrest \textcolor{umlrelcolor}{تفهیم :(Realization) + }} + + + + این رابطه به نام تفهیم یا تحقق نام دارد و کلاس های دیگر وظیفه‌ی تکمیل کردن دارند؛ مثلا برای interface و enum ها بکار می‌رود. + + + + \begin{center} + + + \includegraphics[width=0.75\textwidth]{images/image12.png} + + + + +\end{center} + + +\end{itemize} + + + \item + {\fehrest \textcolor{listColor}{نکات: }} + + \begin{enumerate} + +\item +برای نمایش \lr{static} از زیر خط (\lr{underline}) استفاده می‌کنیم. +\item +چندی (Multiplicity) را نیز می‌توانید با نوشتن عدد یک (نمایندهٔ یک نمونه) و یا $*$ (نمایندهٔ چند نمونه) روی خط رابطه نمایش دهید. (مانند نمونه) + + \end{enumerate} + + \newpage + \item + {\fehrest \textcolor{listColor}{نمونه: }} + + + \begin{center} + + + \includegraphics[width=1.0\textwidth]{images/image14.png} + + + + +\end{center} + + +\end{itemize} + + + + + + +\newpage + +\section*{{\titr نرم افزارها و سایت های رسم UML}} + +\begin{enumerate} + +\item + +\href{https://www.lucidchart.com/pages/}{\textcolor{blue}{\underline{سایت Lucidchart}}} + + +\item + +\href{https://products.office.com/en/visio/flowchart-software}{\textcolor{blue}{\underline{نرم افزار \lr{Microsoft Visio}}}} + + +\item + +\href{https://www.umlet.com/changes.htm}{\textcolor{blue}{\underline{نرم افزار UMLet}}} + + +\item + +\href{https://online.visual-paradigm.com/}{\textcolor{blue}{\underline{نرم افزار \lr{Visual Paradigm}}}} + + +\item + +\href{https://www.modelio.org/}{\textcolor{blue}{\underline{نرم افزار Modelio}}} + + +\item + +\href{https://app.diagrams.net/}{\textcolor{blue}{\underline{سایت \lr{Draw.io}}}} + + + +\end{enumerate} + + +\end{document} + + + + + + + + + diff --git a/phase_1/main/IRNazanin.ttf b/phase_1/main/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_1/main/IRNazanin.ttf differ diff --git a/phase_1/main/IRNazaninBold.ttf b/phase_1/main/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_1/main/IRNazaninBold.ttf differ diff --git a/phase_1/main/IRNazaninIrani.ttf b/phase_1/main/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_1/main/IRNazaninIrani.ttf differ diff --git a/phase_1/main/LiberationSerif-Bold.ttf b/phase_1/main/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_1/main/LiberationSerif-Bold.ttf differ diff --git a/phase_1/main/LiberationSerif-BoldItalic.ttf b/phase_1/main/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_1/main/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_1/main/LiberationSerif-Italic.ttf b/phase_1/main/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_1/main/LiberationSerif-Italic.ttf differ diff --git a/phase_1/main/LiberationSerif-Regular.ttf b/phase_1/main/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_1/main/LiberationSerif-Regular.ttf differ diff --git a/phase_1/main/PHASE1.pdf b/phase_1/main/PHASE1.pdf new file mode 100644 index 0000000..b459c47 Binary files /dev/null and b/phase_1/main/PHASE1.pdf differ diff --git a/phase_1/main/PHASE1.tex b/phase_1/main/PHASE1.tex new file mode 100644 index 0000000..81e84f4 --- /dev/null +++ b/phase_1/main/PHASE1.tex @@ -0,0 +1,2564 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{ فاز اول پروژه} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.20cm} + + مهلت ارسال:\\ + \textbf{{۲۳ اردیبهشت - }} + \textbf{{ساعت 23:59:59}} + + \vspace{0.10cm} +مسئول پروژه:\\ + \textbf{\authorFont{احمد سلیمی}} + + \vspace{0.10cm} +مسئول فاز اول:\\ + \textbf{\authorFont{یاشار ظروفچی}} + + \vspace{0.10cm} +طراحان فاز اول:\\ + \textbf{\authorFont{محمد‌سپهر پورقناد، علیرضا تاجمیر ریاحی، سارا خسروی، سجاد ریحانی، علیرضا شاطری، محمد فراهانی}} + + \vspace{0.05cm} +مسئول تنظیم داک:\\ + \textbf{\authorFont{امیرمهدی نامجو}} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{فاز اول} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + +\tableofcontents + +\newpage + + \Large \textbf{\\\\ +} + + +\section*{{\titr نکات قابل توجه}} +\addcontentsline{toc}{section}{{\fehrestContent نکات قابل توجه}} +\begin{itemize} +\item +پس از اتمام این فاز، در گیت خود یک تگ با عنوان \lr{"phase\_1"} بزنید. در روز تحویل حضوری این tag بررسی خواهد شد و کدهای پس از آن نمره‌ای نخواهد گرفت. + +\item +در روز تحویل حضوری مشارکت تمام اعضای تیم در پروژه بررسی خواهد‌ شد و در صورت عدم مشارکت بعضی از اعضا، نمرهٔ ایشان برای آن فاز پروژه "صفر" لحاظ می‌گردد. مشارکت، با توجه به commit های افراد تیم در مخزن گیت‌هاب پروژه بررسی می‌شود. + +\item +در هر فاز می‌توانید سه روز تاخیر به ازای کسر نمره داشته‌ باشید که به ازای هر روز آن، ۱۰ درصد از نمرهٔ آن فاز را از دست خواهید‌ داد. در مجموع سه‌فاز پروژه، سه روز تاخیر نیز بخشیده خواهد‌ شد. + +\item +به ازای هر ساعتی که پروژه را زودتر تحویل دهید، ۱۵ دقیقه به مهلت تاخیر بدون کسر نمره شما اضافه خواهد‌ شد. این مقدار حداکثر یک روز خواهد‌ بود که در صورت ارسال ۴ روز زودتر از ددلاین به شما تعلق خواهد گرفت. \textbf{بنابراین ددلاین‌های پروژه تحت هیچ شرایطی تمدید نخواهد‌ شد.} توصیه می‌شود با برنامه‌ریزی مناسب به ددلاین‌های درس پایبند باشید. + +\item +در صورت کشف تقلب از هریک از تیم‌ها، برای بار اول منفی نمرهٔ آن فاز برای آن تیم ثبت می‌شود و برای بار دوم، نمرهٔ منفی کل پروژه برای تیم لحاظ خواهد‌ شد که معادل مردود شدن در درس است. +\end{itemize} + +\newpage + +\section*{{\titr مقدمه}} +\addcontentsline{toc}{section}{{\fehrestContent مقدمه}} + +\subsection*{{\titr اهداف پروژه}} + +\addcontentsline{toc}{subsection}{{\fehrestContent اهداف قابل توجه}} + +\begin{itemize} + +\item +هدف این پروژه، طراحی یک سیستم فروشگاه آنلاین است که در فاز اول آن، صرفا منطق فروشگاه پیاده‌سازی می‌شود. + +\item +در این فروشگاه، تعدادی فروشنده، محصولات خود را ارائه داده و خریداران آن‌ها را خریداری می‌کنند. ساختار کلی فروشگاه، شبیه به فروشگاه‌های متداول مانند دیجی‌کالا است. + +\item +در این فاز از پروژه، طراحی شی‌ءگرای نرم‌افزار و جداسازی منطق بخش‌های مختلف از یکدیگر به صورت صحیح مورد نظر است. + +\item +یکی از اهداف پروژه، آشنایی با برخی ابزارها و Pattern های استاندارد برنامه‌نویسی، مثل ابزار مدیریت و تعریف پروژه‌ٔ +\href{https://en.wikipedia.org/wiki/Apache_Maven}{\textcolor{blue}{\underline{\lr{Apache Maven}}}}، +مبحث +\href{https://en.wikipedia.org/wiki/Unit_testing}{\textcolor{blue} {\underline{\lr{Unit Test}}}}، + و معماری + \href{https://www.geeksforgeeks.org/mvc-design-pattern/}{\textcolor{blue} {\underline{\lr{MVC}}}} + است. + +\item +آشنایی با سیستم مدیریت نسخه \lr{Git} و کار تیمی بر روی پروژه بر بستر یک مخزن \lr{Github}، یکی از اهداف مهم پروژه است. در این مورد توصیه می‌شود تغییرات خود را در دوره‌های کوتاه مدت \lr{commit} کنید. + +\end{itemize} + +\subsection*{{\titr کلیات پروژه}} +\addcontentsline{toc}{subsection}{{\fehrestContent کلیات پروژه}} + +در این فاز، صرفا منطق پروژه، بدون پیاده‌سازی گرافیک یا معماری شبکهٔ آن، باید پیاده‌سازی شود. نحوهٔ ارتباط با کاربر نیز از طریق واسط کاربری کنسول است. توجه داشته باشید که در فاز سوم پروژه، باید سیستم را طبق یک معماری سرور-کلاینت طراحی کنید. نکتهٔ مهم این است که منطق پروژه که در سرور قرار می‌گیرد، باید جدا از واسط کاربری باشد و به راحتی قابل جداسازی باشند. در نتیجه پیشنهاد می‌شود از همین ابتدا نگاهی به این جداسازی داشته‌ باشید و این نکته را در طراحی خود لحاظ کنید. + +در ادامهٔ مستند، موجودیت‌ها، نمای کلی رابط کاربری سیستم، نقش‌ها و دستورات لازم شرح داده‌شده است. + +\begin{enumerate}[label={نکته \arabic*:}] +\item + تمامی اطلاعات، اعم از اطلاعات کاربران، محصولات، اطلاعات اصلی فروشگاه مثل دسته‌بندی‌ها و...، باید به صورت خودکار در خارج از برنامه (مثلا روی فایل) ذخیره شوند و پس از \lr{terminate} شدن برنامه و اجرای مجدد آن، بصورت خودکار اطلاعات قبلی خوانده شود و قابل دسترسی باشد. برای این کار می‌توانید از ابزارهای کار با \lr{Json} در جاوا، مثل + \href{https://www.tutorialspoint.com/gson/gson_quick_guide.htm}{\textcolor{blue}{\lr{Gson}}} + استفاده‌ کنید. + +\item +شما باید پروژه‌ی خود را بر بستر ابزار \lr{Apache Maven} پیاده‌سازی کنید. همچنین برای اضافه کردن کتابخانه‌های مورد نیاز، \lr{dependency} های مربوطه را به فایل \lr{pom.xml} اضافه کنید. + +\item +پروژه‌ی شما باید طبق معماری \lr{MVC} طراحی شود. بدین صورت که تمام درخواست‌ها از طریق \lr{View} دریافت شود، به \lr{Controller} مورد نظر ارسال شود و \lr{Controller} از طریق پردازش داده‌هایی که بعنوان \lr{Model} دارد، تغییرات را اعمال کند، پاسخ را محاسبه کند آن را به \lr{View} برگرداند. \lr{View} نیز پاسخ را نمایش دهد. + +\item +شما باید \textbf{حداقل} برای یکی از فرایندهای موجود در پروژه، \lr{Unit Test} بنویسید. همچنین برای \lr{code coverage} بالاتر از ۷۰ درصد، به صورت خطی با درصد \lr{coverage}، نمره‌ٔ امتیازی تعلق خواهد گرفت. + + +\item + نحوهٔ تست کردن پروژه در تحویل حضوری بدین صورت خواهد بود که اکانت‌ها با نقش‌های مختلف ساخته‌ می‌شود و در بخش‌های مختلف، بین کاربران جابه‌جا خواهیم‌ شد. برای مثال بایستی پس از \lr{logout} یک کاربر، اطلاعات کاربران دیگر موجود باشد تا با کاربر دیگری بتوان \lr{login} کرد. + +\item +در هر جایی از پروژه می‌توانید هرگونه خلاقیتی را به‌کار ببرید. توجه کنید که خواسته‌های واضح پروژه بایستی انجام شوند. +\end{enumerate} + + + + +\newpage + +\section*{{\titr توضیح بخش‌های مختلف پروژه}} +\addcontentsline{toc}{section}{{\fehrestContent توضیح بخش‌های مختلف پروژه}} + +\subsection*{{\titr بخش‌ها}} +\addcontentsline{toc}{subsection}{{\fehrestContent بخش‌ها}} + +\subsubsection*{{\titr موجودیت‌ها}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent موجودیت‌ها}} + +\begin{itemize} + +\item +حساب کاربری: + +\begin{itemize} +\item +مشخصات فردی: + +\begin{itemize}[label=$\blacksquare$] +\item +نام کاربری، نام، نام‌خانوادگی، ایمیل، شماره تلفن، رمز عبور +\end{itemize} +\item +نقش: + +\begin{itemize}[label=$\blacksquare$] +\item +خریدار (یا همان کاربر عادی) ویژگی‌هایی مختص خودش ندارد. + +\item +فروشنده: اسم شرکت/کارگاه/کارخانه + +\item +مدیر: ویژگی‌هایی مختص خودش ندارد. + +\end{itemize} + +\item +لیست کدهای تخفیف شخص + +\item +اعتبار + +\item +سابقهٔ خرید/فروش + +\begin{itemize}[label=$\blacksquare$] +\item +لیستی از لاگ خرید/فروش +\end{itemize} + +\end{itemize} + + +\item +لاگ خرید: + +\begin{itemize} + +\item +شناسهٔ لاگ + +\item +تاریخ + +\item +مبلغ پرداخت شده + +\item +مقدار تخفیف اعمال‌شده (تخفیف کددار) + +\item +لیست محصولات خریده + + +\item +نام فروشنده + +\item +وضعیت تحویل + +\end{itemize} + +\newpage + +\item +لاگ فروش: + +\begin{itemize} + +\item +شناسهٔ لاگ + +\item +تاریخ + +\item +مبلغ دریافت شده + +\item +مبلغ کسر شده بابت حراج (در صورت وجود) + +\item +محصول فروخته شده(پیاده‌سازی این قسمت به صورت لیست مانعی ندارد) + +\item +نام خریدار + +\item +وضعیت ارسال + + +\end{itemize} + + +\item +حراج: + +\begin{itemize} + +\item +شناسه‌ی حراج \lr{(offId)} + +\item +لیست محصولات + +\item +وضعیت حراج (در دست بررسی برای ساخت / در دست بررسی برای ویرایش / تایید شده) + +\item +زمان دقیق شروع + +\item +زمان دقیق پایان + +\item +میزان تخفیف + + +\begin{itemize}[label = $\blacksquare$] +\item +نکته ۱: این نوع تخفیف را، هر فروشنده روی محصولاتی که خودش ارائه می‌کند می‌تواند اعمال کند. و +در نتیجهٔ اعمال این تخفیف، قیمت کالا کاهش یافته و مبلغ با اعمال تخفیف به اعتبار فروشنده اضافه می‌شود. + +\item +نکته ۲:‌ یک محصول در یک زمان، فقط می‌تواند در لیست یک حراج باشد. +\end{itemize} + +\end{itemize} + +\item +تخفیف کد دار: + +\begin{itemize} +\item +کد تخفیف + +\item +زمان دقیق شروع + +\item +زمان دقیق پایان + +\item +میزان تخفیف (شامل درصد و مقدار حداکثر تخفیف ممکن) + +\item +دفعات تکرار تخفیف به‌ازای هر کاربر + +\item +لیست کاربران مشمول تخفیف + + +\begin{itemize}[label = {$\blacksquare$}] +\item +نکته:‌ این تخفیف تنها توسط مدیران، و بر روی همهٔ محصولات اعمال می‌شود، و نه در قیمت کالا بلکه در فاکتور خرید اثر می‌گذارد. یعنی فروشنده همان قیمت بدون تخفیف را دریافت می‌کند. +\end{itemize} + +\end{itemize} + + + +\item +دسته \lr{(category)}: + +\begin{itemize} +\item +اسم + +\item +ویژگی‌های مخصوص + +\item +زیردسته (امتیازی) + +\item +لیست محصولات + + + + +\end{itemize} +\item +کالا: + +\begin{itemize} + +\item +شناسهٔ کالا \lr{(productId)} + +\item +وضعیت کالا (در دست بررسی برای ساخت / در دست بررسی برای ویرایش / تایید شده) + +\item +مشخصات عمومی مانند اسم، برند/کمپانی، قیمت، فروشنده، وضعیت موجودی + +\item +دسته + +\item +مشخصات خاص دسته + +\item +توضیحات + +\item +میانگین نمره خریداران + +\item +لیست نظرات + +\begin{itemize}[label = $\blacksquare$] +\item +نکته: به شکل پیش‌فرض هر فروشنده که کالایی اضافه می‌کند، به صورت یک کالای مجزا در نظر گرفته می‌شود؛ ولی اگر سامانه پیاده‌سازی شده از قابلیت چند فروشنده برای یک محصول پشتیبانی کند نمرهٔ امتیازی دارد. +\end{itemize} + +\end{itemize} +\newpage +\item +نظر: + +\begin{itemize} +\item +کاربر نظر دهنده + +\item +کالا + +\item +متن نظر + +\item +وضعیت نظر (در انتظار تایید/تایید شده/تایید نشده توسط مدیر) + +\item +آیا نظر دهنده محصول را خریده است. + +\end{itemize} + +\item +نمره: + +\begin{itemize} + +\item +کاربر (تنها کاربری که محصول را خریده) + +\item +امتیاز + +\item +کالا + +\end{itemize} + + +\end{itemize} + +\newpage + +\subsubsection*{{\titr نمای کلی رابط کاربری:}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent نمای کلی رابط کاربری}} + +\begin{itemize} + +\item +صفحهٔ اصلی: + +\begin{itemize} + +\item +ناحیهٔ کاربری + +\item +صفحه محصولات + +\item +حراج‌ها + +\end{itemize} + +\item +ناحیهٔ‌ کاربری: + +این بخش مشتمل بر دو حالت است: + +\begin{enumerate} + +\item +لاگین کرده: در این حالت مشخصات و دسترسی‌های حساب کاربری نشان داده می‌شود. + +\item +لاگین نکرده: امکان انتقال به صفحهٔ ثبت‌نام یا لاگین را برای کاربر مهیا می‌کند. +\end{enumerate} + + +\item +پنل ثبت‌نام: + +مشخصات فردی و مشخصات مربوط به نقش که در بخش حساب کاربری مطرح شده گرفته می‌شود. + +\begin{itemize}[label={$\blacksquare$}] +\item +نکته ۱: ثبت‌نام فقط برای نقش‌های خریدار و فروشنده قابل انجام است. + +\item +نکته ۲: ساخت اکانت مدیر تنها توسط مدیر قابل انجام است. + +\item +نکته ۳: یک فروشنده هنگام ثبت‌نام نقش فروشنده را درخواست می‌کند و پس از تایید مدیر دسترسی‌های فروشنده را خواهد داشت. + +\end{itemize} + +\item +صفحه محصولات: + +\begin{itemize} +\item +دسته‌‌ها \lr{(category)} + +\begin{itemize}[label={$\blacksquare$}] +\item +لیست کالاها + +\item +جستجو + +\end{itemize} +\end{itemize} + +\newpage +\item +حراج‌ها: + +\begin{itemize} +\item +لیست کالاهای حراج‌شده. + +\item +جستجو +\end{itemize} + +\item +جستجو: + +\begin{itemize} +\item +فیلتر بر اساس ویژگی‌های عمومی + +\item +فیلترهای مختص هر دسته (روی ویژگی‌های مختلف دسته) + +\begin{itemize}[label={$\blacksquare$}] +\item +می‌تواند بصورت انتخابی (مانند موجود بودن کالا، یا برند کالا) و یا بصورت بازه‌ای (مانند بازه‌قیمت) باشد. +\end{itemize} +\end{itemize} + +\end{itemize} + +\newpage + +\subsection*{{\titr نقش‌ها}} +\addcontentsline{toc}{subsection}{{\fehrestContent نقش‌ها}} + +در این فاز، ۳ نقش مد نظر است. + +\begin{itemize} +\item +خریدار: + +\begin{itemize} + +\item +داده‌های مورد نیاز: + +\begin{itemize}[label={$\blacksquare$}] + +\item +اطلاعات شخصی حساب کاربری + +\item +سبد خرید + +\item +سابقه خرید + +\item +اعتبار حساب کاربری + +\end{itemize} + +\item +قابلیت‌ها: + +\begin{itemize}[label={$\blacksquare$}] + +\item +تغییر اطلاعات شخصی + +\item +مشاهدهٔ محصولات + +\item +فیلتر کردن و جستجو در میان محصولات + +\item +مقایسهٔ دو محصول +\item +خرید + +\end{itemize} + +\end{itemize} + + +\item +فروشنده: + +\begin{itemize} +\item +اطلاعات شخصی حساب کاربری و اطلاعات مربوط به شرکت + +\item +لیست سابقه فروش + +\item +تغییر اطلاعات شخصی + +\item +لیست محصولات فروشی + +\begin{itemize}[label={$\blacksquare$}] +\item +ویرایش هر محصول (شامل ویرایش هر چیزی) که در نهایت به صورت یک درخواست به مدیران ارسال می‌شود. + + +\item +درخواست حذف یک محصول + +\end{itemize} + +\item +درخواست افزودن محصول +\newpage + +\item +لیست حراج‌ها + +\begin{itemize}[label={$\blacksquare$}] +\item +ویرایش حراج‌ها که بصورت یک درخواست به مدیران ارسال می‌شود. +\end{itemize} + + +\item +درخواست افزودن یک حراج + +\end{itemize} + + +\item +مدیر: + +\begin{itemize} + + +\item +اطلاعات شخصی حساب کاربری + +\item +تغییر اطلاعات شخصی + +\item +مشاهده لیست درخواست‌ها + +\begin{itemize}[label={$\blacksquare$}] +\item +درخواست‌های ثبت‌نام اکانت فروشنده + +\item +درخواست افزودن/ویرایش محصول + +\item +درخواست افزودن/ویرایش حراج + +\end{itemize} + +\item +لیست کد تخفیف‌ها + +\begin{itemize}[label={$\blacksquare$}] +\item +ویرایش هر کد تخفیف +\end{itemize} + +\item +ایجاد کد تخفیف + +\item +مشاهده لیست تمامی کاربران + +\begin{itemize}[label={$\blacksquare$}] +\item +امکان حذف یک کاربر +\end{itemize} + +\item +امکان افزودن اکانت مدیر + +\item +لیست دسته‌ها + +\begin{itemize}[label={$\blacksquare$}] +\item +ویرایش یک دسته +\end{itemize} + +\item +افزودن دسته +\end{itemize} + + +\end{itemize} + +\newpage + +\subsection*{{\titr فرآیندها}} +\addcontentsline{toc}{subsection}{{\fehrestContent فرآیندها}} + +\begin{itemize} + +\item +ثبت‌نام: + +\begin{itemize} +\item +وارد کردن اطلاعات شخصی + +\item +وارد کردن اطلاعات مربوط به نقش درخواست شده + +\end{itemize} + +\item +ورود: +\begin{itemize} +\item +وارد کردن نام کاربری و گذرواژه + +\end{itemize} + +\item +ویرایش اطلاعات کاربری: + +\begin{itemize} +\item +از طریق ورود به پنل کاربری، کاربر می‌تواند مشخصات خود (بجز نام کاربری) را تغییر دهد. + +\end{itemize} + +\item +مشاهدهٔ محصولات، فیلتر کردن و جستجو (بدون ورود به حساب نیز قابل دسترسی است): + +روند کار به این صورت است: + +\begin{enumerate} + +\item +کاربر صفحه محصولات می‌شود. + +\item +دستهٔ مورد نظر را انتخاب می‌کند. + +\item +فیلتر‌های مورد نظر را وارد می‌کند. + +\item +در صورت نیاز جستجو می‌کند یا صفحات بعدی لیست محصولات را بررسی می‌کند. + +\item +امکان رفع فیلترهای اعمال شده نیز می‌بایست وجود داشته باشد. + +\end{enumerate} + +\item +مقایسه: + +\begin{itemize} + +\item +کاربر مجاز است دو محصول از یک دسته‌بندی را با یکدیگر مقایسه کند. + +\item +پس از اعمال مقایسه، تمامی ویژگی‌های دو محصول در کنار هم می‌آیند. در صورتی که اعداد یا توضیحات یکی از مشخصه‌های یکی از محصولات ناقص بود، خالی نمایش داده می‌شود. + +\end{itemize} + +\item +افزودن به سبد خرید: + +\begin{itemize} + +\item +اگر کاربر تا الان وارد سامانه نشده است، وارد صفحهٔ ثبت‌نام/ورود می‌شود. + +\begin{itemize}[label = {$\bigstar$}] + +\item +قابلیت امتیازی: بدون وارد شدن به حساب بتوان سبد خرید داشت و تنها هنگام پرداخت، ورود به حساب انجام شود. + + +\end{itemize} + +\item +در صورت تایید، محصول وارد سبد خرید می‌شود. +\end{itemize} + +\item +سبد خرید + +\begin{itemize} + +\item +مشاهده سبد خرید + +\item +در صورت تایید، وارد صفحهٔ مشخصات دریافت‌کننده \lr{(shipping)} می‌شود. + +\item +در صورت تایید، وارد صفحهٔ ثبت کد تخفیف و تایید نهایی خرید می‌شود. (استفاده از کد تخفیف برای هر فاکتور تنها یکبار قابل استفاده است) + +\item +تایید کسر مبلغ از کیف پول (یا نبود موجودی کافی) + +\item +بازگشت به صفحهٔ اصلی + +\end{itemize} + +\item +فروش: + +\begin{itemize} + +\item +از طریق پنل کاربری کاربر فروشنده قابل انجام است. + +\item +هر فروشنده محصول خود را به عنوان کالای جدید معرفی می‌کند. + +\begin{itemize}[label={$\blacksquare$}] +\item +نکته:‌ در صورتی که ویژگی چند فروشنده برای یک محصول پشتیبانی می‌شود، فروشنده درخواست خود برای فروشنده شدن یک کالای موجود ثبت می‌کند. +\end{itemize} + +\item +اعلام کردن قیمت، تعداد موجودی، توضیحات و ویژگی‌های آن کالا + +\end{itemize} +\item +ویرایش اطلاعات یک محصول: + +\begin{itemize} + +\item +از طریق پنل کاربری کاربر فروشنده/مدیر قابل انجام است. + +\item +درخواست ویرایش اطلاعات کالای خود را پس از ثبت مشخصات جدید ثبت می‌کند. +\end{itemize} + +\newpage + +\item +ایجاد دسته‌بندی جدید: + +\begin{itemize} + +\item +این فرایند تنها از طریق پنل کاربری مدیر قابل انجام است. + +\item +نام و ویژگی‌های آن دسته را تعیین می‌کند. + +\end{itemize} +\item +ایجاد تخفیف کد دار: + +\begin{itemize} + +\item +این فرایند تنها از طریق پنل کاربری مدیر قابل انجام است. + +\item +تمام مشخصات تخفیف را تعیین می‌کند. + +\item[{$\bigstar$}] +قابلیت امتیازی: بر اساس رویداد خاصی (مثلا مجموع خرید بیشتر از ۱ میلیون تومان شود) به شخص کد تخفیف داده‌ شود. + +\item[{$\bigstar$}] +قابلیت امتیازی: به صورت دوره‌ای به تعدادی کاربر اتفاقی کد تخفیف داده‌ شود. + +\end{itemize} + +\item +ویرایش تخفیف کد دار: + +\begin{itemize} + +\item +این فرایند تنها از طریق پنل کاربری مدیر قابل انجام است. + +\item +مشخصات تخفیف (بجز کد) را تغییر می‌دهد. + +\end{itemize} + +\item +ایجاد حراج: + +\begin{itemize} +\item +این فرایند توسط فروشنده قابل انجام است. + +\item +لیست محصولات مورد تخفیف، درصد و سقف مقدار تخفیف و ددلاین را مشخص می‌کند. + +\item +درخواست را به مدیر ارسال می‌کند. + + +\end{itemize} +\item +ویرایش حراج: + + +\begin{itemize} + +\item +این فرایند توسط فروشنده قابل انجام است. + +\item +می‌تواند اطلاعات مربوط به یک حراج خود را تغییر دهد. + +\item +درخواست را به مدیر ارسال می‌کند. + +\end{itemize} + +\newpage + +\item +نمره دهی: + + +\begin{itemize} + +\item +کاربر وارد ناحیه کاربری می‌شود. + +\item +سابقهٔ خرید خود را مشاهده می‌کند و به محصول مورد نظر نمره می‌دهد. + +\begin{itemize}[label = {$\blacksquare$}] + +\item +نکته: واضح است که محصول باید توسط کاربر خریده شده باشد تا بتواند به آن امتیاز دهد. + +\end{itemize} + + + +\end{itemize} +\item +ثبت نظر: + +\begin{itemize} + +\item +وارد صفحهٔ محصول مورد نظر می‌شود. + +\item +نظر خود را درمورد آن محصول می‌نویسد. + +\item +سامانه به صورت خودکار تعیین می‌کند که نظر دهنده کیست و آیا این محصول را خریده است یا خیر. + +\end{itemize} + +\end{itemize} + + +\newpage + +\section*{{\titr دستورات مورد نیاز}} +\addcontentsline{toc}{section}{{\fehrestContent دستورات مورد نیاز}} + +\subsection*{{\titr نکات مهم:}} +\addcontentsline{toc}{subsection}{{\fehrestContent نکات مهم:}} + +\begin{itemize}[label={$\bigstar$}] + +\item +در این بخش، دستورات مورد نیاز در هر صفحه آمده‌ است. توجه کنید که دستورات به صورت کلی توضیح داده‌شده‌اند و هر جا به جزئیات اشاره نشده‌ است، می‌توانید دلخواه عمل کنید. + +\item +در همه منوها باید امکان لاگین و رجیستر برای شخص لاگین‌نشده و امکان لاگ اوت برای شخص لاگین شده وجود داشته باشد و پس از اتمام فرایند به صفحه‌ای که قبلا بوده برگردد. + +\item +در همه منوها یک دستور \lr{help} موجود باشد که لیست دستورات آن منو را نشان دهد. + +\item +در همه منوها هر جا لیستی نمایش داده می‌شود، بتوان از طریق دستور \lr{sort by [field]} نمایش لیست را تغییر داد. + +\item +در هر یک از زیر منوهای برنامه با دستور \lr{back} به منوی قبلی برمی‌گردد. + + + +\end{itemize} + +\newpage + + +\subsection*{{\titr صفحه لاگین/رجیستر}} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحه لاگین/رجیستر:}} + +هرگاه کاربری که مهمان باشد یا از نوع خریدار نباشد، سعی کند وارد ناحیه کاربری شود یا عملیات افزودن به سبد خرید را انجام دهد، یا در حالتی که سبد خرید بدون لاگین در دسترس باشد، بخواهد خرید را انجام دهد، باید با نمایش پیغام خطای مناسب به این صفحه منتقل شده و پس از انجام لاگین/رجیستر، به صفحه‌ای که قبلا بوده برگردد. + +دستورات این منو بدین شرح هستند: + + +\begin{mybox}[colback=yellow]{دستور} + + +\begin{latin} + +create account [type] [username] + +\end{latin} + +\end{mybox} + +منظور از \lr{type}، نوع حساب کاربری است و به این صورت است: + +\begin{enumerate} + +\item + خریدار + + \item + فروشنده + + \item + مدیر - البته این فقط یکبار امکان پذیر است و سایر مدیران را مدیر اصلی اضافه می‌کند. + + \end{enumerate} + +پس از زدن دستور، از کاربر \lr{password} خواسته می‌شود. سپس اطلاعات شخصی مربوط به نوع حساب کاربری مورد نظر خواسته‌ می‌شود. + +(در صورتی که یوزرنیم از قبل وجود داشت، پیغام خطای مناسبی نمایش داده شود.) +هر حساب یک \lr{username} دارد که یکتاست. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + + +\begin{latin} + +login [username] + +\end{latin} + +\end{mybox} + +پس از زدن دستور، از کاربر \lr{password} خواسته می‌شود. + +در صورت درستی پسورد به صفحه‌ای که قبلا بوده یا می‌خواسته برود، می‌رود. + +(در صورت عدم وجود حسابی با این \lr{username} یا غلط بودن \lr{password}، خطای مناسبی نمایش داده شود.) + +\newpage + +\subsection*{{\titr صفحه اصلی > ناحیه کاربری}} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحه اصلی > ناحیه کاربری }} + +\subsubsection*{{\titr «حساب مدیر»}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent «حساب مدیر»}} + + +دستورات پنل مدیریت به صورت زیر است: + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view personal info + +\end{latin} + +\end{mybox} + +اطلاعات شخصی کاربر را نمایش می‌دهد. حال کاربر می‌تواند اطلاعات را ویرایش کند یا به منوی اصلی برگردد. + +\begin{mybox}[colback=yellow]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit [field] + +\end{itemize} + +\end{latin} + +\end{mybox} + + + + +برای ویرایش اطلاعات. \lr{field} ها می‌توانند هر اطلاعات شخصی‌ای بجز \lr{username} باشند. + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +manage users + +\end{latin} + +\end{mybox} + + +با این دستور لیست کاربران را نمایش می‌دهد. مدیر می تواند از طریق دستورات زیر اکانت کاربر را حذف کند یا نقش کاربر را تغییر دهد. + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +view [username] + +\end{itemize} + +\end{latin} + +\end{mybox} + + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +delete user [username] + +\end{itemize} + +\end{latin} + +\end{mybox} + + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +create manager profile + +\end{itemize} + +\end{latin} + +\end{mybox} + +با این دستور، مشخصات یک مدیر جدید از کاربر گرفته می‌شود و مدیر ثبت نام می‌شود. +(در صورتی وجود خطا، پیغام خطای مناسبی نمایش داده شود.) + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +manage all products + +\end{latin} + +\end{mybox} + + +امکان حذف محصول را با دستور زیر فراهم می‌کند: + + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +remove [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +(در صورتی که \lr{productId} وجود نداشت، پیغام خطای مناسبی نمایش داده شود.) + + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +create discount code + +\end{latin} + +\end{mybox} + +پس از این دستور، اطلاعات مورد نیاز تخفیف کددار گرفته می‌شود و در صورت اعتبار فیلدهای ورودی کد تخفیف ساخته می‌شود. + + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view discount codes + +\end{latin} + +\end{mybox} + +لیست تمامی تخفیف‌های فروشگاه را نمایش می‌دهد. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +view discount code [code] + +\end{itemize} + +\end{latin} + +\end{mybox} + +مشخصات کد مورد نظر نمایش داده می‌شود. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit discount code [code] + +\end{itemize} + +\end{latin} + +\end{mybox} + + +مشخصات کد مورد نظر را می‌توان ویرایش کرد. + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +remove discount code [code] + +\end{itemize} + +\end{latin} + +\end{mybox} + + +کد تخفیف حذف می‌شود. + + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +manage requests + +\end{latin} + +\end{mybox} + +لیست درخواست‌های ارسال شده به مدیر را نمایش می‌دهد. + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +details [requestId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +با این دستور دستور زیر تمام مشخصات درخواست مورد نظر نمایش داده می‌شود. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +accept [requestId] + +\item +decline [requestId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +مدیر با این دستورات درخواست را تایید یا رد می کند. + +\hrulefill + +\newpage + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +manage categories + +\end{latin} + +\end{mybox} + +دسته بندی‌های موجود کالاها را نمایش می‌دهد (برای ویرایش/اضافه کردن دسته بندی‌ها) + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit [category] + +\end{itemize} + +\end{latin} + +\end{mybox} + +اطلاعاتی نظیر نام دسته، و ویژگی‌های دسته را می‌تواند تغییر دهد. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +add [category] + +\end{itemize} + +\end{latin} + +\end{mybox} + +سپس اطلاعات مربوط به دسته شامل ویژگی ها خواسته می‌شود. + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +remove [category] + +\end{itemize} + +\end{latin} + +\end{mybox} + +یک دسته و تمام محصولات آن را حذف می‌کند. + +\newpage + + +\subsubsection*{{\titr «حساب فروشنده»}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent «حساب فروشنده»}} + +دستورات مربوط به ناحیه کاربری فروشنده به صورت زیر است: + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view personal info + +\end{latin} + +\end{mybox} + +اطلاعات شخصی کاربر را نمایش می‌دهد. حال کاربر می تواند اطلاعات را ویرایش کند یا به منوی اصلی برگردد. + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit [field] + +\end{itemize} + +\end{latin} + +\end{mybox} + +برای ویرایش اطلاعات. field ها می‌توانند هر اطلاعات شخصی‌ای بجز username باشند. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view company information + +\end{latin} + +\end{mybox} + +مشخصات شرکت، کارگاه و یا کارخانهٔ فروشنده را نمایش می‌دهد. (اسم ، در صورت وجود سایر مشخصات) + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view sales history + +\end{latin} + +\end{mybox} + +سابقه فروش محصولات فروشنده را نمایش می‌دهد. + + +\hrulefill + +\newpage + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +manage products + +\end{latin} + +\end{mybox} + +لیست محصولات فروشنده را نمایش می‌دهد و امکان مشاهده جزئیات خریداران محصول و ویرایش مشخصات هر محصول و قرار دادن تخفیف را با دستورات زیر فراهم می‌کند: + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +view [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +view buyers [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + + پس از این دستور، فیلد‌های مورد ویرایش و مقادیر جدید آن‌ها گرفته می‌شود و پس از تایید، درخواست تغییر برای مدیر ارسال می‌شود تا در صورت موافقت تغییر اعمال شود. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +add product + +\end{latin} + +\end{mybox} + + +پس از این دستور مشخصات یک محصول جدید از کاربر گرفته می‌شود و یک درخواست برای مدیر ارسال می‌شود تا در صورت موافقت، آن کالا به لیست اضافه شود. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +remove product [productId] + +\end{latin} + +\end{mybox} + +محصول مورد نظر را حذف می‌کند. + + +\hrulefill + +\newpage + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +show categories + +\end{latin} + +\end{mybox} + +پس از این دستور تمامی دسته‌های موجود را به کاربر نمایش می‌دهد. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view offs + +\end{latin} + +\end{mybox} + +لیست حراج‌های فروشنده را نمایش می‌دهد. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +view [offId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +مشخصات off مورد نظر را نمایش می‌دهد. + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit [offId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +مشخصات off مورد نظر را می‌تواند ویرایش کند. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +add off + +\end{itemize} + +\end{latin} + +\end{mybox} + +برای اضافه کردن off جدید؛ پس از این دستور مشخصات حراج دریافت می‌شود. + +\begin{itemize}[label={$\blacksquare$}] +\item +نکته: دستورات edit و add مستقیماً اعمال نمی‌شوند و بصورت درخواست به مدیر ارسال می‌شوند. + +\end{itemize} + + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view balance + +\end{latin} + +\end{mybox} + +میزان اعتبار فروشنده را نشان می‌دهد. + + +\newpage + +\subsubsection*{{\titr «حساب خریدار»}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent «حساب خریدار»}} + +دستورات مربوط به ناحیه کاربری خریدار به صورت زیر است: + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view personal info + +\end{latin} + +\end{mybox} + +اطلاعات شخصی کاربر را نمایش می‌دهد. حال کاربر می‌تواند اطلاعات را ویرایش کند یا به منوی اصلی برگردد: + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +edit [field] + +\end{itemize} + +\end{latin} + +\end{mybox} + +برای ویرایش اطلاعات. field ها می‌توانند هر اطلاعات شخصی‌ای به‌جز username باشند. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view cart + +\end{latin} + +\end{mybox} + +سبد خرید را نمایش می‌دهد و کاربر می‌تواند محصولات را مشاهده یا از سبد حذف کند و یا خرید خود را نهایی کند. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +show products + +\end{itemize} + +\end{latin} + +\end{mybox} + +محصولات موجود در سبد خرید را نشان می‌دهد. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +view [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +ورود به صفحهٔ محصول + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +increase [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +افزایش تعداد یک محصول + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +decrease [productId] + +\end{itemize} + +\end{latin} + +\end{mybox} + +کاهش تعداد یک محصول (اگر تعداد آن صفر شد،‌ آن محصول از سبد خرید حذف می‌شود.) + + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +show total price + +\end{itemize} + +\end{latin} + +\end{mybox} + +نشان دادن مجموع قیمت محصولات + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +purchase + +\end{itemize} + +\end{latin} + +\end{mybox} + +ورود به صفحهٔ پرداخت + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +purchase + +\end{latin} + +\end{mybox} + +پس از وارد کردن این کلمه در صفحهٔ سبد خرید به ترتیب باید وارد صفحات زیر شود: + + +\begin{latin} + +\begin{enumerate} + +\item +receiver information + +\item +discount code + +\item +payment + + +\end{enumerate} + + +\end{latin} + +که به ترتیب بدین شرح هستند: + +\begin{enumerate} + +\item +صفحه وارد کردن اطلاعات خریدار اعم از آدرس، تلفن و … + +\item +صفحهٔ ثبت کد تخفیف در صورت داشتن کد و تایید اعتبار کد + +\item +صفحه پرداخت وجه و گزارش نهایی از تراکنش‌ (اگر موفق بود تایید کسر مبلغ در غیر این صورت خطای مناسب نمایش داده‌ شود.) + + +\end{enumerate} + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view orders + +\end{latin} + +\end{mybox} + +سابقۀ خرید کاربر را نمایش می‌دهد. + +امکان مشاهده جزئیات یا نظردهی محصولات خریداری شده، از طریق دو دستور زیر وجود دارد: + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +show order [orderId] + +\item +rate [productId] [1-5] + +\end{itemize} + +\end{latin} + +\end{mybox} + +اگر چنین محصولی خریداری نشده بود، پیغام خطای مناسب چاپ شود. + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view balance + +\end{latin} + +\end{mybox} + +میزان اعتبار کاربر را نشان می‌دهد. + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view discount codes + +\end{latin} + +\end{mybox} + +کد تخفیف‌های کاربر را نشان می‌دهد. + + + +\newpage + +\subsection*{{\titr صفحهٔ محصولات}} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحهٔ محصولات}} + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +products + +\end{latin} + +\end{mybox} + + +با وارد کردن این دستور در صفحهٔ اصلی هر ۳ نوع از کاربرها یا حتی قبل از لاگین، وارد صفحهٔ محصولات می‌شود. + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +view categories + +\end{latin} + +\end{mybox} + +لیست دسته‌های محصولات را نمایش می‌دهد. + +\hrulefill + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +filtering + +\end{latin} + +\end{mybox} + +این دستورات مربوط به فیلتر کردن هستند: + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +show available filters + +\end{itemize} + +\end{latin} + +\end{mybox} + +مواردی که می‌توان بر حسب آن فیلتر کرد. ( فیلتر بر حسب کتگوری، نام محصول و … ) + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +filter [an available filter] + +\end{itemize} + +\end{latin} + +\end{mybox} + +محصولات را بر حسب نوع فیلتر ورودی ، فیلتر کرده و نمایش می‌دهد. + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +current filters + +\end{itemize} + +\end{latin} + +\end{mybox} + +فیلترهای انتخابی را نشان می‌دهد. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +disable filter [a selected filter] + +\end{itemize} + +\end{latin} + +\end{mybox} + +فیلتر مورد نظر را غیر فعال می‌کند. (به جز دسته که همه‌شان را نمی‌شود حذف کرد) + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +sorting + +\end{latin} + +\end{mybox} + +وارد قسمت مرتب‌سازی محصولات می‌شود. + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +show available sorts + +\end{itemize} + +\end{latin} + +\end{mybox} + +مواردی که می‌توان بر حسب آن محصولات را مرتب شده نمایش داد. (زمان، نمره، تعداد بازدید) + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +sort [an available sort] + +\end{itemize} + +\end{latin} + +\end{mybox} + +مرتب سازی محصولات بر حسب المان وارد شده. + + + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +current sort + +\end{itemize} + +\end{latin} + +\end{mybox} + + +سورت‌ انتخابی را نشان می‌دهد. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +disable sort + +\end{itemize} + +\end{latin} + +\end{mybox} + +سورت مورد نظر را غیر فعال می‌کند. (پیش‌فرض روی تعداد بازدید) + +\hrulefill + +\newpage + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +show products + +\end{latin} + +\end{mybox} + +محصولات موجود در فروشگاه را نمایش می‌دهد. (در صورتی که فیلتری انتخاب شده باشد، فیلتر شدهٔ محصولات را بر اساس نوع مرتب‌سازی انتخاب شده توسط کاربر مرتب کرده و نشان می‌دهد.‌) + +\hrulefill + + + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +show product [productId] + +\end{latin} + +\end{mybox} + +وارد صفحهٔ محصول مورد نظر می‌شود. + +\newpage +\subsection*{{\titr صفحهٔ محصول}} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحهٔ محصول}} + + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +digest + +\end{latin} + +\end{mybox} + +اطلاعات محصول را به صورت خلاصه نمایش می‌دهد که شامل توضیحات و قیمت و تخفیف و کتگوری و فروشنده و میانگین نمرات می‌شود. + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +add to cart + +\end{itemize} + +\end{latin} + +\end{mybox} + +محصول را به سبد خرید اضافه می‌کند. (در صورت login نبودن به صفحه ورود برود) + + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +select seller [seller\_username] + +\end{itemize} + +\end{latin} + +\end{mybox} + +مشخص می‌کنیم از چه فروشنده‌ای بخریم. (در صورتی که قابلیت امتیازی مربوطه پیاده‌سازی شده‌ باشد.) + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +attributes + +\end{latin} + +\end{mybox} + +تمام ویژگی‌های محصول هم عمومی و هم بر اساس کتگوری را با ذکر مقدار نمایش می‌دهد. + + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +compare [productID] + +\end{latin} + +\end{mybox} + +ویژگی‌های دو محصول را کنار هم نمایش می‌دهد. + + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +Comments + +\end{latin} + +\end{mybox} + +نظرات و امتیاز محصول را نشان می‌کند. + +\begin{mybox}[colback=brilliantlavender]{دستور} + +\begin{latin} + +\begin{itemize}[label = {$\Rightarrow$}] + +\item +Add comment + +Title: + +Content: + +\end{itemize} + +\end{latin} + +\end{mybox} + +با همین مشخصات یک نظر به محصول اضافه می‌کند. + +\newpage + +\subsection*{{\titr صفحهٔ حراج‌ها}} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحهٔ حراج‌ها}} + + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +offs + +\end{latin} + +\end{mybox} + +با وارد کردن این دستور در صفحهٔ اصلی هر ۳ نوع از کاربرها یا حتی قبل از لاگین، وارد صفحهٔ حراج‌ها می‌شود. در این صفحه لیستی از محصولات دارای حراج با نمایش قیمت قبل و حال حاضر آن‌ها و ذکر جزئیات حراج نمایش داده می‌شود. + + +\hrulefill + +\begin{mybox}[colback=yellow]{دستور} + +\begin{latin} + +show product [productId] + +\end{latin} + +\end{mybox} + +وارد صفحهٔ محصول مورد نظر می‌شود. + + +\hrulefill + +\begin{itemize}[label={$\blacksquare$}] +\item +نکته: موارد مربوط به فیلتر و جستجو در این صفحه، مشابه صفحهٔ محصولات است. + +\end{itemize} + +\end{document} + + + + + + + diff --git a/phase_1/main/XB Zar bold.ttf b/phase_1/main/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_1/main/XB Zar bold.ttf differ diff --git a/phase_1/main/XB Zar.ttf b/phase_1/main/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_1/main/XB Zar.ttf differ diff --git a/phase_1/main/sharif.png b/phase_1/main/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_1/main/sharif.png differ diff --git a/phase_1/main/sharif1.png b/phase_1/main/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_1/main/sharif1.png differ diff --git a/phase_1/main/tex.bib b/phase_1/main/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_1/main/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_2/main/IRNazanin.ttf b/phase_2/main/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_2/main/IRNazanin.ttf differ diff --git a/phase_2/main/IRNazaninBold.ttf b/phase_2/main/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_2/main/IRNazaninBold.ttf differ diff --git a/phase_2/main/IRNazaninIrani.ttf b/phase_2/main/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_2/main/IRNazaninIrani.ttf differ diff --git a/phase_2/main/LiberationSerif-Bold.ttf b/phase_2/main/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_2/main/LiberationSerif-Bold.ttf differ diff --git a/phase_2/main/LiberationSerif-BoldItalic.ttf b/phase_2/main/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_2/main/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_2/main/LiberationSerif-Italic.ttf b/phase_2/main/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_2/main/LiberationSerif-Italic.ttf differ diff --git a/phase_2/main/LiberationSerif-Regular.ttf b/phase_2/main/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_2/main/LiberationSerif-Regular.ttf differ diff --git a/phase_2/main/PHASE2.pdf b/phase_2/main/PHASE2.pdf new file mode 100644 index 0000000..67ceb7a Binary files /dev/null and b/phase_2/main/PHASE2.pdf differ diff --git a/phase_2/main/PHASE2.tex b/phase_2/main/PHASE2.tex new file mode 100644 index 0000000..daf3cae --- /dev/null +++ b/phase_2/main/PHASE2.tex @@ -0,0 +1,904 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{ فاز دوم پروژه} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.20cm} + + مهلت ارسال:\\ + \textbf{{27 خرداد - }} + \textbf{{ساعت 23:59:59}} + + \vspace{0.10cm} +مسئول پروژه:\\ + \textbf{\authorFont{احمد سلیمی}} + + \vspace{0.10cm} +مسئولین فاز دوم:\\ + \textbf{\authorFont{سید مهدی فقیه و زﻫﺮا یوسفی جمارانی}} + + \vspace{0.10cm} +طراحان فاز دوم:\\ + \textbf{\authorFont{علیرضا تاجمیر ریاحی، سارا خسروی، آرمان زارعی، حمیدرضا کلباسی و ﮬﻤﻴﻠﺎ میلی }} + + \vspace{0.05cm} +مسئول تنظیم داک:\\ + \textbf{\authorFont{امیرمهدی نامجو}} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{فاز دوم} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + +\tableofcontents + +\newpage + + \Large \textbf{\\ +} + + + +\section*{{\titr نکات قابل توجه}} +\addcontentsline{toc}{section}{{\fehrestContent نکات قابل توجه}} +\begin{itemize} +\item +پس از اتمام این فاز، در گیت خود یک تگ با عنوان \lr{"phase\_2"} بزنید. در روز تحویل حضوری این tag بررسی خواهد شد و کدهای پس از آن نمره‌ای نخواهد گرفت. + +\item +در روز تحویل حضوری مشارکت تمام اعضای تیم در پروژه بررسی خواهد‌ شد و در صورت عدم مشارکت بعضی از اعضا، نمرهٔ ایشان برای آن فاز پروژه "صفر" لحاظ می‌گردد. مشارکت، با توجه به commit های افراد تیم در مخزن گیت‌هاب پروژه بررسی می‌شود. + +\item +در هر فاز می‌توانید سه روز تاخیر به ازای کسر نمره داشته‌ باشید که به ازای هر روز آن، ۱۰ درصد از نمرهٔ آن فاز را از دست خواهید‌ داد. در مجموع سه‌فاز پروژه، سه روز تاخیر نیز بخشیده خواهد‌ شد. + +\item +به ازای هر ساعتی که پروژه را زودتر تحویل دهید، ۱۵ دقیقه به مهلت تاخیر بدون کسر نمره شما اضافه خواهد‌ شد. این مقدار حداکثر یک روز خواهد‌ بود که در صورت ارسال ۴ روز زودتر از ددلاین به شما تعلق خواهد گرفت. + +\item +در صورت کشف تقلب از هریک از تیم‌ها، برای بار اول منفی نمرهٔ آن فاز برای آن تیم ثبت می‌شود و برای بار دوم، نمرهٔ منفی کل پروژه برای تیم لحاظ خواهد‌ شد که معادل مردود شدن در درس است. +\end{itemize} + +\newpage + +\section*{{\titr توضیحات کلی}} +\addcontentsline{toc}{section}{{\fehrestContent توضیحات کلی}} + +\textbf{\textcolor{red}{توجه بسیار مهم:}} +حتما داک نمرات این فاز را به دقت بررسی نمایید؛ پیاده سازی شما باید شامل آن موارد باشد تا نمره هر کدام را بگیرید. هرگونه پیاده‌سازی یا طراحی اضافه‌تر، کاملاً اختیاری، و فاقد نمره‌ی اضافه می‌باشد. در این داک فقط کلیت پیاده سازی ذکر شده است. + +در این فاز شما باید گرافیکی برای لاجیک خود پیاده سازی کنید. توجه به نکات و راهنمایی‌های زیر شما را در پیاده سازی این فاز یاری می‌دهد: + + +\begin{itemize} +\item +نباید پیاده سازی لزوما به همان شکلی که در عکس‌ها می‌بینید انجام شود؛ ولی توجه کنید حتما باید بخش‌های الزامی را پیاده سازی کنید. + +\item +عکس‌هایی که در قسمت‌های مختلف آورده شده است صرفا برای ایده گرفتن است و لزومی به پیاده سازی همانند آن نیست. + + +\item +\textcolor{red}{باید} + از فونت‌های مناسب استفاده کنید؛ میتوانید از + \href{https://www.kenney.nl/assets/kenney-fonts}{\textcolor{blue}{\underline{\lr{fonts}}}} + و + \href{https://www.behance.net/collection/4860923/Free-Fonts}{\textcolor{blue}{\underline{\lr{free-font }}}} + استفاده کنید. + +\item + +می‌توانید از سایت‌های + \href{https://www.flaticon.com/}{\textcolor{blue}{\underline{\lr{flaticon}}}} + - + \href{https://icons8.com/}{\textcolor{blue}{\underline{\lr{icons8}}}} + - + \href{https://www.iconninja.com/}{\textcolor{blue}{\underline{\lr{icon ninja}}}} + آیکون‌های مورد نیاز خود را پیدا کنید. + +\item + +می‌توانید با استفاده از مستطیل و شفاف سازی آن‌ها مانند + (\href{https://raw.githubusercontent.com/titansarus/Documents/master/phase_2/main/images/img1.jpg}{\textcolor{blue}{\underline{{این عکس}}}}) و یا با استفاده از عکس‌های مختلف دکمه‌های مورد نیاز خود را بسازید. همچنین در + ( +\href{https://hannemann.itch.io/ui-button-pack-free}{\textcolor{blue}{\underline{\lr{button-pack}}}} + - \href{https://www.vecteezy.com/vector-art/116983-digital-game-button}{\textcolor{blue}{\underline{\lr{round-button}}}} + - + \href{https://www.clickminded.com/button-generator/}{\textcolor{blue}{\underline{\lr{button-factory}}}} - + \href{https://pngtree.com/free-png-vectors/hexagon}{\textcolor{blue}{\underline{\lr{hexagon}}}} + ) می‌توانید انواع دکمه‌ها را مشاهده کنید. + + +\item + +می‌توانید برای کل قسمت‌ها یا برای هر قسمت متناسب با آن، عکسی به عنوان background قرار دهید (و یا رنگ background را تغییر دهید) البته این مورد به جز +\textcolor{red}{صفحهٔ اصلی} + برای دیگر صفحات اجباری نیست و نمره اضافه‌ای نیز ندارد. لینک‌های مرتبط: + +\href{https://pngtree.com/free-backgrounds}{\textcolor{blue}{\underline{\lr{background}}}} +- + \href{https://raw.githubusercontent.com/titansarus/Documents/master/phase_2/main/images/img2.jpg}{\textcolor{blue}{\underline{\lr{background 2 }}}} + - + \href{https://github.com/titansarus/Documents/blob/master/phase_2/main/images/img3.jpg}{\textcolor{blue}{\underline{\lr{sale-background }}}} + + +\item + +ممکن است این آیکون‌ها به شما کمک کنند: + +\href{https://gamedeveloperstudio.itch.io/ui-icons}{\textcolor{blue}{\underline{\lr{icons}}}} + - +\href{https://www.kenney.nl/assets/game-icons}{\textcolor{blue}{\underline{\lr{icons}}}} + - +\href{https://www.kenney.nl/assets/ui-pack}{\textcolor{blue}{\underline{\lr{ui\_icons}}}} + - + \href{http://vecteezy.com/vector-art/112447-preloader-ui-progress}{\textcolor{blue}{\underline{\lr{progress-icon}}}} + - + \href{https://www.vecteezy.com/vector-art/144976-set-of-coupon-sale-vectors}{\textcolor{blue}{\underline{\lr{sale-icon}}}} + - + \href{https://www.iconninja.com/tag/offer-icon}{\textcolor{blue}{\underline{\lr{offer-icon}}}} + - + \href{https://www.iconninja.com/tag/add-icon}{\textcolor{blue}{\underline{\lr{buy \& add}}}} + +\item + +در هر بخش اگر عمل مورد نظر موفق نبود، باید خطای مناسب را نمایش دهید؛ توجه کنید که باید این خطاها حتما به صورت گرافیکی نمایش داده شوند ولی اجباری برای اینکه به چه شکلی باشند وجود ندارد و می‌توانید از عکس یا text یا … استفاده کنید. + +می توانید از عکس‌های زیر ایده بگیرید: + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/image4.png} +\end{center} + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/image5.png} +\end{center} + +\end{itemize} + + + +\newpage + +\section*{{\titr باید‌های پیاده‌سازی}} +\addcontentsline{toc}{section}{{\fehrestContent باید‌های پیاده‌سازی}} + +\textbf{\textcolor{red}{توجه:}} +اگر زمانی که برنامه را اجرا می‌کنید، هنوز هیچ اکانت مدیری ساخته نشده است، باید ابتدا مشخصات اکانت مدیر دریافت شود و سپس وارد صفحهٔ اصلی برنامه شوید. در غیر این‌صورت(یعنی اگر مدیر وجود داشت) با اجرا کردن برنامه وارد صفحهٔ اصلی می شوید. + +\subsection*{{\titr صفحهٔ اصلی}} + +\addcontentsline{toc}{subsection}{{\fehrestContent صفحهٔ اصلی}} + +شما باید یک منو برای انتخاب قسمت‌های مختلف یعنی ناحیه کاربری، محصولات و حراج‌ها داشته باشید. + +\textbf{\textcolor{red}{توجه:}} + دقت داشته باشید که برای این scene باید الزاما یکی از دو مورد زیر را نیز انجام دهید: + +\begin{itemize} +\item +تغییر رنگ background + +\item +قرار دادن عکسی به عنوان background + +میتوانید از عکس‌های زیر ایده بگیرید: + +\begin{center} +\includegraphics[width=0.3\textwidth]{images/image6.png} +\end{center} + +\begin{center} +\includegraphics[width=0.6\textwidth]{images/image7.png} +\end{center} +\end{itemize} + +\newpage + +\subsection*{{\titr ناحیه کاربری}} +\addcontentsline{toc}{subsection}{{\fehrestContent ناحیه کاربری}} + + شما باید در این قسمت گرافیک تمام ناحیه کاربری که در فاز اول پیاده سازی کردید را پیاده سازی کنید. + +اگر کاربر لاگین کرده باشد مشخصات و دسترسی‌های حساب کاربری نشان داده می‌شود؛ در غیر این صورت امکان ثبت‌نام یا ورود برای کاربر وجود داشته باشد. + +\textbf{\textcolor{red}{توجه:}} + امکان دسترسی به ناحیه کاربری از تمام صفحات دیگر باید وجود داشته باشد. + + + +\subsubsection*{{\titr پنل ثبت‌نام و ورود}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent پنل ثبت‌نام و ورود}} + +شما باید برای ثبت‌نام و همچنین ورود هر کاربر صفحه‌ای را پیاده سازی کنید. در صفحه‌ٔ‌ ثبت نام، باید برای دو نوع کاربر (خریدار و فروشنده)، فرم مربوط به آن موجود باشد و فیلدهای مربوط به هرکدام به کاربر نمایش داده‌ شود. توجه کنید که ثبت نام خریدار در صورت نبود مشکل بلافاصله انجام می‌پذیرد و بعد از آن می‌تواند login کند اما برای فروشنده، باید ابتدا ثبت نام آن توسط مدیر تایید شود و سپس می‌تواند login کند. پس از ورود نیز به همان صفحه‌ای که قبل از آن بوده می‌رود. + + +می‌توانید از عکس‌های زیر ایده بگیرید: + + + + + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image9.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image10.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image11.png} +\end{center} + +\begin{center} +\includegraphics[width=0.6\textwidth]{images/image12.png} +\end{center} + +\begin{center} +\includegraphics[width=0.6\textwidth]{images/image8.png} +\end{center} + + +\newpage + + +\subsubsection*{{\titr حساب کاربری}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent حساب کاربری}} + +شما باید صفحه‌ای برای نشان دادن اطلاعات کاربر داشته باشید؛ به عنوان مثال برای خریدار نمایش اطلاعات زیر الزامی است: + +\begin{itemize} +\item +اطلاعات شخصی نظیر نام کاربری، نام، نام‌خانوادگی، ایمیل، شماره، رمز عبور + +\item +نقش فرد (اگر فروشنده است اسم شرکت/کارگاه/کارخانه نیز ذکر شود.) + +\item +دکمه انتقال به سبد خرید + +\item +اعتبار + +\item +دکمه‌ انتقال به صفحه سابقهٔ خرید + +\item +لیست کدهای تخفیف شخص + + + + +\end{itemize} + + +برای مدیر و فروشنده نیز بایستی تمامی موارد گفته شده در فاز 1 را پیاده کنید. + + +می‌توانید از عکس‌های زیر ایده بگیرید: + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image13.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image14.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image15.png} +\end{center} + +\newpage + +\subsection*{{\titr محصولات}} +\addcontentsline{toc}{subsection}{{\fehrestContent محصولات}} + +\subsubsection*{{\titr صفحهٔ محصولات}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent صفحهٔ محصولات}} + + +در این صفحه، باید لیست دسته‌بندی‌ها، ابزار sort، ابزار فیلتر و لیست محصولات طبق فیلتر اعمال شده و با ترتیبی که مشخص شده است نمایش داده شود. در حالت پیش‌فرض، هیچ فیلتری اعمال نشده است و همه‌ی محصولات به ترتیب تاریخ افزودن محصول نمایش داده می‌شوند. + + +\textbf{\textcolor{red}{توجه ۱:}} +برای اعمال فیلتر، کافیست یک دکمهٔ وجود داشته باشد که با زدن آن، لیست محصولات با توجه به فیلتر update شود. + + +\textbf{\textcolor{red}{توجه ۲:}} + هر محصول در لیست محصولات باید دارای عکس، عنوان، قیمت و نمره باشد. + + +می‌توانید از عکس‌های زیر ایده بگیرید: + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image16.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image19.png} +\end{center} + + + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/image17.png} +\end{center} + + + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/image18.png} +\end{center} + + + + + + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image20.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image21.png} +\end{center} + +\newpage +\subsubsection*{{\titr کالا}} +\addcontentsline{toc}{subsubsection}{{\fehrestContent کالا}} + +باید صفحه‌ای داشته باشید که برای هر کالا هنگام کلیک بر روی آن، مشخصات آن کالا را نشان دهد. مواردی که باید حتما پیاده سازی شوند: +\begin{itemize} +\item +ویژگی‌های عمومی (نام، توضیحات، قیمت، نمره و...) + +\item +ویژگی‌های خاص دسته‌بندی محصول + +\item + لیست نظرات (هر نظر شامل نام کاربری نظر دهنده، متن نظر و این که کالا را خریده یا نه است) + + \item +امکان نظر دادن + +\item +نمره دادن به محصول (در صورتی که آن را خریده باشد) + +\item +دکمه‌ی افزودن به سبد خرید + +\item +اگر از چند فروشنده پشتیبانی می‌کنید، لیست فروشندگان و قابلیت انتخاب فروشنده باید وجود داشته باشد. + +\end{itemize} + +می‌توانید از عکس‌های زیر ایده بگیرید: + + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/image22.png} +\end{center} + + +\begin{center} +\includegraphics[width=1.0\textwidth]{images/image23.png} +\end{center} + + + +\begin{center} +\includegraphics[width=1.0\textwidth]{images/image24.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image25.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image26.png} +\end{center} + +\newpage + +\subsection*{{\titr حراج‌ها}} +\addcontentsline{toc}{subsection}{{\fehrestContent حراج‌ها}} + +شما باید صفحه‌ای برای نشان دادن حراج‌ها داشته باشید. ساختار این صفحه کاملا مشابه صفحهٔ محصولات است، با این تفاوت که فقط کالاهای دارای حراج را نمایش می‌دهد. + +\textbf{\textcolor{red}{توجه ۱:}} +این صفحه را میتوانید به عنوان یک فیلتر (مثلا فیلتر تخفیف) در صفحه محصولات پیاده کنید. (در این صورت نیازی به داشتن دکمه ای برای انتقال به صفحهٔ حراج‌ها در منوی اصلی نیست) + + +\textbf{\textcolor{red}{توجه 2:}} +هر محصول در این لیست باید علاوه بر عکس، عنوان، قیمت و نمره،زمان باقی‌مانده به پایان حراج و میزان تخفیف را نیز شامل شود. + + +\subsection*{{\titr سبد خرید}} +\addcontentsline{toc}{subsection}{{\fehrestContent سبد خرید}} + +شما باید صفحه‌ای برای نشان دادن سبد خرید کاربر داشته باشید. مواردی که باید حتما پیاده سازی شوند: + +\begin{itemize} +\item +کالا‌های موجود در سبد خرید + +\item +قیمت و تعداد کالاها + +\item +هزینه نهایی اجناس موجود در سبد کالا + +\item +گزینه‌ای برای افزایش یا کاهش تعداد کالای موجود در سبد کالا + +\item +گزینه‌ای برای انتقال به صفحه پرداخت (در ادامه توضیح داده شده است) + + +\end{itemize} + +\textbf{\textcolor{red}{توجه:}} + در صورت کلیک بر روی هر محصول باید وارد صفحه مربوط به آن کالا شوید. + + +می‌توانید از عکس های زیر ایده بگیرید: + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image28.png} +\end{center} + + +\begin{center} +\includegraphics[width=1.1\textwidth]{images/image27.png} +\end{center} + +\newpage + + +\subsection*{{\titr صفحه پرداخت }} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحه پرداخت }} + +در این صفحه باید مراحل زیر را به ترتیب پیاده کنید: + +\begin{enumerate} +\item +اطلاعات دریافت‌کننده (آدرس، تلفن و...) + +\item +دریافت کد تخفیف + +\item +دکمهٔ پرداخت + +\end{enumerate} + +پس از زدن دکمهٔ پرداخت، گزارش نهایی خرید نمایش داده می‌شود. (اگر موفق بود تایید کسر مبلغ از اعتبار حساب، در غیر این صورت پیغام خطای مناسب نمایش داده شود.) + +\textbf{\textcolor{red}{توجه:}} + دقت کنید که مراحل بالا الزاما باید به ترتیب پیاده شوند و مثلا نباید وقتی که هنوز اطلاعات دریافت‌کننده وارد نشده است، دکمهٔ پرداخت نشان داده شود. + + +\subsection*{{\titr سابقهٔ خرید/فروش }} +\addcontentsline{toc}{subsection}{{\fehrestContent سابقهٔ خرید/فروش }} + +در این صفحه بایستی لیست لاگ‌های خرید یا فروش کاربر را نمایش دهید و برای هر لاگ نیز تمام مشخصات آن -که در فاز 1 پیاده کردید- را نمایش دهید. + +توجه کنید که می‌توانید این صفحه را با صفحه حساب کاربری ترکیب کنید ولی حتما بایستی این موارد پیاده شده باشند. + + +\newpage + + + +\section*{{\titr ویژگی‌های انتخابی }} +\addcontentsline{toc}{section}{{\fehrestContent ویژگی‌های انتخابی }} + +تمامی این موارد +\textbf{\textcolor{red}{نمره امتیازی}} + دارند و اجباری برای پیاده سازی این موارد وجود ندارد: + + +\subsection*{{\titr صداگذاری }} +\addcontentsline{toc}{subsection}{{\fehrestContent صداگذاری }} + + +می‌توانید از آهنگی مناسب برای برنامه ی خود استفاده کنید؛ همچنین می توانید برای دکمه‌ها و ... +صداگذاری کنید. + + +در اینجا تعدادی سایت برای صداگذاری قرار داده‌ایم: + +\href{https://www.kenney.nl/assets/impact-sounds}{\textcolor{blue}{\underline{\lr{sound}}}} + - + \href{https://www.kenney.nl/assets/digital-audio}{\textcolor{blue}{\underline{\lr{digital sound}}}} + - + \href{https://www.kenney.nl/assets/ui-audio}{\textcolor{blue}{\underline{\lr{ui sound}}}} + - + \href{https://www.zapsplat.com/}{\textcolor{blue}{\underline{\lr{sound-site}}}} + + +\subsection*{{\titr Animation Sprite }} +\addcontentsline{toc}{subsection}{{\fehrestContent Animation Sprite }} + +برای برخی از بخش‌ها می‌توانید از عکس‌های متحرک و یا Sprite ها استفاده کنید ( مثلا در بخش حراج، صفحه هر محصول و...) + +\subsection*{{\titr بخش تبلیغات }} +\addcontentsline{toc}{subsection}{{\fehrestContent بخش تبلیغات }} + +می‌توانید در صفحه‌ی محصولات، بخشی برای نمایش تبلیغات داشته باشید؛ برای تبلیغ کردن یکی از کالاهای خود، در این قسمت باید به مدیر اصلی سایت درخواست دهید و در صورت تایید مدیر این تبلیغ میتواند نشان داده شود. + +\textbf{\textcolor{red}{توجه ۱:}} + یک کاربر فروشنده می‌تواند این درخواست را از طریق حساب کاربری به مدیر ارسال کند. + +\textbf{\textcolor{red}{توجه 2:}} +هر فروشنده فقط یکی از محصولات خود را در آن واحد می تواند تبلیغ کند و در صورت تبلیغ محصولی دیگر، تبلیغ محصول قبلی لغو میشود. توجه کنید که برای هر تبلیغ، مقدار مشخصی از اعتبار فروشنده کسر می‌شود. همچنین هر تبلیغ یک ددلاین داشته باشد. + +\newpage +\subsection*{{\titr up Pop }} +\addcontentsline{toc}{subsection}{{\fehrestContent up Pop }} + +می‌توانید مانند عکس زیر، در مواقع خاص همانند خرید ، حراج و ….. از این \lr{Pop up} ها استفاده کنید؛ مثلا می‌توانید صفحه ورود را به صورت \lr{Pop up} پیاده کنید. + + + +\begin{center} +\includegraphics[width=0.9\textwidth]{images/image29.png} +\end{center} + + +\subsection*{{\titr امتیاز هر کالا }} +\addcontentsline{toc}{subsection}{{\fehrestContent امتیاز هر کالا }} + +نمایش امتیاز کالا در صفحهٔ محصولات و صفحهٔ محصول، بصورت گرافیکی، مطابق عکس‌های زیر: + + +\begin{center} +\includegraphics[width=0.75\textwidth]{images/image31.png} +\end{center} + +\begin{center} +\includegraphics[width=0.6\textwidth]{images/image30.png} +\end{center} + + + + +\begin{center} +\includegraphics[width=0.8\textwidth]{images/image32.png} +\end{center} + + +\newpage + + +\subsection*{{\titr فیلتر Real-time }} +\addcontentsline{toc}{subsection}{{\fehrestContent فیلتر real-time }} + +در این قسمت باید ابزار فیلتر را به گونه‌ای پیاده سازی کنید که با تغییر هر پارامتر فیلتر، لیست کالاها update شود. (بدون نیاز به دکمهٔ اعمال فیلتر) + + +\subsection*{{\titr Zoom }} +\addcontentsline{toc}{subsection}{{\fehrestContent Zoom }} + + با حرکت موس بر روی تصویر محصول نمای بزرگتری از محصول نمایش داده شود. + + + + \begin{center} +\includegraphics[width=0.9\textwidth]{images/image33.png} +\end{center} + + + +\subsection*{{\titr تغییر عکس کالا متناسب وضعیت آن }} +\addcontentsline{toc}{subsection}{{\fehrestContent تغییر عکس کالا متناسب وضعیت آن }} + + +\begin{itemize} + +\item + +نمایش تخفیف هر کالا روی تصویر آن: باید درصد تخفیف را بر روی عکس کالاهایی که تخفیف خورده است نمایش دهید (هم در صفحه‌ی محصولات و هم در صفحه‌ی خود محصول). + +\item + +اجناس تمام شده: عکس اجناسی را که تمام شده‌اند در صفحهٔ محصولات و صفحهٔ محصول، به شکلی متفاوت نمایش دهید؛ مثلا می توانید روی آنها \lr{sold out} بنویسید یا عکس آنها را خاکستری کنید. + + +\end{itemize} + +\newpage + +\subsection*{{\titr نمایش محصولات مشابه }} +\addcontentsline{toc}{subsection}{{\fehrestContent نمایش محصولات مشابه }} + +در این قسمت باید با ورود به صفحه‌ی یک محصول بتوان محصولات مشابه را نیز نمایش داد. ( مثلا در صفحه‌ی گوشی یک مدل سامسونگ سایر گوشی‌ها نیز باشد) + +\subsection*{{\titr اسلاید }} +\addcontentsline{toc}{subsection}{{\fehrestContent اسلاید }} + +در صفحه‌ی نمایش همه‌ی محصولات می‌توانید تبلیغات را به شکل اسلاید نمایش دهید؛ عکس‌ها می‌توانند به صورت زمان‌دار و یا با کلیک کردن جا به جا شوند. + + \begin{center} +\includegraphics[width=0.9\textwidth]{images/image34.png} +\end{center} + +\subsection*{{\titr انیمیشن در اسلاید }} +\addcontentsline{toc}{subsection}{{\fehrestContent انیمیشن در اسلاید }} + + +اسلاید‌های شما می‌تواند همراه انیمیشن باشد. (یعنی ورود اسلاید و خروج آن انیمیشن داشته باشد) + + +\subsection*{{\titr ویدیو }} +\addcontentsline{toc}{subsection}{{\fehrestContent ویدیو }} + + +می‌توانید برای هر محصول در صفحه آن، علاوه بر عکس قابلیت قرار دادن ویدیو قرار دهید. + + +\subsection*{{\titr اسکرول }} +\addcontentsline{toc}{subsection}{{\fehrestContent اسکرول }} + +قابلیت scroll در صفحاتی که لیست (لیست محصولات و لاگ‌ها و ...) نمایش داده می‌شود وجود داشته باشد. + + +\newpage + +\subsection*{{\titr صفحه بندی }} +\addcontentsline{toc}{subsection}{{\fehrestContent صفحه بندی }} + + +در صفحاتی که لیستی از محصولات نمایش داده می‌شود (صفحه محصولات و حراج‌ها) در صورتی که مثلا تعداد محصولات از ۲۰ تا بیشتر باشد، مابقی را به صفحات بعدی منتقل کند، و در پایین لیست، قابلیت انتخاب شماره صفحه وجود داشته باشد. + + + \begin{center} +\includegraphics[width=0.9\textwidth]{images/image35.png} +\end{center} + + +\section*{{\titr لینک‌های آموزشی }} +\addcontentsline{toc}{section}{{\fehrestContent لینک‌های آموزشی }} + +\begin{itemize} + +\item +\href{https://www.javatpoint.com/javafx-tutorial}{\textcolor{blue}{\underline{\lr{java point}}}} + +\item +\href{https://www.tutorialspoint.com/javafx/index.htm}{\textcolor{blue}{\underline{\lr{tutorials point}}}} + +\end{itemize} + + + + +\end{document} + + + + + + + diff --git a/phase_2/main/XB Zar bold.ttf b/phase_2/main/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_2/main/XB Zar bold.ttf differ diff --git a/phase_2/main/XB Zar.ttf b/phase_2/main/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_2/main/XB Zar.ttf differ diff --git a/phase_2/main/images/image10.png b/phase_2/main/images/image10.png new file mode 100644 index 0000000..c2d2a6b Binary files /dev/null and b/phase_2/main/images/image10.png differ diff --git a/phase_2/main/images/image11.png b/phase_2/main/images/image11.png new file mode 100644 index 0000000..301e40a Binary files /dev/null and b/phase_2/main/images/image11.png differ diff --git a/phase_2/main/images/image12.png b/phase_2/main/images/image12.png new file mode 100644 index 0000000..a38a526 Binary files /dev/null and b/phase_2/main/images/image12.png differ diff --git a/phase_2/main/images/image13.png b/phase_2/main/images/image13.png new file mode 100644 index 0000000..adfd668 Binary files /dev/null and b/phase_2/main/images/image13.png differ diff --git a/phase_2/main/images/image14.png b/phase_2/main/images/image14.png new file mode 100644 index 0000000..8144650 Binary files /dev/null and b/phase_2/main/images/image14.png differ diff --git a/phase_2/main/images/image15.png b/phase_2/main/images/image15.png new file mode 100644 index 0000000..8ea5a54 Binary files /dev/null and b/phase_2/main/images/image15.png differ diff --git a/phase_2/main/images/image16.png b/phase_2/main/images/image16.png new file mode 100644 index 0000000..28a01d7 Binary files /dev/null and b/phase_2/main/images/image16.png differ diff --git a/phase_2/main/images/image17.png b/phase_2/main/images/image17.png new file mode 100644 index 0000000..578da1a Binary files /dev/null and b/phase_2/main/images/image17.png differ diff --git a/phase_2/main/images/image18.png b/phase_2/main/images/image18.png new file mode 100644 index 0000000..0d4fd7a Binary files /dev/null and b/phase_2/main/images/image18.png differ diff --git a/phase_2/main/images/image19.png b/phase_2/main/images/image19.png new file mode 100644 index 0000000..8cfa334 Binary files /dev/null and b/phase_2/main/images/image19.png differ diff --git a/phase_2/main/images/image20.png b/phase_2/main/images/image20.png new file mode 100644 index 0000000..3c140df Binary files /dev/null and b/phase_2/main/images/image20.png differ diff --git a/phase_2/main/images/image21.png b/phase_2/main/images/image21.png new file mode 100644 index 0000000..9e0a612 Binary files /dev/null and b/phase_2/main/images/image21.png differ diff --git a/phase_2/main/images/image22.png b/phase_2/main/images/image22.png new file mode 100644 index 0000000..5f7c6bc Binary files /dev/null and b/phase_2/main/images/image22.png differ diff --git a/phase_2/main/images/image23.png b/phase_2/main/images/image23.png new file mode 100644 index 0000000..debbb3d Binary files /dev/null and b/phase_2/main/images/image23.png differ diff --git a/phase_2/main/images/image24.png b/phase_2/main/images/image24.png new file mode 100644 index 0000000..1a60dbc Binary files /dev/null and b/phase_2/main/images/image24.png differ diff --git a/phase_2/main/images/image25.png b/phase_2/main/images/image25.png new file mode 100644 index 0000000..fbd5f44 Binary files /dev/null and b/phase_2/main/images/image25.png differ diff --git a/phase_2/main/images/image26.png b/phase_2/main/images/image26.png new file mode 100644 index 0000000..fcb5dd3 Binary files /dev/null and b/phase_2/main/images/image26.png differ diff --git a/phase_2/main/images/image27.png b/phase_2/main/images/image27.png new file mode 100644 index 0000000..c5f478a Binary files /dev/null and b/phase_2/main/images/image27.png differ diff --git a/phase_2/main/images/image28.png b/phase_2/main/images/image28.png new file mode 100644 index 0000000..e472a44 Binary files /dev/null and b/phase_2/main/images/image28.png differ diff --git a/phase_2/main/images/image29.png b/phase_2/main/images/image29.png new file mode 100644 index 0000000..a371452 Binary files /dev/null and b/phase_2/main/images/image29.png differ diff --git a/phase_2/main/images/image30.png b/phase_2/main/images/image30.png new file mode 100644 index 0000000..733b153 Binary files /dev/null and b/phase_2/main/images/image30.png differ diff --git a/phase_2/main/images/image31.png b/phase_2/main/images/image31.png new file mode 100644 index 0000000..666b4f0 Binary files /dev/null and b/phase_2/main/images/image31.png differ diff --git a/phase_2/main/images/image32.png b/phase_2/main/images/image32.png new file mode 100644 index 0000000..33ed78d Binary files /dev/null and b/phase_2/main/images/image32.png differ diff --git a/phase_2/main/images/image33.png b/phase_2/main/images/image33.png new file mode 100644 index 0000000..0104bb5 Binary files /dev/null and b/phase_2/main/images/image33.png differ diff --git a/phase_2/main/images/image34.png b/phase_2/main/images/image34.png new file mode 100644 index 0000000..b7d0405 Binary files /dev/null and b/phase_2/main/images/image34.png differ diff --git a/phase_2/main/images/image35.png b/phase_2/main/images/image35.png new file mode 100644 index 0000000..8097565 Binary files /dev/null and b/phase_2/main/images/image35.png differ diff --git a/phase_2/main/images/image4.png b/phase_2/main/images/image4.png new file mode 100644 index 0000000..ac2c10c Binary files /dev/null and b/phase_2/main/images/image4.png differ diff --git a/phase_2/main/images/image5.png b/phase_2/main/images/image5.png new file mode 100644 index 0000000..123b60e Binary files /dev/null and b/phase_2/main/images/image5.png differ diff --git a/phase_2/main/images/image6.png b/phase_2/main/images/image6.png new file mode 100644 index 0000000..5cb3f48 Binary files /dev/null and b/phase_2/main/images/image6.png differ diff --git a/phase_2/main/images/image7.png b/phase_2/main/images/image7.png new file mode 100644 index 0000000..ccf18de Binary files /dev/null and b/phase_2/main/images/image7.png differ diff --git a/phase_2/main/images/image8.png b/phase_2/main/images/image8.png new file mode 100644 index 0000000..0eae995 Binary files /dev/null and b/phase_2/main/images/image8.png differ diff --git a/phase_2/main/images/image9.png b/phase_2/main/images/image9.png new file mode 100644 index 0000000..091922a Binary files /dev/null and b/phase_2/main/images/image9.png differ diff --git a/phase_2/main/images/img1.jpg b/phase_2/main/images/img1.jpg new file mode 100644 index 0000000..4975ae4 Binary files /dev/null and b/phase_2/main/images/img1.jpg differ diff --git a/phase_2/main/images/img2.jpg b/phase_2/main/images/img2.jpg new file mode 100644 index 0000000..298b6cb Binary files /dev/null and b/phase_2/main/images/img2.jpg differ diff --git a/phase_2/main/images/img3.jpg b/phase_2/main/images/img3.jpg new file mode 100644 index 0000000..ac25eb5 Binary files /dev/null and b/phase_2/main/images/img3.jpg differ diff --git a/phase_2/main/sharif.png b/phase_2/main/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_2/main/sharif.png differ diff --git a/phase_2/main/sharif1.png b/phase_2/main/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_2/main/sharif1.png differ diff --git a/phase_2/main/tex.bib b/phase_2/main/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_2/main/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/REST/IRNazanin.ttf b/phase_3/REST/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/REST/IRNazanin.ttf differ diff --git a/phase_3/REST/IRNazaninBold.ttf b/phase_3/REST/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/REST/IRNazaninBold.ttf differ diff --git a/phase_3/REST/IRNazaninIrani.ttf b/phase_3/REST/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/REST/IRNazaninIrani.ttf differ diff --git a/phase_3/REST/LiberationSerif-Bold.ttf b/phase_3/REST/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/REST/LiberationSerif-Bold.ttf differ diff --git a/phase_3/REST/LiberationSerif-BoldItalic.ttf b/phase_3/REST/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/REST/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/REST/LiberationSerif-Italic.ttf b/phase_3/REST/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/REST/LiberationSerif-Italic.ttf differ diff --git a/phase_3/REST/LiberationSerif-Regular.ttf b/phase_3/REST/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/REST/LiberationSerif-Regular.ttf differ diff --git a/phase_3/REST/XB Zar bold.ttf b/phase_3/REST/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/REST/XB Zar bold.ttf differ diff --git a/phase_3/REST/XB Zar.ttf b/phase_3/REST/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/REST/XB Zar.ttf differ diff --git a/phase_3/REST/rest.pdf b/phase_3/REST/rest.pdf new file mode 100644 index 0000000..509af77 Binary files /dev/null and b/phase_3/REST/rest.pdf differ diff --git a/phase_3/REST/rest.tex b/phase_3/REST/rest.tex new file mode 100644 index 0000000..eb96d42 --- /dev/null +++ b/phase_3/REST/rest.tex @@ -0,0 +1,298 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{\lr{REST}} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{سپهر پورقناد}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو}} + + + \vspace{0.05cm} + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{\lr{REST}} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + \Large \textbf{\\ +} + + +\section*{{\titr بچه‌ها سلام!}} +\addcontentsline{toc}{section}{{\fehrestContent بچه‌ها سلام!}} +تو این قسمت قراره با همدیگه با یه سری مفاهیم مثل \lr{REST}, \lr{RESTful} , \lr{API} , \lr{Request} و ... آشنا بشیم. این مفاهیم متاسفانه جزو قسمت‌های واجب درس ap شما نیست ولی جز مهم‌ترین چیز‌ها و مفیدترین چیزهایی هست که می‌تونید شما تو این درس یاد بگیرید (بین خودمون باشه! من کلا اون قسمتای ته ap که درباره‌ی \lr{Socket} و \lr{Socket Programming} هست رو درست یاد نگرفتم متاسفانه (شما مثل من نباشید) ولی عوضش اینا رو خوب بلدم). + +این قسمت تو صنعت خیلی کاربرد داره . اون بچه هایی که دوست دارن که بعد ها برن سر کار پیشنهاد میشه که حتما حتما خیلی خوب این مفاهیمی که اینجا گفته میشه رو شنیده باشن و روش یه شهود خیلی خوبی داشته باشن. + +\section*{{\titr اصل مطلب}} +\addcontentsline{toc}{section}{{\fehrestContent اصل مطلب}} +بذارید با یه مثال براتون شروع کنم که خوب شهود بگیرید نسبت به موضوع بعد هم چند تا لینک در ادامه هست که جزئیات رو خیلی خوب براتون توضیح داده. + +فرض کنید شما در یک شرکت خیلی بزرگ کار می‌کنید که حدود ۱۰۰۰۰ نفر کارمند داره. شما اونجا مسئول انبار هستید و روزانه یه عالمه درخواست میاد براتون و شما موظفید که به همشون پاسخ بدین. این انبار ۱۰ تا در هم داره که هر کسی از هر جا دلش خواست می‌تونه بیاد و هر چی دلش خواست رو هر جوری دلش خواست، درخواست کنه. شما که می‌بینید مدیریت این همه درخواست داره شما رو از پا درمیاره تصمیم می‌گیرید که در یک اقدام مقتدرانه تمامی درها رو ببندید و فقط یک در رو باز بزارید و از این به بعد هر کسی نمی‌تونه هر جور که دلش خواست با شما حرف بزنه (بالاخره شما مدیر انبارید !!!). + +برای همین شما یک برگه طراحی می‌کنید و به همه می‌گید که درخواست هاشون رو توی این برگه طبق روالی که توش مشخص شده بنویسن و به شما بدن . شما هم هر برگه‌ای که گرفتید اگر مورد تایید بود همونجا به درخواست اون فرد پاسخ می‌دید. حالا می‌بیند که حجم کارتون بالا رفته . تصمیم می‌گیرید که درهایی که بستید رو باز کنید و برای هر کدوم یه برگه خاص طراحی می‌کنید که روال درخواست نوشتن توی این برگه‌ها با همدیگه متفاوته و این برگه‌ها رو هم در اختیار همه قرار نمی‌دین . + +اون درهای انبار مثل \lr{API} می‌مونن . هر کسی که میاد در خواستی داره باید درخواستش رو از طریق این \lr{API} ها به شما که \lr{Server} هستید برسونه. حالا اون برگه ها هم هر کدوم یه \lr{Protocol} هستن. یعنی شما که \lr{Server} هستین با \lr{Client} "قرارداد" می‌کنید که با یه سری قوانین خاص با هم دیگه صحبت کنید . و این \lr{Protocol} ها می‌تونن با همدیگه متفاوت باشن. + + + + +\section*{{\titr REST}} +\addcontentsline{toc}{section}{{\fehrestContent REST}} +حالا \lr{REST} یه جور \lr{Protocol} هست (اهل فن در این زمینه به این چیزا \lr{Design Pattern} هم میگن)، که شما طبق اون \lr{Request} رو با یه فرمت خاصی برای سرور یه آدرس (همون \lr{url} یا \lr{path}) خاصی می‌فرستید و اون سرور در یک قالب خاصی به شما \lr{Response} می‌ده. + +حالا که کلیات رو گرفتید می‌تونید \lr{REST} رو خیلی راحت‌تر درک کنید . لینک زیر خیلی منسجم اومده \lr{REST} و \lr{API REST} رو توضیح داده و تقریبا هر چیزی که نیازه رو با مثال براتون توضیح داده: + +\begin{flushleft} +\href{https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/}{\textcolor{blue}{\underline{\lr{https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/}}}} +\end{flushleft} + +این لینک هم خیلی خوب درباره اینکه اصن api چیه و چه انواعی داره خوب توضیح داده: + +\begin{flushleft} +\href{https://www.moesif.com/blog/api-guide/getting-started-with-apis/}{\textcolor{blue}{\underline{\lr{https://www.moesif.com/blog/api-guide/getting-started-with-apis/}}}} +\end{flushleft} + +این لینک هم اومده پیشرفته‌تر به \lr{REST} نگاه کرده و یه عالمه \lr{best practice} (برید ببینید یعنی چی! بدرد زندگیتون میخوره!!!!) رو مطرح کرده و واسه بررسی \lr{HTTP request} و تفاوت \lr{post} و \lr{get} و \lr{patch} و \lr{delete} و یه سری مباحث پیشرفته‌تر کلی لینک از جاهای مختلف براتون آورده هر جا براتون مبهم بود می‌تونید به لینکایی که داده یه سری بزنید. + +\begin{flushleft} +\href{https://www.moesif.com/blog/api-guide/api-design-guidelines/}{\textcolor{blue}{\underline{\lr{https://www.moesif.com/blog/api-guide/api-design-guidelines/}}}} +\end{flushleft} + +این لینک هم خیلی خوبه. کلی چیز به گوشتون می‌خوره که تا حالا نشنیدید . این دوستمون بیشتر از اینکه به این بپردازه که \lr{REST} چیه اومده درباره معماری یه سیستمی که قراره با \lr{REST} کار کنه صحبت کرده. خوبه که واقعا ببینید این لینکو چون دیدتون رو نسبت به مهندسی نرم افزار عوض می‌کنه (چون احتمالا تا اینجا همش \lr{AP} رو دیدید و یه عالمه کد زدین فکر می‌کنید همش همینه و جذاب نیست) ولی چالش و مشکلاتی که تو طراحی یه سیستم \lr{RESTful} هست رو بررسی می‌کنه و میگه برای اینکه یه سیستم خوب داشته باشیم نیازه که چه ویژگی‌هایی داشته باشه و… . اگر خیلی جاهاش رو نفهمیدید اصلا نترسید و نگران نباشید . اصلا قرار نیست از این تو جایی از پروژتون استفاده کنید. ولی عوضش این لینک میتونه کلی دید بهتون بده سر اینکه مهندسی نرم افزار واقعی نزدیک به چه چیزاییه!!! + +\begin{flushleft} +\href{https://blog.feathersjs.com/design-patterns-for-modern-web-apis-1f046635215}{\textcolor{blue}{\underline{\lr{https://blog.feathersjs.com/design-patterns-for-modern-web-apis-1f046635215}}}} +\end{flushleft} + +\section*{{\titr پس پروژه چی شد این وسط؟؟ +}} +\addcontentsline{toc}{section}{{\fehrestContent پس پروژه چی شد این وسط؟؟}} + +برای پیاده سازی \lr{REST} در جاوا خودتون می‌تونید سرچ کنید و به عنوان نمونه این لینک پیاده سازی یه برنامه ساده \lr{REST} تو جاوا رو توضیح می‌ده: + +\begin{flushleft} +\href{https://happycoding.io/tutorials/java-server/rest-api#simple-example-rest-api}{\textcolor{blue}{\underline{\lr{https://happycoding.io/tutorials/java-server/rest-api\#simple-example-rest-api}}}} +\end{flushleft} + + + + +\end{document} + + + + + + + + + diff --git a/phase_3/REST/sharif.png b/phase_3/REST/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/REST/sharif.png differ diff --git a/phase_3/REST/sharif1.png b/phase_3/REST/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/REST/sharif1.png differ diff --git a/phase_3/REST/tex.bib b/phase_3/REST/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/REST/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/bank/IRNazanin.ttf b/phase_3/bank/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/bank/IRNazanin.ttf differ diff --git a/phase_3/bank/IRNazaninBold.ttf b/phase_3/bank/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/bank/IRNazaninBold.ttf differ diff --git a/phase_3/bank/IRNazaninIrani.ttf b/phase_3/bank/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/bank/IRNazaninIrani.ttf differ diff --git a/phase_3/bank/LiberationSerif-Bold.ttf b/phase_3/bank/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/bank/LiberationSerif-Bold.ttf differ diff --git a/phase_3/bank/LiberationSerif-BoldItalic.ttf b/phase_3/bank/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/bank/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/bank/LiberationSerif-Italic.ttf b/phase_3/bank/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/bank/LiberationSerif-Italic.ttf differ diff --git a/phase_3/bank/LiberationSerif-Regular.ttf b/phase_3/bank/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/bank/LiberationSerif-Regular.ttf differ diff --git a/phase_3/bank/XB Zar bold.ttf b/phase_3/bank/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/bank/XB Zar bold.ttf differ diff --git a/phase_3/bank/XB Zar.ttf b/phase_3/bank/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/bank/XB Zar.ttf differ diff --git a/phase_3/bank/bank.pdf b/phase_3/bank/bank.pdf new file mode 100644 index 0000000..9b3c115 Binary files /dev/null and b/phase_3/bank/bank.pdf differ diff --git a/phase_3/bank/bank.tex b/phase_3/bank/bank.tex new file mode 100644 index 0000000..02ff296 --- /dev/null +++ b/phase_3/bank/bank.tex @@ -0,0 +1,748 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} +\definecolor{CustomColor}{HTML}{cc0000} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + +\colorlet{punct}{red!60!black} +\definecolor{background}{HTML}{EEEEEE} +\definecolor{delim}{RGB}{20,105,176} +\colorlet{numb}{magenta!60!black} + +\lstdefinelanguage{json}{ + basicstyle=\normalfont\ttfamily, + numbers=left, + numberstyle=\scriptsize, + stepnumber=1, + numbersep=8pt, + showstringspaces=false, + breaklines=true, + frame=lines, + backgroundcolor=\color{background}, + literate= + *{0}{{{\color{numb}0}}}{1} + {1}{{{\color{numb}1}}}{1} + {2}{{{\color{numb}2}}}{1} + {3}{{{\color{numb}3}}}{1} + {4}{{{\color{numb}4}}}{1} + {5}{{{\color{numb}5}}}{1} + {6}{{{\color{numb}6}}}{1} + {7}{{{\color{numb}7}}}{1} + {8}{{{\color{numb}8}}}{1} + {9}{{{\color{numb}9}}}{1} + {:}{{{\color{punct}{:}}}}{1} + {,}{{{\color{punct}{,}}}}{1} + {\{}{{{\color{delim}{\{}}}}{1} + {\}}{{{\color{delim}{\}}}}}{1} + {[}{{{\color{delim}{[}}}}{1} + {]}{{{\color{delim}{]}}}}{1}, +} + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{بانک} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{محسن دهقان کار، علیرضا شاطری و صابر ظفرپور}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو}} + + + \vspace{0.05cm} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{بانک} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + +\tableofcontents + +\newpage + + \Large \textbf{\\\\ +} + + +\section*{{\titr اجرای بانک}} +\addcontentsline{toc}{section}{{\fehrestContent اجرای بانک}} + +برای اجرای فایلی که در اختیارتان قرار می‌دهیم در ترمینال یا (‌در ویندوز \lr{cmd}) این دستور را وارد کنید: + +\begin{latin} + +\begin{lstlisting}{java} +java -jar bank.jar "port" "debug" +\end{lstlisting} + +\end{latin} + +\lr{Bank.jar} اسم فایل با پسوند \lr{jar} است که در اختیارتان قرار داده می‌شود و در قسمت \lr{port‌} پورت مورد نظر و در قسمت \lr{debug} عدد 0 یا 1 بنویسید. (0 یعنی سرور در مود عادی اجرا شود و 1 یعنی سرور با مود دیباگ اجرا شود و تفاوت این دو مود در پایین توضیح داده شده است.) + +\begin{itemize} + +\item +برای اجرای سرور باید ورژن جاوا شما حداقل ۱۱ باشد. برای اینکه ورژن جاوا خود را ببینید دستور زیر را در ترمینال یا cmd ویندوز وارد کنید: + +\begin{latin} + +\begin{lstlisting}{java} +java --version +\end{lstlisting} + +\end{latin} + +\item[\textcolor{red}{$\star \star \star$}] +در صورتی که نسخه جاوا شما قدیمی است: + +اگر \textbf{سیستم عامل ویندوز }دارید ابتدا از این + \href{http://dl.yasdl.com/2020/Software/Java.Development.Kit.11.0.6.x64_YasDL.com.rar?a}{\textcolor{blue}{\underline{{لینک}}}} فایل نصبی جاوا را دانلود و نصب کنید و پس از نصب وارد تنظیمات \lr{Edit the system environment variables} شوید و در قسمت \lr{environment variables} طبق تصویر صفحه بعد \lr{path} را بیابید و ادیت کنید. حال در بین مسیرهای موجود سعی کنید مسیر قبلی java را بیابید و آن را با مسیر پوشه \lr{bin} جاوای نسخه جدید خود عوض کنید. + +\lr{(C:\textbackslash Program Files\textbackslash Java\textbackslash jdk-11.0.6\textbackslash bin)} + + +مشکل نسخه جاوای شما با این روش حل می‌شود و شما می‌توانید سرور بانک خود را به سادگی با همان دستور قبلی اجرا کنید. + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/1.png} +\end{center} + + +اما اگر سیستم عامل لینوکس دارید با توجه به توزیع مورد استفاده می‌توانید از گوگل بهره مند شوید:) (این \href{https://linuxize.com/post/install-java-on-ubuntu-18-04/}{\textcolor{blue}{\underline{{روش}}}} برای اوبونتو تست شده است.) + + +\end{itemize} + +\newpage + +\section*{{\titr نکات}} +\addcontentsline{toc}{section}{{\fehrestContent نکات}} + +\begin{itemize} +\item +پس از اجرای سرور، در صورت نبود مشکل، آی پی و پورتی که سرور روی آن اجرا شده است در کنسول چاپ می‌شود. (اگر سرور و کلاینت روی یک کامپیوتر اجرا می‌شوند، آی پی \lr{127.0.0.1} قابل استفاده خواهد بود.) + +\item +در صورت انتخاب مود دیباگ برای اجرای سرور، دستوری که هر کلاینت به سرور می‌فرستد چاپ می‌شود و همچنین هنگام قطع شدن ارتباط کلاینت از سرور تعداد کلاینت‌های آنلاین چاپ می‌شود. + +\item +همچنین در مود دیباگ، پس از وصل شدن هر کلاینت به سرور یک پیام از سرور به کلاینت به شکل زیر فرستاده می‌شود. این پیام نشان دهنده این است که کلاینت با موفقیت به سرور متصل شد (به هر کلاینت متصل به بانک یک آی دی نسبت داده می‌شود که در فرایند دیباگ کردن کاربرد خواهد داشت (طبق آن چه در بالا گفته شد)‌) + + +\begin{latin} + +\begin{lstlisting}{java} +hello "clientID" +\end{lstlisting} + +\end{latin} + + + +\item +ممکن است هنگام اجرای سرور خطاهای دیگری نظیر خطای مربوط به پورت و وصل شدن به کلاینت و … نیز چاپ شوند. + +\end{itemize} + +\section*{{\titr API}} +\addcontentsline{toc}{section}{{\fehrestContent API}} + +\lr{API} یا \lr{Application Programming Interface} در واقع همان واسطی (\lr{interface‌}) است که به وسیله ی آن با سرور بانک ارتباط برقرار می‌کنید. در اینجا استفاده از \lr{API} به وسیله ارسال یک رشته صورت می‌گیرد و شما می‌توانید با فرمتی که در ادامه داک توضیح داده می‌شود از آن استفاده و نیاز‌های مالی فروشگاه خود را برطرف کنید. همچنین یک کد آماده در کنار فایل \lr{jar} قرار داده شده است تا شما به صورت عملی نیز با استفاده از \lr{API} بانک داده شده آشنا شوید.(‌پیشنهاد می‌شود از متدهای \href{https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#writeUTF(java.lang.String)}{\textcolor{blue}{\underline{\lr{writeUTF}}}} + و + \href{https://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html#readUTF()}{\textcolor{blue}{\underline{\lr{readUTF}}}} + برای ارسال و دریافت دستورات استفاده کنید) + + +\section*{{\titr ساخت اکانت}} +\addcontentsline{toc}{section}{{\fehrestContent ساخت اکانت}} + + +\begin{latin} + +\begin{lstlisting}{java} +create_account "firstname" "lastname" "username" "password" + "repeat_pasword" +\end{lstlisting} + +\end{latin} + + +\begin{itemize} +\item +این متد برای ساختن حساب بانکی است. + +\item +\textcolor{CustomColor}{ورودی} + اول و دوم اسم کاربر هستند. + +\item +\textcolor{CustomColor}{ورودی} سوم نام کاربری برای حساب است. + +\item +\textcolor{CustomColor}{ورودی} چهارم پسورد اکانت است. + +\item +\textcolor{CustomColor}{ورودی} آخر تکرار پسورد است. + +\item +\textcolor{CustomColor}{خروجی} این متد یک عدد به عنوان شماره حساب است. + +\item +\textcolor{CustomColor}{یک مثال} + +\begin{latin} + +\begin{lstlisting}{java} +create_account Bob Bobian ImBob bobword bobword +\end{lstlisting} + +\end{latin} + +\item +\textcolor{CustomColor}{خطاها}: + +\begin{itemize} + +\item +\lr{"passwords do not match"} = پسورد و تکرار آن هم خوانی ندارند. + +\item +\lr{"username is not available"} = این نام کاربری قبلا استفاده شده است. + +\end{itemize} + + +\end{itemize} + +\section*{{\titr دریافت توکن}} +\addcontentsline{toc}{section}{{\fehrestContent دریافت توکن}} + + +\begin{latin} + +\begin{lstlisting}{java} +get_token "username" "password" +\end{lstlisting} + +\end{latin} + +\begin{itemize} +\item +این متد برای دریافت توکن از سرور استفاده می‌شود. توکن دریافتی تا ۱ ساعت اعتبار دارد و پس از آن منقضی می‌شود، در نتیجه نیاز است که دوباره این متد صدا زده شود تا توکن تازه دریافت گردد. +\item +\textcolor{CustomColor}{ورودی} اول نام کاربری حساب بانکی است. + +\item +\textcolor{CustomColor}{ورودی} دوم پسورد حساب بانکی است. + +\item +\textcolor{CustomColor}{خروجی} این متد توکن است که بصورت یک رشته داده می‌شود. + +\item +\textcolor{CustomColor}{خطاها}: + +\begin{itemize} + +\item +\lr{"invalid username or password"} + +\end{itemize} + + +\end{itemize} + +\section*{{\titr ایجاد فیش بانکی}} +\addcontentsline{toc}{section}{{\fehrestContent ایجاد فیش بانکی}} + +\begin{latin} + +\begin{lstlisting}{java} +create_receipt "token" "receipt_type" "money" "sourceID" "destID" + "description" + +\end{lstlisting} + +\end{latin} + +\begin{itemize} + + + + +\item +این متد برای ساختن فیش بانکی است. برای هر عملیات بانکی ابتدا یک فیش باید ساخته شود، سپس آن فیش را باید پرداخت کرد (عملیات آن را انجام داد). + +\item +\textcolor{CustomColor}{ورودی} اول آن (یک فاصله بعد از \lr{create\_receipt}‌) ، توکن دریافتی از سرور است. + +\item +\textcolor{CustomColor}{ورودی} دوم آن یکی از رشته‌های زیر است: + +\begin{itemize} + +\item +\lr{"deposit"} = واریز پول به حساب +\item +\lr{"withdraw"} = برداشت پول از حساب +\item +\lr{"move"} = انتقال وجه + +\end{itemize} + +\item +\textcolor{CustomColor}{ورودی} سوم یک عدد است که مبلغ را تعیین می‌کند. + +\item +\textcolor{CustomColor}{ورودی} چهارم شماره حساب مبدا است. +\begin{itemize} +\item +برای عملیات \lr{"deposit"} این عدد 1- وارد شود. +\end{itemize} + + +\item +\textcolor{CustomColor}{ورودی} پنجم شماره حساب مقصد است. +\begin{itemize} +\item +برای عملیات \lr{"withdraw"} این عدد 1- وارد شود. +\end{itemize} +\item +\textcolor{CustomColor}{ورودی} آخر که اختیاری است، توضیحی در مورد تراکنش است. + +\item +\textcolor{CustomColor}{خروجی} خروجی این متد یک عدد است که بیانگر ID فیش تولید شده است. +\newpage +\item +\textcolor{CustomColor}{خطاها}: +\begin{itemize} +\item +\lr{"invalid receipt type"} = ورودی دوم نامعتبر است. +\item +\lr{"invalid money"} = عدد وارد شده برای پول صحیح نیست. (‌عدد مثبت و صحیح باید باشد) +\item +\lr{"invalid parameters passed"} = ورودی‌های داده شده از فرمت بالا پیروی نمی‌کنند. +\item +\lr{"token is invalid"} = توکن نامعتبر است. (اگر مثلا اقدام به ساخت فیش برداشت از حسابی غیر از حساب مربوط به این توکن کنید نیز این خطا داده می‌شود و بطور مشابه برای انتقال وجه) +\item +\lr{"token expired"} = توکن داده شده منقضی شده است. +\item +\lr{"source account id is invalid"} +\item +\lr{"dest account id is invalid"} +\item +\lr{"equal source and dest account"} +\item +\lr{"invalid account id"} = به جای شماره حساب معتبر، ۱- وارد شده است. +\item +\lr{"your input contains invalid characters"} = بخش توضیحات، دارای یکی از کاراکترهای خاص است (مثلا *). + +\end{itemize} + +\end{itemize} + + +\section*{{\titr دریافت گزارش تراکنش‌ها}} +\addcontentsline{toc}{section}{{\fehrestContent دریافت گزارش تراکنش‌ها}} + +\begin{latin} + +\begin{lstlisting}{java} +get_transactions "token" "type" + +\end{lstlisting} + +\end{latin} + +\begin{itemize} + +\item +این متد برای دریافت تاریخچه‌ی تراکنش‌ها است. +\item +\textcolor{CustomColor}{ورودی} اول توکن دریافتی از سرور است. +\item +\textcolor{CustomColor}{ورودی} دوم نوع تاریخچه را مشخص می‌کند: + +\begin{itemize} +\item +\lr{"+"} برای دریافت تاریخچه تراکنش‌هایی که مقصد آنها حساب شما (حساب مربوط به این توکن) است. +\item +\lr{"-"} برای دریافت تاریخچه‌ی تراکنش‌هایی که مبدا آن‌ها حساب شما است. +\item +\lr{"*"} برای دریافت تاریخچه‌ی همه‌ی تراکنش‌های مربوط به حساب شما. +\item +این ورودی همچنین می‌تواند یک عدد، بیانگر ID فیش باشد که در آن صورت آن فیش خروجی داده می‌شود. +\end{itemize} + +\item +\textcolor{CustomColor}{خروجی} این تابع آرایه‌ای از فیش‌های سریالایز شده (json) خواهد بود که با "\lr{*}" از هم جدا شده‌اند. مثلا: + + + + +\begin{latin} + +\begin{lstlisting}[language = json , numbers = none] +{"receiptType":"deposit", +"money":20, +"sourceAccountID":-1, +"destAccountID":10001, +"description":"", +"id":0, +"paid":1}*{"receiptType":"deposit", +"money":2000, +"sourceAccountID":-1, +"destAccountID":10001, +"description":"", +"id":0, +"paid":1} +\end{lstlisting} + +\end{latin} + +\begin{itemize}[label = $\star$] + +\item +به فیلدهای یک فیش دقت کنید. + +\end{itemize} + +\item +\textcolor{CustomColor}{خطاها} +\begin{itemize} +\item +\lr{"token is invalid"} + +\item +\lr{"token expired"} + +\item +\lr{"invalid receipt id"} = اگر این فیش وجود نداشته باشد یا مربوط به این حساب نباشد. + + +\end{itemize} + +\end{itemize} + + + +\section*{{\titr انجام تراکنش}} +\addcontentsline{toc}{section}{{\fehrestContent انجام تراکنش}} + +\begin{latin} + +\begin{lstlisting}{java} +pay "receiptID" + +\end{lstlisting} + +\end{latin} + +\begin{itemize} + +\item +این متد برای انجام عملیات یک فیش است (واریز ، برداشت یا انتقال وجه). + +\item +\textcolor{CustomColor}{ورودی} این متد ID فیش است. + +\item +\textcolor{CustomColor}{خروجی} این متد در صورت موفق بودن عملیات \lr{"done successfully"} است. +\item +\textcolor{CustomColor}{خطاها}: +\begin{itemize} +\item +\lr{"invalid receipt id"} +\item +\lr{"receipt is paid before"} = این فیش قبلا پرداخت شده است. + +\item +\lr{"source account does not have enough money"} +\item +\lr{"invalid account id"} = شماره حساب درج شده در فیش اشتباه است. + + +\end{itemize} + + + +\end{itemize} + + +\section*{{\titr دریافت موجودی حساب}} +\addcontentsline{toc}{section}{{\fehrestContent دریافت موجودی حساب}} + +\begin{latin} + +\begin{lstlisting}{java} +get_balance "token" + +\end{lstlisting} + +\end{latin} + +\begin{itemize} +\item +این متد برای گرفتن موجودی حساب است. +\item +\textcolor{CustomColor}{ورودی} آن توکن دریافتی از سرور است. +\item +\textcolor{CustomColor}{خروجی} آن موجودی حساب است. +\item +\textcolor{CustomColor}{خطاها}: +\begin{itemize} +\item +\lr{"token is invalid"} + +\item +\lr{"token expired"} + + +\end{itemize} + +\end{itemize} + + +\section*{{\titr قطع ارتباط با سرور}} +\addcontentsline{toc}{section}{{\fehrestContent قطع ارتباط با سرور}} + +\begin{latin} + +\begin{lstlisting}{java} +exit +\end{lstlisting} + +\end{latin} + +\begin{itemize} +\item +ارتباط کلاینت با سرور قطع می‌شود. +\end{itemize} + +\subsection*{{\titr خطاهای کلی}} + +\begin{itemize} + +\item +\lr{"invalid input"} = ورودی وارد شده صحیح نیست. + +\item +\lr{"database error"} = مشکلی در ارتباط با دیتابیس بانک وجود دارد. + + + +\end{itemize} + +\end{document} + + + + + + + diff --git a/phase_3/bank/images/1.png b/phase_3/bank/images/1.png new file mode 100644 index 0000000..828749c Binary files /dev/null and b/phase_3/bank/images/1.png differ diff --git a/phase_3/bank/sharif.png b/phase_3/bank/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/bank/sharif.png differ diff --git a/phase_3/bank/sharif1.png b/phase_3/bank/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/bank/sharif1.png differ diff --git a/phase_3/bank/tex.bib b/phase_3/bank/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/bank/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/computer network/IRNazanin.ttf b/phase_3/computer network/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/computer network/IRNazanin.ttf differ diff --git a/phase_3/computer network/IRNazaninBold.ttf b/phase_3/computer network/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/computer network/IRNazaninBold.ttf differ diff --git a/phase_3/computer network/IRNazaninIrani.ttf b/phase_3/computer network/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/computer network/IRNazaninIrani.ttf differ diff --git a/phase_3/computer network/LiberationSerif-Bold.ttf b/phase_3/computer network/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/computer network/LiberationSerif-Bold.ttf differ diff --git a/phase_3/computer network/LiberationSerif-BoldItalic.ttf b/phase_3/computer network/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/computer network/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/computer network/LiberationSerif-Italic.ttf b/phase_3/computer network/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/computer network/LiberationSerif-Italic.ttf differ diff --git a/phase_3/computer network/LiberationSerif-Regular.ttf b/phase_3/computer network/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/computer network/LiberationSerif-Regular.ttf differ diff --git a/phase_3/computer network/XB Zar bold.ttf b/phase_3/computer network/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/computer network/XB Zar bold.ttf differ diff --git a/phase_3/computer network/XB Zar.ttf b/phase_3/computer network/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/computer network/XB Zar.ttf differ diff --git a/phase_3/computer network/images/1.jpg b/phase_3/computer network/images/1.jpg new file mode 100644 index 0000000..320d175 Binary files /dev/null and b/phase_3/computer network/images/1.jpg differ diff --git a/phase_3/computer network/images/2.jpg b/phase_3/computer network/images/2.jpg new file mode 100644 index 0000000..8d585f6 Binary files /dev/null and b/phase_3/computer network/images/2.jpg differ diff --git a/phase_3/computer network/images/3.jpg b/phase_3/computer network/images/3.jpg new file mode 100644 index 0000000..016ce27 Binary files /dev/null and b/phase_3/computer network/images/3.jpg differ diff --git a/phase_3/computer network/images/4.png b/phase_3/computer network/images/4.png new file mode 100644 index 0000000..a27ed99 Binary files /dev/null and b/phase_3/computer network/images/4.png differ diff --git a/phase_3/computer network/images/5.png b/phase_3/computer network/images/5.png new file mode 100644 index 0000000..ceb623a Binary files /dev/null and b/phase_3/computer network/images/5.png differ diff --git a/phase_3/computer network/network.pdf b/phase_3/computer network/network.pdf new file mode 100644 index 0000000..5076b04 Binary files /dev/null and b/phase_3/computer network/network.pdf differ diff --git a/phase_3/computer network/network.tex b/phase_3/computer network/network.tex new file mode 100644 index 0000000..26d4d7b --- /dev/null +++ b/phase_3/computer network/network.tex @@ -0,0 +1,529 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} +\definecolor{CustomColor}{HTML}{cc0000} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{شبکه} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{علیرضا ضیایی، سجاد ریحانی، محسن دهقان کار}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو}} + + + \vspace{0.05cm} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{شبکه} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + +\tableofcontents + +\newpage + + \Large \textbf{\\\\ +} + +\section*{{\titr شبکه چیست؟}} +\addcontentsline{toc}{section}{{\fehrestContent شبکه چیست؟}} + +به مجموعه‌ای از کامپیوتر‌های متصل به هم و زیر ساخت‌های ارتباطی(مانند \lr{Switch}، \lr{Router}، \lr{Firewall} و …) آن‌ها یک شبکه گفته می‌شود. بزرگ‌ترین شبکه کامپیوتری در جهان همین اینترنت است. + + +\section*{{\titr لایه‌های شبکه}} +\addcontentsline{toc}{section}{{\fehrestContent لایه‌های شبکه}} + +شبکه‌های کامپیوتری (مثل اینترنت) پیچیدگی‌های زیادی دارند، به همین خاطر برای توصیف آن‌ها از لایه بندی شبکه استفاده می‌شود. به این صورت که شبکه و پروتکل‌های آن را به صورت یک سری لایه بررسی می‌کنند که هر لایه از سرویسی که لایه زیرینش فراهم می‌کند استفاده کرده و سرویسی را به لایه‌ی بالاتر خود ارائه می‌دهد. + +برای روشن شدن لایه‌های شبکه به این مثال توجه کنید. ما روزانه با سیستم‌های پیچیده‌ای سروکار داریم. فرض کنید فردی از شما می‌خواهد که برایش سیستم حمل و نقل هوایی را توصیف کنید. یکی از شیوه‌های توصیف این سیستم می‌تواند این گونه باشد که کارهایی را که یک فرد تا رفتن به مقصد باید انجام دهد را لیست کنیم. + + مثلا ابتدا بلیط تهیه می‌کنیم، چمدان‌هایمان چک می‌شوند، به گیت می‌رویم و نهایتا سوار هواپیما می شویم. سپس هواپیما پرواز می‌کند و مسیرش را تا مقصد می‌پیماید. بعد از فرود آمدن هواپیما، به گیت می‌رویم، چمدان‌هایمان را می‌گیریم. این سناریو در تصویر زیر خلاصه می‌شود. + +\begin{center} +\includegraphics[width=0.5\textwidth]{images/1.jpg} +\end{center} + +اتفاقی که در شبکه می‌افتد این است که تعدادی بسته اطلاعات (\lr{data packets}) قرار است از کامپیوتر مبدا به مقصد بروند. همان طور که مشهود است، این کار شباهت‌هایی با سفر با هواپیما دارد. + + +آنچه در توصیف هواپیما گفتیم را به‌خاطر بیاورید، با توجه به شکل زیر این فرایند را بگونه‌ای دیگر نمایش می‌دهیم. دقت کنید که: + + +\begin{itemize} +\item +برای سوار شدن هواپیما باید فرآیند خرید بلیط را انجام دهیم (\lr{ticketing function}) سپس از طرف دیگر هنگام پیاده شدن از هواپیما در مقصد نیز بلیط چک می‌شود (‌\lr{ticketing function}). +\item +قبل از سوار شدن در هواپیما (مبدا) ، چمدان‌هایمان را تحویل می‌دهیم (\lr{baggage function}) و از سوی دیگر در شهر مقصد چمدان‌هایمان را تحویل می‌گیریم (\lr{baggage function}) + +\item +... + +\begin{center} +\includegraphics[width=0.7\textwidth]{images/2.jpg} +\end{center} +\end{itemize} + +با توجه به این شکل، سفر با هواپیما ساختار خاصی پیدا می‌کند و ما می‌توانیم کارهای مختلفی را که انجام می‌دهیم (مثلا کارهای مربوط به تهیه و نشان دادن بلیط‌) به شکل افقی یا لایه‌ای توصیف کنیم. مثلا کارهای مربوط به بلیط یک لایه هستند و کارهای مربوط به \lr{baggage} یک لایه دیگر محسوب می‌شوند. + +اگر دقت کنید، هر لایه همراه با لایه‌های زیرین خود به نوعی یک عملکرد و سرویس را پیاده سازی می‌کند. مثلا لایه‌ی بلیط به همراه لایه‌های زیرین، کار انتقال مسافر از پیشخوان یک فرودگاه به پیشخوان فرودگاه دیگر را پیاده سازی کرده‌اند و لایه‌ی مربوط به بار (\lr{baggage})‌ کار انتقال چمدان‌های مسافران را پیاده سازی می‌کند (که به نوعی یک سرویس برای انتقال مسافران است و این سرویس تنها برای مسافرانی است که بلیط دارند). در لایه \lr{Airplane Routing‌} عملیات مسیریابی هواپیما پیاده سازی شده است. + +همان طور که دیدیم، به کمک ساختاری لایه‌ای توانستیم این سیستم پیچیده را (‌تاحد خوبی ساده‌تر) توصیف کنیم. در شبکه کامپیوتری نیز ارتباط بین راس‌های مختلف شبکه (\lr{node}) را با ساختاری لایه‌ای توصیف می‌کنیم. بطور کلی پروتکل‌های شبکه را می‌توان به ۵ لایه‌ی زیر تقسیم کرد: + + +\begin{center} +\includegraphics[width=0.25\textwidth]{images/3.jpg} +\end{center} + + +فرض کنید دو برنامه داریم که بر روی دو کامپیوتر جدا از طریق شبکه با هم در ارتباط هستند: + +\begin{enumerate} + +\item +\textbf{\lr{Application layer}}: این لایه در واقع \lr{API} یا واسطی است که به وسیله‌ی آن این دو برنامه حرف همدیگر را می‌فهمند. مثلا برنامه نویس قرارداد (\lr{protocol}) می‌کند که برنامه اول به برنامه دوم در ابتدا یک رشته \lr{"salam"} بفرستد. سپس برنامه دوم در جواب این رشته بتواند یکی از دو رشته‌ی \lr{"Aleik"‌} و یا \lr{"Bye"} را بفرستد و اگر برنامه دوم \lr{"Aleik"} را فرستاده بود برنامه اول ... + +مثلا \lr{HTTP‌} از پروتکل‌های لایه اپلیکیشن است که در وب بسیار کاربرد دارد. + + +\item +\textbf{\lr{Transport layer}}: این لایه پایین‌تر از لایه \lr{Application} قرار دارد (‌در واقع ارتباط بین این دو لایه از طریق سوکت (\lr{socket}) برقرار می‌شود که در مورد آن صحبت خواهد شد). همان طور که می‌دانیم، در کامپیوتر ما چندین برنامه در حال ارتباط با شبکه هستند. پس اگر برنامه اول (از کامپیوتر اول) پیامی را به سمت کامپیوتر دوم می‌فرستد، این کامپیوتر باید به نحوی بفهمد که این پیام برای کدام برنامه است. این عملیات در این لایه پیاده سازی شده است. در واقع به هر برنامه (\lr{process}) که منتظر دریافت پیام از شبکه است (\lr{listening})‌، یک عدد به اسم پورت نسبت داده می‌شود که با استفاده از آن برنامه مقصد بطور یکتا در کامپیوتر مشخص می‌شود .\lr{TCP} و \lr{UDP}، دو پروتکل این لایه محسوب می‌شوند. + + +\item +\textbf{\lr{Network Layer}}: حال فرض کنید برنامه اول پیامش (\lr{packet}) را فرستاد. این پیام چگونه باید به کامپیوتر مقصد برسد؟ فرایند مسیریابی (\lr{routing}) در شبکه توسط این لایه پیاده سازی شده است. در واقع هر میزبان (\lr{host})‌، یک آدرس یکتایی خواهد داشت به اسم \lr{IP address}. برای فرستادن یک بسته، برروی آن \lr{IP} مقصد برچسب می‌خورد و با سرویس‌هایی که این لایه فراهم می‌کند، این بسته به مقصد می‌رسد. + +\end{enumerate} + +\textbf{بیشتر بدانید:) } + + +در حال حاضر دو نسخه از \lr{IP} پیاده شده است که به \lr{IP} های رایج که به فرمت \lr{X.X.X.X} بوده و 32 بیتی هستند \lr{IPv4} گفته شده و به \lr{IP} هایی که به فرمت \lr{X:X:X:X:X:X:X:X} و 128 بیتی هستند \lr{IPv6} می‌گویند. + +\begin{itemize} + +\newpage +\item +رنج‌های \lr{IP}: + +\begin{itemize} +\item +\lr{IP} های محلی: این بازه از \lr{IP} ها فقط درون همان شبکه معتبر و یکتا است و عملا خارج از اسکوپ(\lr{scope}) آن شبکه اعتبار ندارد و دیگر یکتا نیست. + +\begin{enumerate} + +\item +\lr{10.0.0.0} تا \lr{10.255.255.255} + +\item +\lr{172.16.0.0} تا \lr{172.31.255.255} + +\item +\lr{192.168.0.0} تا \lr{192.168.255.255} + +\end{enumerate} + +\item + +\lr{IP} های عمومی: تمامی \lr{IP} ها به جز \lr{IP} محلی از این نوع هستند. + +\end{itemize} + +\item + این لایه و لایه‌های بعدی بطور کلی مسئولیت مسیریابی و یافتن مسیر بهینه (با توجه به سیاست‌های شبکه) برای رسیدن هر بسته به مقصد مورد نظر با استفاده از تجهیزات (مثل سوییچ ، روتر و ...‌)‌ و پروتکل‌هایی که در این لایه و دو لایه بعد وجود دارد (\lr{IP} در این لایه و به طور مثال \lr{Ethernet} در لایه بعدی و …) را بر عهده دارند که با توجه عدم نیاز به آشنایی با لایه‌های بعدی و پروتکل‌های آن در این پروژه، در مورد لایه‌های بعد صحبتی نمی‌کنیم. +\end{itemize} + +\newpage +\section*{{\titr معماری شبکه}} +\addcontentsline{toc}{section}{{\fehrestContent معماری شبکه}} + +معماری شبکه به طراحی فیزیکی و منطقی نرم افزار ، سخت افزار، پروتکل‌ها و رسانه انتقال داده‌ها می‌پردازد. به زبان ساده‌تر می‌توان گفت که چگونه کامپیوترها ساماندهی شده و با هم ارتباط گرفته و چگونه وظایف به رایانه اختصاص می‌یابد. + +معماری شبکه به دو نوع عمده + \href{https://en.wikipedia.org/wiki/Peer-to-peer}{\textcolor{blue}{\underline{\lr{Peer-To-Peer}}}} + و + \href{https://en.wikipedia.org/wiki/Client%E2%80%93server_model}{\textcolor{blue}{\underline{\lr{Client-Server}}}} + تقسیم می‌شود. + +شبکه Peer-To-Peer شبکه‌ای است که در آن کلیه رایانه‌ها با امتیاز و مسئولیت برابر برای پردازش داده‌ها بهم متصل می‌شوند. + +\begin{center} +\includegraphics[width=0.5\textwidth]{images/4.png} +\end{center} + + +\begin{center} +\includegraphics[width=0.5\textwidth]{images/5.png} +\end{center} + +\newpage +\section*{{\titr معماری Client-Server}} +\addcontentsline{toc}{section}{{\fehrestContent معماری Client-Server}} + +مدل \lr{Client-Server} که بسیاری از شبکه‌ها بر مبنای این مدل کار می‌کنند شامل یک برنامه در نقش سرور و چندین برنامه در نقش کلاینت است. منابع و اطلاعات همگی در سمت سرور نگه داشته می‌شوند و کلاینت‌ها بعد از اتصال به سرور با ارسال درخواست اطلاعات را از سرور می‌گیرند و یا اطلاعات جدید را به سرور می‌دهند. + + ارتباط کلاینت‌ها و سرور از طریق سوکت برقرار خواهد شد. سوکت بیانگر یک سر از یک ارتباط دوطرفه بین دو برنامه است. هر سوکت اطلاعات مربوط به آی پی و پورت ارتباط را نگه میدارد و دریچه ارسال و دریافت اطلاعات به آن سوی ارتباط نیز هست. + + اگر آدرس‌دهی یک شبکه را با فرایند آدرس‌دهی یک سیستم که بر پایه اداره پست کار می‌کند، مقایسه کنید، آن‌گاه متوجه خواهید شد که آدرس آی‌پی میزبان نقش آدرس یک ساختمان را داشته و درگاه (پورت) شبیه به شماره واحدی است که درون یک ساختمان قرار دارد و سوکت نیز مانند صندوق پست آن واحد است . یک سوکت شامل هر دو گروه آدرس آی‌پی میزبان و پورت \lr{TCP} یا \lr{UDP} مربوط به یک برنامه است که با یک علامت جداکننده این دو مقدار از یکدیگر جدا شده‌اند. (مثلا \lr{172.0.0.1:8000}) + +سوکت‌ها دو نوع مهم دارند: + +\begin{enumerate} + +\item +سوکت‌های استریم که از پروتکل \href{TCP}{\textcolor{blue}{\underline{\lr{TCP}}}} برای انتقال داده استفاده می‌کنند. + +\item +سوکت‌های دیتاگرام که از پروتکل \href{https://en.wikipedia.org/wiki/User_Datagram_Protocol}{\textcolor{blue}{\underline{\lr{UDP}}}} برای انتقال داده استفاده می‌کنند. + +\end{enumerate} + +پروتکل \lr{TCP (transmission control protocol)} يک پروتکل ارتباط محور (\lr{connection oriented}) است و عملکرد آن بدين صورت است که براي هر پکت ارسالي توسط کامپيوتر مبدا، بايد يک پکت از سرور مقصد، مبنی بر دريافت صحيح و بدون نقص پکت دريافت کند. اگر طی زمان مشخصی اين پيام توسط مبدا دريافت نگردد، فرايند ارسال پکت مجددا تکرار خواهد شد و کاربرد آن بيشتر در مواردي است که نياز به اطمينان از صحت انتقال اطلاعات داريم. (مثل ارتباط اپلیکیشن بانکی با سرور بانک) + + +پروتکل \lr{UDP (User Datagram Protocol)} يک پروتکل غیر ارتباط محور (\lr{connectionless}) است. بر خلاف \lr{TCP} در اين پروتکل هيچ گونه پيامي مبني بر دريافت پکت از سوي سرور ارسال نشده و بيشتر در مواردی مانند انتقال صوت يا ويدئو که پهناي باند در اين موارد از اهمیت بالایی برخوردار است بكار می‌رود زيرا در صورت استفاده از پروتکل \lr{TCP}، ترافيک هر پيام تایید به ازای دریافت پکت، خود باعث اشغال پهناي باند خواهد شد. + +\section*{{\titr شبکه در جاوا}} +\addcontentsline{toc}{section}{{\fehrestContent شبکه در جاوا}} + +کلاس \lr{Socket} و \lr{ServerSocket} که در کلاس و حل تمرین نحوه استفاده و پیاده‌سازی آن تدریس شده، از نوع \lr{TCP} هستند. برای آشنایی بیش‌تر می‌توانید به + \href{اینجا}{\textcolor{blue}{\underline{{اینجا}}}} و + برای هندل کردن همزمان چند کلاینت به + \href{https://medium.com/martinomburajr/java-create-your-own-hello-world-server-2ca33b6957e}{\textcolor{blue}{\underline{{اینجا}}}} + مراجعه کنید. + +همچنین برای آشنایی با پیاده سازی پروتکل \lr{HTTP} در جاوا می‌توانید به + \href{این لینک }{\textcolor{blue}{\underline{{این لینک }}}} + مراجعه کنید. + + +از آنجایی که در پروژه شما سرعت و حجم انتقال داده‌ها اهمیت چندانی ندارد نیازی به استفاده از سوکت udp ندارید اما برای آشنایی بیشتر با پیاده سازی این مدل می‌توانید به لینک های زیر مراجعه کنید. + +\begin{flushleft} +\href{https://www.baeldung.com/udp-in-java}{\textcolor{blue}{\underline{\lr{A Guide To UDP In Java}}}} +\end{flushleft} + +\begin{flushleft} +\href{TCP vs UDP - Difference and Comparison}{\textcolor{blue}{\underline{\lr{TCP vs UDP - Difference and Comparison}}}} +\end{flushleft} + + +به طور خلاصه ارتباط بین سرور و کلاینت (مدل \lr{TCP}) به طریق زیر صورت می‌گیرد: + +\begin{enumerate} + +\item +سرور یک سوکت بر روی پورت مثلا \lr{6666} می‌سازد و به آن گوش می‌کند: + +\begin{latin} + +\begin{lstlisting}{java} +//Server side +ServerSocket ss=new ServerSocket(6666); + +\end{lstlisting} + +\end{latin} + +\item +کلاینت نیز یک سوکت می‌سازد و روی همان پورت درخواست اتصال می‌دهد: + +\begin{latin} + +\begin{lstlisting}{java} +//Server side +//Client side +Socket s=new Socket("localhost",6666) ; +//localhost == 127.0.0.1 + + +\end{lstlisting} + +\end{latin} + +\item +سرور با دریافت درخواست اتصال آن‌ را تایید می‌کند و دو طرف به هم وصل می‌شوند: + + +\begin{latin} + +\begin{lstlisting}{java} +//Server side +Socket s=ss.accept(); + +\end{lstlisting} + +\end{latin} + +\item +دو طرف از طریق سوکت سمت خودشان شروع به تبادل داده می‌کنند: + + +\begin{latin} + +\begin{lstlisting}{java} +//Client side +DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF("Hello Server"); +\end{lstlisting} + +\end{latin} + +\begin{latin} + +\begin{lstlisting}{java} +//Server side +DataInputStream dis=new DataInputStream(s.getInputStream()); +String str=(String)dis.readUTF(); + +\end{lstlisting} + +\end{latin} + + + +\end{enumerate} + +دقت کنید که پورتی که سرور می‌خواهد استفاده کند نباید در اختیار(bind) برنامه دیگری باشد، برای فهمیدن اینکه چه پورت‌هایی توسط سیستم یا برنامه های دیگر در حال استفاده هستند می‌توانید به این لینک ها مراجعه کنید: +\href{https://www.howtogeek.com/howto/28609/how-can-i-tell-what-is-listening-on-a-tcpip-port-in-windows/}{\textcolor{blue}{\underline{{ ویندوز}}}} + ، + \href{https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/}{\textcolor{blue}{\underline{{لینوکس}}}} + + +\section*{{\titr معماری Peer-To-Peer}} +\addcontentsline{toc}{section}{{\fehrestContent معماری Peer-To-Peer}} + +برای مطالعه در مورد این معماری که از موارد امتیازی این فاز است، به \textcolor{CustomColor}{داک \lr{P2P}} مراجعه کنید. + + +\section*{{\titr Token Authentication }} +\addcontentsline{toc}{section}{{\fehrestContent Token Authentication }} + +\lr{Token} یک کلید برای ارتباط بین کلاینت و سرور است. برای هر کاربر پس از احراز هویت توسط نام کاربری و رمز عبور یا هر روش دیگر، یک \lr{Token} از سمت سرور مشخص می‌شود که از آن به بعد، پیام‌های ارسالی توسط کاربر به وسیله ی آن \lr{Token} در سرور شناسایی می‌شوند. این \lr{Token} ها می‌توانند محدودیت زمانی استفاده داشته باشند و برای رعایت امنیت باید پس از هر بار ورود دوباره‌ی کاربر \lr{Token} جدیدی به او اختصاص داده شود. + +پیاده سازی توکن در ارتباط بین کلاینت و سرور فروشگاه از موارد امتیازی این فاز است. + +برای مطالعه بیشتر در مورد توکن به این لینک مراجعه کنید: + + +\begin{center} +\href{https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication}{\textcolor{blue}{\underline{\lr{The Ins and Outs of Token Based Authentication}}}} + +\end{center} + +\end{document} + + + + + + + diff --git a/phase_3/computer network/sharif.png b/phase_3/computer network/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/computer network/sharif.png differ diff --git a/phase_3/computer network/sharif1.png b/phase_3/computer network/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/computer network/sharif1.png differ diff --git a/phase_3/computer network/tex.bib b/phase_3/computer network/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/computer network/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/database/IRNazanin.ttf b/phase_3/database/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/database/IRNazanin.ttf differ diff --git a/phase_3/database/IRNazaninBold.ttf b/phase_3/database/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/database/IRNazaninBold.ttf differ diff --git a/phase_3/database/IRNazaninIrani.ttf b/phase_3/database/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/database/IRNazaninIrani.ttf differ diff --git a/phase_3/database/LiberationSerif-Bold.ttf b/phase_3/database/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/database/LiberationSerif-Bold.ttf differ diff --git a/phase_3/database/LiberationSerif-BoldItalic.ttf b/phase_3/database/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/database/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/database/LiberationSerif-Italic.ttf b/phase_3/database/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/database/LiberationSerif-Italic.ttf differ diff --git a/phase_3/database/LiberationSerif-Regular.ttf b/phase_3/database/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/database/LiberationSerif-Regular.ttf differ diff --git a/phase_3/database/XB Zar bold.ttf b/phase_3/database/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/database/XB Zar bold.ttf differ diff --git a/phase_3/database/XB Zar.ttf b/phase_3/database/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/database/XB Zar.ttf differ diff --git a/phase_3/database/database.pdf b/phase_3/database/database.pdf new file mode 100644 index 0000000..bc3ab61 Binary files /dev/null and b/phase_3/database/database.pdf differ diff --git a/phase_3/database/database.tex b/phase_3/database/database.tex new file mode 100644 index 0000000..8c3f4e3 --- /dev/null +++ b/phase_3/database/database.tex @@ -0,0 +1,307 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +\usepackage[a4paper, total={6in, 8in}, top = 3cm,bottom = 4cm]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{پایگاه داده} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{حمیدرضا کلباسی}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو}} + + + \vspace{0.05cm} + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{پایگاه داده} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + \Large \textbf{\\ +} + + + + +\section*{{\titr پایگاه داده چیست؟}} +\addcontentsline{toc}{section}{{\fehrestContent پایگاه داده چیست؟}} + +پایگاه داده (\lr{database}) مجموعه‌ای از داده‌ها است که به صورت منظم با ساختار خاصی درون کامپیوتر نگهداری شده است. پایگاه‌های داده معمولاً توسط سامانه‌های مدیریت پایگاه داده (\lr{DBMS} ها) کنترل می‌شوند. شما می‌توانید پایگاه داده خود را درون یک فایل به صورت ساده نگهداری کنید اما مهندسان بسیاری روی \lr{D‌BMS} ها کار کرده‌اند و با توجه به شرایط کامپیوتر‌های موجود \lr{DBMS} هایی را توسعه داده‌اند که عملیات‌های معمول مانند جستجو، دریافت داده‌هایی با شرایط خاص و تغییر در پایگاه داده را با سرعت بالا و راحتی انجام دهند. در ادامه با برخی از انواع \lr{DBMS} ها و نحوه استفاده از آن‌ها آشنا می‌شویم. + + + +\section*{{\titr DBMS های رابطه‌ای (RDBMS)}} +\addcontentsline{toc}{section}{{\fehrestContent DBMS های رابطه‌ای (RDBMS)}} + + +این خانواده از \lr{DBMS} ها بسیار وسیع و در عین حال پر کاربرد هستند. \lr{RDBMS} ها از زبان درخواست ساخت یافته (\lr{SQL}) استفاده می‌کنند. این زبان به شما کمک می‌کند تا درخواست خود را در تعداد پرسش‌های کمی مطرح کنید و \lr{RDBMS} آن‌ها را به صورت فوق بهینه شده اجرا کند. هر میزان که پرسش‌های کمتری داشته باشید امید بیشتری برای دریافت سریع‌تر پاسخ دارید. برای مثال اگر می‌خواهید تعداد رکورد‌هایی که فیلد سن آن‌ها از ۳۰ بزرگ‌تر است را به دست بیاورید باید (سریع‌تر و راحت‌تر است که) از دستورات \lr{SQL} استفاده کنید تا اینکه کل جدول را فراخوانی کنید و به وسیله برنامه‌تان پاسخ را بدست آورید. + +\lr{RDBMS} های معروف فراوانی وجود دارند و شما بسته به نیازتان از یکی از آن‌ها استفاده می‌کنید. از آن‌ها می‌توان به \lr{MySQL}, \lr{PostgreSQL}, \lr{SQLite} و … اشاره کرد. + + +در ادامه ما از \lr{SQLite} استفاده می‌کنیم. این \lr{DBMS} پایگاه داده را درون یک فایل ذخیره می‌کند. مزیتش این است که نیاز به نصب و اجرا شدن یک سرویس در کنار برنامه ندارد و برنامه به خودی خود می‌تواند از پایگاه داده استفاده کند. این \lr{DBMS} برای استفاده‌های معمول (تا یک میلیون درخواست در روز) مناسب است و برای استفاده‌های بزرگ‌تر باید از \lr{DBMS} های دیگر استفاده کرد. +\newpage +ابتدا نرم‌افزار زیر را نصب کنید: + +\begin{flushleft} +\href{https://sqlitebrowser.org/dl/}{\textcolor{blue}{\underline{\lr{https://sqlitebrowser.org/dl/}}}} + +\end{flushleft} + + +این نرم‌افزار اجباری نیست، اما به شما کمک می‌کند تا بتوانید جداول پایگاه داده‌تان را به صورت زیبا ببینید و درخواست‌هایی با زبان SQL انجام دهید. + +سپس پایگاه داده نمونه \lr{northwind} را بارگیری کنید: + +\begin{flushleft} +\href{https://github.com/jpwhite3/northwind-SQLite3/blob/master/Northwind_small.sqlite}{\textcolor{blue}{\underline{\lr{Northwind SQLite Database}}}} + +\end{flushleft} + +و آن را به کمک نرم‌افزار بالا باز کنید و جداول آن را ببینید. + +سپس از سایت زیر با \lr{SQL} آشنا شوید: +\begin{flushleft} +\href{https://www.w3schools.com/sql/sql_select.asp}{\textcolor{blue}{\underline{\lr{https://www.w3schools.com/sql/sql\_select.asp}}}} + +\end{flushleft} + +پایگاه داده‌ای که این آموزش از آن استفاده می‌کند، همان پایگاه داده بالاست، با این تفاوت که نام جداول و ستون‌ها تفاوت‌های کوچکی دارد. به همین دلیل اگر دستورات را کپی پیست کنید کار نمی‌کند و باید آن‌ها را خودتان بنویسید. سعی کنید که تا بخش \lr{Group By} را فرا بگیرید. + +سپس از این لینک یاد بگیرید که چگونه می‌توان از طریق جاوا به پایگاه داده درخواست داد: + +\begin{flushleft} +\href{https://en.wikipedia.org/wiki/Apache_Maven}{\textcolor{blue}{\underline{\lr{https://www.tutorialspoint.com/sqlite/sqlite\_java.htm}}}} + +\end{flushleft} + +توجه کنید که کتاب‌خانه معرفی شده در این آموزش تنها مخصوص SQLite نیست و طیف وسیعی از RDBMS ها را پشتیبانی می‌کند. + + + + +\section*{{\titr RDBMS های NOSQL}} +\addcontentsline{toc}{section}{{\fehrestContent RDBMS های NOSQL}} + +با پیشرفت تکنولوژی و در نتیجه نیاز های بشر، دیگر \lr{RDBMS} ها پاسخگوی همه‌ی نیازها نبودند. در نتیجه \lr{DBMS} های \lr{NOSQL} ساخته شد. این‌ها از زبان \lr{SQL} پشتیبانی نمی‌کنند و در عوض قابلیت‌های دیگری مانند نگهداری پایگاه داده در چند سرور مجزا، جستجو در گراف و … را دارند. در اینجا به این نوع از \lr{DBMS} ها نمی‌پردازیم (بپردازیم؟) اما برای آشنایی می‌توانید لینک زیر را مطالعه کنید: + +\begin{flushleft} +\href{https://www.mongodb.com/nosql-explained}{\textcolor{blue}{\underline{\lr{https://www.mongodb.com/nosql-explained}}}} + +\end{flushleft} + + +\end{document} + + + + + + + + + diff --git a/phase_3/database/sharif.png b/phase_3/database/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/database/sharif.png differ diff --git a/phase_3/database/sharif1.png b/phase_3/database/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/database/sharif1.png differ diff --git a/phase_3/database/tex.bib b/phase_3/database/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/database/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/main/IRNazanin.ttf b/phase_3/main/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/main/IRNazanin.ttf differ diff --git a/phase_3/main/IRNazaninBold.ttf b/phase_3/main/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/main/IRNazaninBold.ttf differ diff --git a/phase_3/main/IRNazaninIrani.ttf b/phase_3/main/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/main/IRNazaninIrani.ttf differ diff --git a/phase_3/main/LiberationSerif-Bold.ttf b/phase_3/main/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/main/LiberationSerif-Bold.ttf differ diff --git a/phase_3/main/LiberationSerif-BoldItalic.ttf b/phase_3/main/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/main/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/main/LiberationSerif-Italic.ttf b/phase_3/main/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/main/LiberationSerif-Italic.ttf differ diff --git a/phase_3/main/LiberationSerif-Regular.ttf b/phase_3/main/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/main/LiberationSerif-Regular.ttf differ diff --git a/phase_3/main/PHASE3.pdf b/phase_3/main/PHASE3.pdf new file mode 100644 index 0000000..192e051 Binary files /dev/null and b/phase_3/main/PHASE3.pdf differ diff --git a/phase_3/main/PHASE3.tex b/phase_3/main/PHASE3.tex new file mode 100644 index 0000000..229574d --- /dev/null +++ b/phase_3/main/PHASE3.tex @@ -0,0 +1,508 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{hyperref} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\definecolor{CustomColor}{HTML}{A61C00} + + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{ فاز سوم پروژه} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.20cm} + + مهلت ارسال:\\ + \textbf{{31 تیر - }} + \textbf{{ساعت 23:59:59}} + + \vspace{0.10cm} +مسئول پروژه:\\ + \textbf{\authorFont{احمد سلیمی}} + + \vspace{0.10cm} +مسئولین فاز سوم:\\ + \textbf{\authorFont{محسن دهقان کار و صابر ظفرپور}} + + \vspace{0.10cm} +طراحان فاز سوم:\\ + \textbf{\authorFont{ سپهر پورقناد، علیرضا شاطری، سجاد ریحانی، علیرضا ضیائی و حمیدرضا کلباسی }} + + \vspace{0.05cm} +مسئول تنظیم داک:\\ + \textbf{\authorFont{امیرمهدی نامجو}} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{فاز سوم} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + +\tableofcontents + +\newpage + + \Large \textbf{\\\\ +} + + +\section*{{\titr نکات قابل توجه}} +\addcontentsline{toc}{section}{{\fehrestContent نکات قابل توجه}} +\begin{itemize} +\item +پس از اتمام این فاز، در گیت خود یک تگ با عنوان \lr{"phase\_3"} بزنید. در روز تحویل حضوری این tag بررسی خواهد شد و کدهای پس از آن نمره‌ای نخواهد گرفت. + +\item +در روز تحویل حضوری مشارکت تمام اعضای تیم در پروژه بررسی خواهد‌ شد و در صورت عدم مشارکت بعضی از اعضا، نمرهٔ ایشان برای آن فاز پروژه "صفر" لحاظ می‌گردد. مشارکت، با توجه به commit های افراد تیم در مخزن گیت‌هاب پروژه بررسی می‌شود. + +\item +ددلاین فاز سوم در آخرین زمان ممکن قبل از تحویل نمرات و تحویل فاز سوم قرار داده شده است. لذا همانطور که قبلا هم اطلاع‌رسانی شده بود، در این فاز مهلت تاخیر وجود ندارد. + +\item +در صورت کشف تقلب از هریک از تیم‌ها، برای بار اول منفی نمرهٔ آن فاز برای آن تیم ثبت می‌شود و برای بار دوم، نمرهٔ منفی کل پروژه برای تیم لحاظ خواهد‌ شد که معادل مردود شدن در درس است. +\end{itemize} + +\newpage + +\section*{{\titr مقدمه}} +\addcontentsline{toc}{section}{{\fehrestContent مقدمه}} +امیدواریم تا به این جا از پروژه لذت برده باشید. بالاخره به جذاب‌ترین بخش پروژه یعنی فاز شبکه رسیدیم. در این فاز هدف این است که پروژه شما ساختاری عملی‌تر و واقعی‌تر پیدا کند. + +در این فاز شما: + +\begin{itemize} + + +\item + با مفاهیم شبکه آشنا می‌شوید و فروشگاه خود را با معماری کلاینت-سرور پیاده سازی می‌کنید. + + \item + +به فروشگاه خود یک سری ویژگی‌ها اضافه می‌کنید. (از جمله بانک، مزایده و … ) + +\item +با یک سری مفاهیم (پیشرفته‌تر)‌ در برنامه نویسی آشنا می‌شوید. ( از جمله پایگاه‌داده، توکن، مفاهیم مربوط به امنیت، معماری \lr{P2P} و …) + + +\end{itemize} +\newpage +\section*{{\titr بخش‌های اصلی }} +\addcontentsline{toc}{section}{{\fehrestContent بخش‌های اصلی}} + +\subsection*{{\titr شبکه چیست؟}} +\addcontentsline{toc}{subsection}{{\fehrestContent شبکه چیست؟}} + +قبل از هر چیز نیاز داریم که نسبت به شبکه و مفاهیم آن شهود بدست بیاوریم. سپس با استفاده از این شهود ، ابزار‌ها و کتاب‌خانه‌های جاوا، بر بستر شبکه کد بزنیم. ( البته با توجه به تمرین شبکه، تا حدی با این مفاهیم کار کرده‌اید.) + + +برای آشنایی با شبکه و کد زدن، \textcolor{CustomColor}{داک شبکه} را مطالعه کنید. + + +در این فاز شما باید فروشگاه خود را به دو بخش کلاینت و سرور تقسیم کنید. سرور شما ابتدا اجرا می‌شود و یک تا چند کلاینت به آن متصل شده و با آن ارتباط برقرار می‌کنند ( کلاینت و سرور تنها از طریق شبکه با هم در ارتباط خواهند بود). با توجه به تعریف ها و مفاهیمی که از این معماری در داک بالا گفته شد، باید بتوانید کلاس‌های مربوط سرور و کلاینت را تفکیک کنید. + + + +\subsection*{{\titr بانک}} +\addcontentsline{toc}{subsection}{{\fehrestContent بانک}} + +در این فاز به پروژه شما یک بانک افزوده می‌شود. این بانک به صورت یک سرور جدا ( از سرور و کلاینت فروشگاه‌) اجرا می‌شود. در داک زیر شیوه دقیق ارتباط با بانک ، واسط‌های کاربری ( API )‌ و امکاناتی که در اختیار شما قرار می‌دهد گفته شده است. فایل اجرایی سرور این بانک بطور آماده به شما داده می‌شود(برای استخراج کد از این فایل تلاش نکنید)، اما پیاده سازی آن امتیازی است و امتیاز قابل توجهی نیز دارد. در صورتی که می‌خواهید بانک را خودتان پیاده سازی کنید، باید واسط‌های کاربریتان (API)‌ مطابق داک زیر باشد. + +فایل اجرایی سرور بانکِ آماده ( به همراه یک نمونه کلاینت) در اختیار شما قرار می‌گیرد. + +نحوه استفاده از بانک و API آن را می‌توانید در \textcolor{CustomColor}{داک بانک} مشاهده کنید. + +\newpage +\subsection*{{\titr کیف پول}} +\addcontentsline{toc}{subsection}{{\fehrestContent کیف پول}} +در این فاز به \textcolor{CustomColor}{فروشگاه} شما، کیف پول اضافه می‌شود. به این شکل که برای هر حساب( فروشنده یا خریدار) یک کیف پول تعریف می‌شود که کاربر می‌تواند با استفاده از حساب بانکی خود(که به صورت جداگانه در بانک قرار دارد) آن را شارژ و یا از کیف پول خود مبلغی را برداشت کند. توجه کنید که خریدار برای خرید کردن باید حق انتخاب داشته باشد که مستقیما از حساب بانکی خود یا کیف پول خود خرید کند (مدیران فروشگاه حسابی مشترک در بانک تحت عنوان حساب فروشگاه دارند که تمامی اعتبار کیف پول‌های کاربران به درون آن ریخته می‌شود). + + +\begin{enumerate} + +\item +خرید مستقیم با استفاده از حساب بانکی: در صورت انتخاب این گزینه، مبلغ پرداختی از حساب کاربر (در بانک) به حساب فروشگاه (در بانک) انتقال می‌یابد (با استفاده از API بانک این کار انجام گیرد) و سپس کیف پول فروشنده با کسر کارمزد، شارژ‌ می‌شود. + +\begin{itemize}[label=$\blacksquare$] +\item +مدیر باید بتواند کارمزد را تعیین کند. (مثلا 5 درصد) +\end{itemize} + + +\item +خرید با استفاده از اعتبار کیف پول:‌ در صورت انتخاب این گزینه، کل مبلغ از کیف پول خریدار کم شده و با کسر کارمزد، کیف پول فروشنده شارژ می‌شود. + +\begin{itemize}[label=$\blacksquare$] +\item +مثلا اگر کارمزد ۵ درصد باشد، اگر خریدار کالایی با قیمت ۱۰۰ واحد بخرد، از کیف پولش ۱۰۰ واحد کم شده و به کیف پول فروشنده ۹۵ واحد اضافه می‌شود. +\end{itemize} + +\end{enumerate} + + +هر فروشنده و خریدار باید بتواند بعد از login کردن عملیات زیر را با کیف پول خود انجام دهد: + +\begin{enumerate} + + +\item +شارژ کیف پول + +\item +برداشت از کیف پول + +\begin{itemize}[label=$\blacksquare$] +\item +فقط فروشنده می‌تواند این کار را انجام دهد. + +\item +همواره باید در کیف پول مقدار حداقلی باقی بماند که مدیر فروشگاه تعیین می‌کند. + +\end{itemize} + +\end{enumerate} + + +\subsection*{{\titr پشتیبانی}} +\addcontentsline{toc}{subsection}{{\fehrestContent پشتیبانی}} + +در فروشگاه باید نقشی تحت عنوان پشتیبان داشته باشیم. ساخت اکانت پشتیبان همانند اکانت \textcolor{CustomColor}{مدیر} باید توسط مدیر انجام گیرد. سپس این افراد به حساب کاربری خود ورود می‌کنند (‌login). هر خریدار می‌تواند از بین پشتیبان‌هایی که آنلاین هستند، یک نفر را انتخاب کرده و با او صحبت کند. پیاده سازی چت همزمان یک پشتیبان با چند خریدار، از موارد امتیازی است. + +\subsection*{{\titr مزایده}} +\addcontentsline{toc}{subsection}{{\fehrestContent مزایده}} + +یک فروشنده می‌تواند یکی از محصولاتش را برای مزایده بگذارد و زمانی را برای این مزایده تعیین کند که پس از آن، مزایده خاتمه یابد. + +\begin{enumerate} + +\item +باید لیستی از مزایده‌ها برای خریداران وجود داشته باشد. + +\item +خریدار با انتخاب یکی از مزایده‌ها وارد آن می شود و در ابتدا مبلغی را پیشنهاد می‌دهد که کمتر از شارژ کیف پولش است. + +\item +خرید در مزایده تنها با کیف پول انجام می‌شود. (روال انتقال پول مثل خرید عادی است.) + +\item +همه‌ی افراد شرکت کننده در مزایده، باید بتوانند با هم صحبت کنند. (چت چندنفره) + +\item +خریدار تنها می‌تواند مبلغ پیشنهادی خود را افزایش دهد. + + +\end{enumerate} + + +\subsection*{{\titr خرید و فروش فایل}} +\addcontentsline{toc}{subsection}{{\fehrestContent خرید و فروش فایل}} + +محصولی که فروشنده‌ها برای فروش می‌گذارند می‌تواند یک فایل باشد. در این صورت همانند محصولات عادی فروشنده آن را برای فروش می‌گذارد و آن را به سرور آپلود می‌کند، خریدار پس از خرید، آن را از سرور فروشگاه دانلود می‌کند. + + + +در صورت پیاده سازی قسمت امتیازی P2P فرآیند انتقال فایل متفاوت است که در \hyperref[subsec:p2p]{{\textcolor{blue}{\underline{انتها}}}} (\textcolor{CustomColor}{و داک \lr{P2P}}) توضیح داده شده است. + +\subsection*{{\titr ارسال خرید}} +\addcontentsline{toc}{subsection}{{\fehrestContent ارسال خرید}} + +بعد از خرید کردن توسط خریدار، باید لاگ خرید و آدرس خریدار در حساب مدیران فروشگاه قابل مشاهده باشد. مدیران باید بتوانند خرید‌های انجام شده را مشاهده کنند و وضعیت تحویل آن‌ها را به ارسال شده تغییر دهند. خریداران نیز در بخش تاریخچه خرید در حساب خود باید بتوانند وضعیت سفارش‌های خود را ببینند (‌ارسال شده یا در انتظار ارسال). + +\begin{itemize} +\item +اگر محصول خریداری شده فایل بود، همین اطلاعات باید در حساب مدیران و خریداران قابل مشاهده باشد اما دیگر وضعیت ارسال و آدرس خریدار وجود نخواهد داشت. +\end{itemize} + +\subsection*{{\titr توکن}} +\addcontentsline{toc}{subsection}{{\fehrestContent توکن}} + +در محتوای مربوط به شبکه (داک شبکه)، توکن توضیح داده شد. پیاده سازی توکن برای ارتباط کاربران فروشگاه (‌با سرور فروشگاه)‌ نیز از موارد اجباری این فاز است. + + +\newpage + +\section*{{\titr بخش‌های امتیازی}} +\addcontentsline{toc}{section}{{\fehrestContent بخش‌های امتیازی}} + +از این قسمت به بعد وارد بخش‌های امتیازی پروژه می شویم. دقت کنید که این بخش های هم بسیار آموزنده و کاربردی هستند و هم می تواند به نمره پروژه شما به اندازه قابل توجهی اضافه کند. :) + + +\subsection*{{\titr وضعیت کاربران}} +\addcontentsline{toc}{subsection}{{\fehrestContent وضعیت کاربران}} + +مدیران فروشگاه بتوانند وضعیت (‌آنلاین یا آفلاین) بودن کاربران را مشاهده کنند. به این صورت که لیستی از تمام کاربران و وضعیت آن‌ها وجود داشته باشد. + +\subsection*{{\titr چت همزمان}} +\addcontentsline{toc}{subsection}{{\fehrestContent چت همزمان}} + +همان طور که در بخش پشتیبان نیز گفته شد،‌ یک پشتیبان بتواند همزمان با چند خریدار صحبت کند.توجه کنید که باید فسمت گرافیکی این موضوع هم رعایت شود و پشتیبان بتواند به سهولت بین چت‌ها جابجا شود. + + +\subsection*{{\titr پایگاه داده}} +\addcontentsline{toc}{subsection}{{\fehrestContent پایگاه داده}} + + +برای ذخیره اطلاعات حساب‌ها در سرور، می توانید از پایگاه داده استفاده کنید (‌کاری که در برنامه‌های واقعی و عملی به جای ذخیره سازی خام در فایل انجام می شود). + + +برای این منظور در \textcolor{CustomColor}{داک پایگاه داده} مفاهیم مربوط به پایگاه داده و کار با آن در جاوا توضیح داده شد. + + + +\subsection*{{\titr {REST}}} +\addcontentsline{toc}{subsection}{{\fehrestContent {REST}}} + +برای ارتباط بین کلاینت و سرور،‌ می توانید از معماری نرم افزاری \lr{REST} استفاده کنید. \lr{REST} به عنوان عضوی از دنیای وب شناخته می‌شود و مزایا و کاربردهای بسیاری دارد. برای آشنایی و پیاده سازی آن به داک \lr{REST} مراجعه کنید. + + + + +\subsection*{{\titr بانک}} +\addcontentsline{toc}{subsection}{{\fehrestContent بانک}} + +از موارد مهم امتیازی، پیاده سازی بانک است. شما می‌توانید بانک گفته شده را خودتان پیاده سازی کنید. دقت کنید که بانکی که شما پیاده می‌کنید باید API آن مشابه API بانک آماده‌ای که ما در اختیارتان قرار می‌دهیم باشد. (‌به دستورات گفته شده در +\textcolor{CustomColor}{داک بانک} + مراجعه کنید) + + + +\begin{itemize}[label = $\star$] +\item + +در صورت مشابه بودن کد بانک شما به بانکی که ما در اختیارتان قرار می‌دهیم،‌ برای شما \textcolor{CustomColor}{تقلب} منظور می‌گردد. + + +\end{itemize} + + + +\subsection*{{\titr امنیت}} +\addcontentsline{toc}{subsection}{{\fehrestContent امنیت}} + +از موارد امتیازی دیگر پیاده سازی کنترل‌های امنیتی و تامین حداقلی امنیت نرم افزار است. برای این منظور محتوایی آماده شده است که بطور کلی مفهوم امنیت را بیان می‌کند و آن چه ما به عنوان فروشگاه و بانک امن (در صورت پیاده سازی بانک توسط خودتان) از شما می‌خواهیم را تعریف می‌کند و همچنین در امن سازی آن به شما کمک خواهد. + +\begin{itemize}[label = $\star$] +\item + +دقت کنید، بانکی را که ما در اختیار شما قرار می‌دهیم، لزوما همه‌ی موارد \textcolor{CustomColor}{داک امنیت} را رعایت نکرده است. + +\end{itemize} + + + + +\subsection*{{\titr {Peer-to-Peer}}} +\addcontentsline{toc}{subsection}{{\fehrestContent {Peer-to-Peer}}} +\label{subsec:p2p} + +مورد امتیازی بعدی انتقال \lr{P2P} فایل پس از خرید در فروشگاه است. به این صورت که اگر خریداری درخواست خرید یک فایل از فروشنده را داشت،‌ به جای استفاده از سرور به عنوان میزبان میانی \lr{(‌middle host)}، این فایل مستقیما از فروشنده به خریدار منتقل شود. برای آشنایی با مفاهیم \lr{Peer-To-Peer} و پیاده سازی آن به \textcolor{CustomColor}{داک \lr{P2P}} مراجعه کنید. + + +\end{document} + + + + + + + diff --git a/phase_3/main/XB Zar bold.ttf b/phase_3/main/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/main/XB Zar bold.ttf differ diff --git a/phase_3/main/XB Zar.ttf b/phase_3/main/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/main/XB Zar.ttf differ diff --git a/phase_3/main/sharif.png b/phase_3/main/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/main/sharif.png differ diff --git a/phase_3/main/sharif1.png b/phase_3/main/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/main/sharif1.png differ diff --git a/phase_3/main/tex.bib b/phase_3/main/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/main/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/p2p/IRNazanin.ttf b/phase_3/p2p/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/p2p/IRNazanin.ttf differ diff --git a/phase_3/p2p/IRNazaninBold.ttf b/phase_3/p2p/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/p2p/IRNazaninBold.ttf differ diff --git a/phase_3/p2p/IRNazaninIrani.ttf b/phase_3/p2p/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/p2p/IRNazaninIrani.ttf differ diff --git a/phase_3/p2p/Lalezar-Regular.ttf b/phase_3/p2p/Lalezar-Regular.ttf new file mode 100644 index 0000000..fd915c3 Binary files /dev/null and b/phase_3/p2p/Lalezar-Regular.ttf differ diff --git a/phase_3/p2p/LiberationSerif-Bold.ttf b/phase_3/p2p/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/p2p/LiberationSerif-Bold.ttf differ diff --git a/phase_3/p2p/LiberationSerif-BoldItalic.ttf b/phase_3/p2p/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/p2p/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/p2p/LiberationSerif-Italic.ttf b/phase_3/p2p/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/p2p/LiberationSerif-Italic.ttf differ diff --git a/phase_3/p2p/LiberationSerif-Regular.ttf b/phase_3/p2p/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/p2p/LiberationSerif-Regular.ttf differ diff --git a/phase_3/p2p/XB Zar bold.ttf b/phase_3/p2p/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/p2p/XB Zar bold.ttf differ diff --git a/phase_3/p2p/XB Zar.ttf b/phase_3/p2p/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/p2p/XB Zar.ttf differ diff --git a/phase_3/p2p/images/file_transfer.png b/phase_3/p2p/images/file_transfer.png new file mode 100644 index 0000000..66066cb Binary files /dev/null and b/phase_3/p2p/images/file_transfer.png differ diff --git a/phase_3/p2p/images/i0.png b/phase_3/p2p/images/i0.png new file mode 100644 index 0000000..f574525 Binary files /dev/null and b/phase_3/p2p/images/i0.png differ diff --git a/phase_3/p2p/images/i1.png b/phase_3/p2p/images/i1.png new file mode 100644 index 0000000..4d85b53 Binary files /dev/null and b/phase_3/p2p/images/i1.png differ diff --git a/phase_3/p2p/p2p.pdf b/phase_3/p2p/p2p.pdf new file mode 100644 index 0000000..12c7294 Binary files /dev/null and b/phase_3/p2p/p2p.pdf differ diff --git a/phase_3/p2p/p2p.tex b/phase_3/p2p/p2p.tex new file mode 100644 index 0000000..258af08 --- /dev/null +++ b/phase_3/p2p/p2p.tex @@ -0,0 +1,339 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[export]{adjustbox} +\usepackage{graphicx} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage{wrapfig} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} +\definecolor{CustomColor}{HTML}{cc0000} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{معماری \lr{P2P}} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{صابر ظفرپور}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو و صابر ظفرپور}} + + + \vspace{0.05cm} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{Peer-to-Peer} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + +\tableofcontents + +\newpage + + \Large \textbf{\\\\ +} + +\section*{{\titr اینو دیگه کجای دلمون باس جا بدیم؟}} +\addcontentsline{toc}{section}{{\fehrestContent اینو دیگه کجای دلمون باس جا بدیم؟}} + + +یکی بود ولی هنوز اینترنت نبود، اواخر دهه هفتم قرن 20ام میلادی پروژه‌ای مشترک بین تعدادی از دانشگاه‌های آمریکا و به واسطه پشتیبانی \lr{DoD} (وزارت دفاع آمریکا) آغاز به کار کرد که 4 راس در نقاط مختلف آمریکا را به یکدیگر وصل کرد. بعدها این شبکه گسترش یافت و با نام اینترنت به صورت تجاری و برای عموم مردم قابل استفاده شد. در اوایل این دوران معماری که مورد استفاده قرار می‌گرفت چیزی نبود جز یک معماری \lr{P2P} ، اما با گذر زمان به علل مختلف (امنیتی ، تجاری ، فنی و …) معماری مورد استفاده توسط اینترنت طی یک دگرگونی تبدیل به چیزی شد که ما الان با آن آشنایی داریم . + +\begin{center} +\includegraphics[width=1\textwidth]{images/i0.png} +\end{center} + +معماری بر مبنای مدل کلاینت سرور مدلی از معماری شبکه است که در حال حاضر به صورت کاملا وسیعی مورد استفاده قرار گرفته است. در این مدل تعدادی سرور وجود دارد که بقیه کاربران فقط حق ارتباط مستقیم با همین سرورها را دارند ، به طور مثال فرض کنید شما (\lr{Alice}) در این مدل قصد دارید برای دوست خود(\lr{Bob}) یک فایل موزیک را ارسال کنید، احتمالا تمام راه‌های انتقال فایلی که در ذهن دارید از طریق همین نوع معماری است (تقریبا تمامی نرم افزارهای فضای ابری و یا پیام‌رسان‌ها) ، اما سوالی که در ذهن ایجاد می‌شود اینست که آیا واقعا این مدل معماری شبکه در تمامی حالات منطقی است؟؟؟ چرا در چنین شبکه‌ای (اینترنت)که تمامی راس‌های عضو آن در یک گراف همبند قرار دارند، این راس‌ها نباید قادر به ارتباط مستقیم و بدون حضور شخص سوم با یکدیگر باشند؟( اگر این مسئله باعث دغدغه ذهنی شما نشده، خواندن ادامه داک احتمالا برای شما بی ثمر خواهد بود) + +\begin{center} +\includegraphics[width=0.8\textwidth]{images/file_transfer.png} +\end{center} + + +\section*{{\titr بازگشت به ریشه‌ها}} +\addcontentsline{toc}{section}{{\fehrestContent بازگشت به ریشه‌ها}} + + +در طی تمامی این سال‌ها ، توسعه دهندگان متن باز \lr{(open-source developers)} بر روی ایده‌ها و پیاده‌سازی‌های خلاقانه p2p کار کرده‌اند. احتمالا نام بعضی از این ایده ها و ابزارها برایتان آشنا باشد (بیت کوین (واحد پول بدون بانک مرکزی)، بیت تورنت (اشتراک گذاری فایل در اینترنت)، \lr{Usenet} , \lr{Napster} \lr{Darknet} ,\lr{Skype}, \lr{Gnutella}). + + +\begin{wrapfigure}{l}{0.5\textwidth}\centering +\includegraphics[width=0.5\textwidth]{images/i1.png} +\end{wrapfigure} + +اگر هم این سنگ قبر برایتان سوالی ایجاد کرده و به دنبال قاتل این موجود شریف و اصیل هستید، شما را به این موجود (\lr{NAT}) ارجاع میدهم که باعث بسیار سخت شدن پیاده سازی این معماری در سطح اینترنت شده است. البته تا سال‌های 2005 نیز همچنان بیشتر ترافیک اینترنت توسط اپلیکیشن های با معماری \lr{P2P} مصرف میشد. + + +\section*{{\titr یکمی هم حرف فنی بزن دیگه!!}} +\addcontentsline{toc}{section}{{\fehrestContent یکمی هم حرف فنی بزن دیگه!!}} + +در این معماری هیچ گونه تفاوتی بین راس‌ها وجود ندارد، یعنی هر راس هم می‌تواند سرور باشد و هم کلاینت ، یعنی می‌تواند همزمان که یک فایل را برای فرد دیگر میفرستد ، فایل مورد نیاز خود را از فرد دیگری در شبکه دریافت کند. + +همانطور که احتمالا می‌دانید به هر موجود در شبکه یک شماره منحصر به فرد به نام IP داده می‌شود، اما این IP کافی نیست ، یک عدد دیگر نیز تعیین کننده است، این عدد port است،که از 0 تا 65535 بازه آن است، این عدد تعیین کننده این است که اگر بسته‌ای به IP شما ارسال شد باید برای کدام برنامه سیستم عامل ارسال شود (به طور مثال اگر شما همزمان در حال استفاده از دو مرورگر باشید، باید سیستم عامل بداند که هر بسته مربوط به کدام مرورگر است)، پس اگر شما بر روی یک پورت رندوم در حال شنیدن باشید و IP و آن پورت را به فرد دیگری بدهید‌، شما و آن فرد میتوانید به صورت مستقیم به هم وصل شوید و در صورت استفاده از پروتکل (مانند زبان مورد استفاده انسان‌ها) یکسان می‌توانید با هم ارتباط برقرار کنید. +البته ذکر این نکته ضروری است که این مسئله به علت وجود NAT نزدیک به 25 سال است که تبدیل به یک چالش شده است، البته تعدادی روش برای دور زدن این موجود \lr{(NAT Traversal)} به وجود آمده است که به وسیله آن هنوز می‌توانیم به ادامه این معماری امید داشته باشیم. + تقسیم می‌شود. + + +\newpage +\section*{{\titr خب این Peer-to-Peer اصلا چه مزایایی داره؟؟}} +\addcontentsline{toc}{section}{{\fehrestContent خب این Peer-to-Peer اصلا چه مزایایی داره؟؟}} + + +هزینه راه اندازی سرور‌ها برای اکثریت سرویس‌ها یک بار اضافه و از نظر مالی بسیار سنگین است ، به طور مثال فرض کنید شما یک پیام‌رسان بومی تولید کرده‌اید و این پیام‌رسان قابلیت تماس تصویری دارد و همچنین فرض کنید در حال حاضر که همه در خانه‌های خود هستند (در زمان نگارش این داک کرونا شکست نخورده بود:) بیش از 50000 کاربر از قابلیت تماس تصویری شما استفاده کنند و با یکدیگر تماس برقرار کنند، اگر فرض کنیم ثانیه‌ای 300kb توسط هر راس اطلاعات به سرور برای فرستادن به راس دیگر فرستاده شود‌، آنگاه شما باید قادر به تامین گذردهی حداقل 15Tb در ثانیه برای سرور خود باشید که حتی بدون حساب کردن قدرت پردازشی تلف شده یک هزینه کاملا بی دلیل است، در صورت استفاده از یک معماری \lr{P2P} آنگاه دیگر نیاز به چنین سرور با چنین منابع بالایی نبود. نکته دیگر موضوع امنیت است که در این نوع معماری با توجه اینکه می‌توان رمز گذاری‌های متنوعی استفاده کرد، دغدغه امنیت ارتباط کاربران برطرف می‌شود. +هرگز مزیت privacy موجود برای هر راس در این نوع شبکه را از یاد نبرید، این مزیت در کنار غیر قابل \textcolor{red}{سانسور} بودن‌، دو مزیت بسیار بسیار مهم این نوع معماری هستند. + + + +\section*{{\titr چطور یک Peer-to-Peer دولوپر شم؟}} +\addcontentsline{toc}{section}{{\fehrestContent چطور یک Peer-to-Peer دولوپر شم؟}} + +کاملا واضح است که با توجه به شرایط فعلی (وجود NAT در اکثر شبکه‌ها)، شما نمی‌توانید همانند معماری سرور و کلاینت با چند خط کد ساده یک ساختار شبکه \lr{P2P} پیاده کنید. اما با مطالعه کد‌های موجود در مخازن گیت هاب به ایده‌های بسیار جذابی بر می‌خورید، پس یکی از منابع اصلی یادگیری \lr{P2P} کدهای موجود در گیت هاب است (میتوانید با جستجوی tag هایی نظیر \lr{P2P} به این \href{https://github.com/search?l=Java&q=p2p-network&type=Repositories}{\textcolor{blue}{\underline{مخازن}}} + دسترسی داشته باشید) + + +گوگل چندین سال است که در حال توسعه تکنولوژی به نام \href{https://webrtc.org/}{\textcolor{blue}{\underline{\lr{WebRTC}}}} است که در حال حاضر توسط اکثر دولوپر‌های این حوزه درحال استفاده است. \href{https://webtorrent.io/}{\textcolor{blue}{\underline{\lr{WebTorrent}}}} نیز بر روی ترکیب این تکنولوژی و تورنت ساخته شده است. در حال حاضر بهترین زبان برای پیاده سازی و استفاده از معماری \lr{P2P} زبان javascript (که هیچ ربطی به جاوا نداره) است. +البته توصیه می‌شود قبل از تلاش برای شروع کد زدن و پیاده سازی این معماری در ابتدا با مطالعه مفاهیم {\lr{NAT Traversal} و پروتکل‌های رایج مورد استفاده نظیر STUN ,TURN, ICE آشنایی حداقلی را با این موضوع به دست بیاورید. + + +\section*{{\titr پس پروژه چی شد این وسط؟؟}} +\addcontentsline{toc}{section}{{\fehrestContent معماری Peer-To-Peer}} + +در فاز سه، قسمتی امتیازی وجود دارد که شما باید برای قسمت فروش فایل، از این معماری به صورت محدود (فقط برای انتقال فایل) استفاده کنید ، به این صورت که خریدار فایل خود را از سرور دریافت نکند بلکه آن را به صورت مستقیم از فروشنده دریافت کند. +\begin{enumerate} +\item +برای بررسی کردن و نمره دادن به این بخش، به پیاده سازی پروتکل و برقراری ارتباط نمراتی تعلق می گیرد (پس با کمی وقت گذاشتن می‌تونید از این قسمت امتیازی نمره مناسبی دریافت کنید). +\item +همچنین ما فقط ساده‌ترین حالت معماری \lr{P2P}، یعنی حالتی که هر دو راس در یک شبکه محلی قرار دارند (مثلا به یک مودم وصل‌اند و به اصطلاح پشت یک NAT هستند)را بررسی می‌کنیم ، پس عملا چالش‌های شما بسیار محدود و کم است. +\end{enumerate} + + +\section*{{\titr نمونه های واقعی و منابع }} +\addcontentsline{toc}{section}{{\fehrestContent نمونه های واقعی و منابع }} + +\begin{enumerate} +\item +\href{https://techdifferences.com/difference-between-client-server-and-peer-to-peer-network.html}{\textcolor{blue}{\underline{\lr{P2P vs client-server}}}} + +\item +\href{https://manfred.life/history-p2p}{\textcolor{blue}{\underline{\lr{P2P history}}}} + +\item +\href{https://www.webrtc-experiment.com/}{\textcolor{blue}{\underline{\lr{WebRTC samples}}}} + +\item +\href{https://github.com/SaberDoTcodeR/SHoReNT/}{\textcolor{blue}{\underline{\lr{My P2P network for Sharif(SHoReNT) which is under development}}}} + +\end{enumerate} + +\end{document} + + + + + + + diff --git a/phase_3/p2p/sharif.png b/phase_3/p2p/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/p2p/sharif.png differ diff --git a/phase_3/p2p/sharif1.png b/phase_3/p2p/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/p2p/sharif1.png differ diff --git a/phase_3/p2p/tex.bib b/phase_3/p2p/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/p2p/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +} diff --git a/phase_3/security/IRNazanin.ttf b/phase_3/security/IRNazanin.ttf new file mode 100644 index 0000000..cee69de Binary files /dev/null and b/phase_3/security/IRNazanin.ttf differ diff --git a/phase_3/security/IRNazaninBold.ttf b/phase_3/security/IRNazaninBold.ttf new file mode 100644 index 0000000..f681256 Binary files /dev/null and b/phase_3/security/IRNazaninBold.ttf differ diff --git a/phase_3/security/IRNazaninIrani.ttf b/phase_3/security/IRNazaninIrani.ttf new file mode 100644 index 0000000..bbc0e9a Binary files /dev/null and b/phase_3/security/IRNazaninIrani.ttf differ diff --git a/phase_3/security/Lalezar-Regular.ttf b/phase_3/security/Lalezar-Regular.ttf new file mode 100644 index 0000000..b4dfd64 Binary files /dev/null and b/phase_3/security/Lalezar-Regular.ttf differ diff --git a/phase_3/security/LiberationSerif-Bold.ttf b/phase_3/security/LiberationSerif-Bold.ttf new file mode 100644 index 0000000..db3d6f3 Binary files /dev/null and b/phase_3/security/LiberationSerif-Bold.ttf differ diff --git a/phase_3/security/LiberationSerif-BoldItalic.ttf b/phase_3/security/LiberationSerif-BoldItalic.ttf new file mode 100644 index 0000000..8b21277 Binary files /dev/null and b/phase_3/security/LiberationSerif-BoldItalic.ttf differ diff --git a/phase_3/security/LiberationSerif-Italic.ttf b/phase_3/security/LiberationSerif-Italic.ttf new file mode 100644 index 0000000..768b833 Binary files /dev/null and b/phase_3/security/LiberationSerif-Italic.ttf differ diff --git a/phase_3/security/LiberationSerif-Regular.ttf b/phase_3/security/LiberationSerif-Regular.ttf new file mode 100644 index 0000000..6fa9a59 Binary files /dev/null and b/phase_3/security/LiberationSerif-Regular.ttf differ diff --git a/phase_3/security/XB Zar bold.ttf b/phase_3/security/XB Zar bold.ttf new file mode 100644 index 0000000..4770b80 Binary files /dev/null and b/phase_3/security/XB Zar bold.ttf differ diff --git a/phase_3/security/XB Zar.ttf b/phase_3/security/XB Zar.ttf new file mode 100644 index 0000000..851fd2c Binary files /dev/null and b/phase_3/security/XB Zar.ttf differ diff --git a/phase_3/security/images/man-in-the-middle.png b/phase_3/security/images/man-in-the-middle.png new file mode 100644 index 0000000..0788c6a Binary files /dev/null and b/phase_3/security/images/man-in-the-middle.png differ diff --git a/phase_3/security/security.pdf b/phase_3/security/security.pdf new file mode 100644 index 0000000..870324c Binary files /dev/null and b/phase_3/security/security.pdf differ diff --git a/phase_3/security/security.tex b/phase_3/security/security.tex new file mode 100644 index 0000000..df74e9e --- /dev/null +++ b/phase_3/security/security.tex @@ -0,0 +1,478 @@ +\documentclass[]{article} +\usepackage{graphicx} +\usepackage[svgnames]{xcolor} +\usepackage{fancyhdr} +\usepackage{tocloft} +\usepackage[hidelinks]{hyperref} +\usepackage{enumitem} +\usepackage[many]{tcolorbox} +\usepackage{listings } +%\usepackage[a4paper, total={6in, 8in} , top = 2cm,bottom = 4cm]{geometry} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{afterpage} +\usepackage{amssymb} +\usepackage{pdflscape} +\usepackage{textcomp} +\usepackage{xecolor} +\usepackage{rotating} +\usepackage[Kashida]{xepersian} +\usepackage[T1]{fontenc} +\usepackage{tikz} +\usepackage[utf8]{inputenc} +\usepackage{PTSerif} +\usepackage{seqsplit} +\usepackage{changepage} + + +\usepackage{listings} +\usepackage{xcolor} +\usepackage{sectsty} + +\setcounter{secnumdepth}{0} + +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codegray}{rgb}{0.5,0.5,0.5} +\definecolor{codepurple}{rgb}{0.58,0,0.82} +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} +\definecolor{blanchedalmond}{rgb}{1.0, 0.92, 0.8} +\definecolor{brilliantlavender}{rgb}{0.96, 0.73, 1.0} + +\NewDocumentCommand{\codeword}{v}{ +\texttt{\textcolor{blue}{#1}} +} +\lstset{language=java,keywordstyle={\bfseries \color{blue}}} + +\lstdefinestyle{mystyle}{ + backgroundcolor=\color{backcolour}, + commentstyle=\color{codegreen}, + keywordstyle=\color{magenta}, + numberstyle=\tiny\color{codegray}, + stringstyle=\color{codepurple}, + basicstyle=\ttfamily\normalsize, + breakatwhitespace=false, + breaklines=true, + captionpos=b, + keepspaces=true, + numbers=left, + numbersep=5pt, + showspaces=false, + showstringspaces=false, + showtabs=false, + tabsize=2 +} + +\lstset{style=mystyle} + + \settextfont[BoldFont={XB Zar bold.ttf}]{XB Zar.ttf} + + +\setlatintextfont[Scale=1.0, + BoldFont={LiberationSerif-Bold.ttf}, + ItalicFont={LiberationSerif-Italic.ttf}]{LiberationSerif-Regular.ttf} + + + + +\newcommand{\inputsample}[1]{ + ~\\ + \textbf{ورودی نمونه} + ~\\ + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newcommand{\outputsample}[1]{ + ~\\ + \textbf{خروجی نمونه} + + \begin{tcolorbox}[breakable,boxrule=0pt] + \begin{latin} + \large{ + #1 + } + \end{latin} + \end{tcolorbox} +} + +\newtcolorbox{mybox}[2][]{colback=red!5!white, +colframe=red!75!black,fonttitle=\bfseries, +colbacktitle=red!85!black,enhanced, +attach boxed title to top center={yshift=-2mm}, +title=#2,#1} + +\newenvironment{changemargin}[2]{% +\begin{list}{}{% +\setlength{\topsep}{0pt}% +\setlength{\leftmargin}{#1}% +\setlength{\rightmargin}{#2}% +\setlength{\listparindent}{\parindent}% +\setlength{\itemindent}{\parindent}% +\setlength{\parsep}{\parskip}% +}% +\item[]}{\end{list}} + + +\definecolor{foldercolor}{RGB}{124,166,198} +\definecolor{sectionColor}{HTML}{ff5e0e} +\definecolor{subsectionColor}{HTML}{008575} + +\definecolor{listColor}{HTML}{00d3b9} + +\definecolor{umlrelcolor}{HTML}{3c78d8} + +\definecolor{subsubsectionColor}{HTML}{3c78d8} + +\defpersianfont\authorFont[Scale=0.9]{XB Zar bold.ttf} + +\defpersianfont\titr[Scale=1.5]{Lalezar-Regular.ttf} + +\defpersianfont\fehrest[Scale=1.2]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestTitle[Scale=3.0]{Lalezar-Regular.ttf} + +\defpersianfont\fehrestContent[Scale=1.2]{XB Zar bold.ttf} + + +\sectionfont{\color{sectionColor}} % sets colour of sections +\subsectionfont{\color{subsectionColor}} % sets colour of sections +\subsubsectionfont{\color{subsubsectionColor}} + + +\renewcommand{\labelitemii}{$\circ$} + + +\renewcommand{\baselinestretch}{1.1} + + +\renewcommand{\contentsname}{فهرست} + +\renewcommand{\cfttoctitlefont}{\fehrestTitle} + + +\renewcommand\cftsecfont{\color{sectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsecfont{\color{subsectionColor}\fehrestContent\selectfont} +\renewcommand\cftsubsubsecfont{\color{subsubsectionColor}\fehrestContent\selectfont} +%\renewcommand{\cftsecpagefont}{\color{sectionColor}} + +\setlength{\parskip}{1.2pt} + +\begin{document} + + +%%% title pages +\begin{titlepage} +\begin{center} + +\textbf{ \Huge{به نام خدا} } + +\vspace{0.2cm} + +\includegraphics[width=0.4\textwidth]{sharif1.png}\\ +\vspace{0.2cm} +\textbf{ \Huge{\emph درس برنامه‌سازی پیشرفته} }\\ +\vspace{0.25cm} +\textbf{ \Large{امنیت شبکه} } +\vspace{0.2cm} + + + \large \textbf{دانشکده مهندسی کامپیوتر}\\\vspace{0.1cm} + \large دانشگاه صنعتی شریف\\\vspace{0.2cm} + \large ﻧﯿﻢ سال دوم 99-98 \\\vspace{0.10cm} + \noindent\rule[1ex]{\linewidth}{1pt} +اساتید:\\ + \textbf{{مهدی مصطفی‌زاده، ایمان عیسی‌زاده، امیر ملک‌زاده، علی چکاه}} + + + + \vspace{0.10cm} +نگارش و تهیه محتوا:\\ + \textbf{{محسن دهقان کار، صابر ظفرپور}} + + \vspace{0.10cm} + تنظیم داک:\\ + \textbf{{امیرمهدی نامجو، محسن دهقان کار}} + + + \vspace{0.05cm} + + +\end{center} +\end{titlepage} +%%% title pages + + +%%% header of pages +\newpage +\pagestyle{fancy} +\fancyhf{} +\fancyfoot{} +\cfoot{\thepage} +\lhead{امنیت شبکه} +\rhead{\includegraphics[width=0.1\textwidth]{sharif.png}\\ +دانشکده مهندسی کامپیوتر +} +\chead{پروژه برنامه‌سازی پیشرفته} +%%% header of pages +\renewcommand{\headrulewidth}{2pt} + +\KashidaOff + + + +\tableofcontents + +\newpage + + \Large \textbf{\\\\ +} + + +\section*{{\titr امنیت یعنی چی؟}} +\addcontentsline{toc}{section}{{\fehrestContent امنیت یعنی چی؟}} + +به طور کلی همه ی ما یک ذهنیت اولیه (احتمالا اشتباه) از امنیت داریم، در این داک ما قصد داریم یک توضیح مختصر و البته پوشا از موضوعات مرتبط با امنیت در فاز 3 پروژه این ترم AP به شما عزیزان ارائه دهیم. امنیت در کامپیوتر یا به عبارت دیگر همان امنیت سایبری یکی از شاخه‌های مهم حوزه کامپیوتر است که در عصر ارتباطات و با افزایش تصاعدی ضریب نفوذ کامپیوتر در عرصه‌های مختلف نیاز به آن نیز در حال افزایش است. در دانشکده ما نیز این درس جزو چارت اجباری (ترم 8) است. + + +\section*{{\titr شاخه‌های مختلف امنیت}} +\addcontentsline{toc}{section}{{\fehrestContent شاخه‌های مختلف امنیت}} +در این داک ما تنها قصد داریم که امنیت را در سطوح شبکه به صورت محدود بررسی کنیم و در این سطح نیز فقط به موضوعات امنیت نرم افزار در سطح شبکه کفایت می‌کنیم. از دیگر شاخه‌های مهم بحث سایبر سکیوریتی \lr{(cyber security)} می‌توان به امنیت در حوزه اینترنت اشیا، امنیت زیرساخت‌های سخت افزاری، امنیت در چرخه تولید و حیات نرم افزار و … اشاره کرد. + + + + +\section*{{\titr تهدیدات و آسیب پذیری ها و کنترل ها}} +\addcontentsline{toc}{section}{{\fehrestContent تهدیدات و آسیب پذیری ها و کنترل ها}} +در مبحث امنیت ما با تهدیداتی روبرو هستیم، اما ابتدا باید تهدید را به طور دقیق تعریف کنیم: + + +تهدید(Threat): یک خطر بالقوه که می‌تواند از یک آسیب پذیری موجود درون سیستم سوء استفاده کند. + +به طور مثال: درز اطلاعات بانکی حساب‌های درون فروشگاه شما - آسیب‌های فیزیکی به سرور‌های فروشگاه شما نظیر سیل و زلزله و حریق + +اما در تعریف تهدید به کلمه آسیب پذیری برخوردیم ، پس باید برای آن نیز یک تعریف دقیق ارائه کنیم: + + +\bigskip +آسیب پذیری(Vulnerability) : ضعفی که درون سیستم وجود دارد و می‌تواند توسط یک عامل (به طور مثال یک هکر) برای رسیدن به اهداف (معمولا خصمانه) استفاده شود. + +به طور مثال: آسیب پذیری \href{https://owasp.org/www-community/attacks/xss/}{\textcolor{blue}{\underline{\lr{\lr{(Cross Site Scripting XSS)}}}}} - آسیب پذیری عدم رمزگذاری ارتباط کلاینت و سرور و … + +برای مقابله با این آسیب پذیری‌ها می‌توان یک سری راهکار امنیتی پیشنهاد کرد که با اجرای آن می‌توان بسیاری از آسیب پذیری‌های شناخته شده را برطرف کرد. + +به طور مثال :\lr{(Input Sanitization)} یک کنترل بسیار قوی برای جلوگیری از حملات تزریق است. + +\bigskip + +در ادامه سعی می‌کنیم بسیاری از آسیب پذیری‌هایی که ممکن است در نرم افزار شما وجود داشته باشد را به شما اطلاع داده و راهکار و ابزار‌های شناسایی آن و راهکار مناسب برطرف کردن آن و کنترل‌های مناسب برای آن آسیب پذیری را در زبان جاوا در اختیارتان قرار دهیم. + +\newpage + +\section*{{\titr آسیب پذیری ها و حملات رایج}} +\addcontentsline{toc}{section}{{\fehrestContent آسیب پذیری ها و حملات رایج}} + +\lr{ +\begin{enumerate} +\item +Replay attacks* +\item +Improper Inputs* +\item +Sql Injection* (When using SQL-Based database) +\item +Broken Authentication* +\item +Sensitive Data Exposure +\item +Brute force attack* +\item +Broken Access Control +\item +Remote Code Execution (RCE) +\item +Man In The Middle (MITM) +\item +Denial of service* (DOS) +\end{enumerate} +} + + +جزییات این آسیب پذیری‌ها در ادامه قرار داده شده است. + + + + +\section*{{\titr خب من کجا می‌تونم این حملاتو تست کنم و قلقشونو بگیرم؟؟}} + +بسیار سوال خوبیه، شما هر چقدر هم در مورد این آسیب پذیری‌ها مطالعه کنید ، در صورتی که این آسیب پذیری‌ها توسط خودتون تست نشه و به نوعی خودتون در جایگاه فرد هکر نباشید، نخواهید توانست که به خوبی نسبت به امنیت نرم افزار خودتون دید خوبی داشته باشید. اما تست کردن این حملات بر روی سایت‌های واقعی میتونه براتون عواقب بدی داشته باشه:) + +خب برای این موضوع بهترین راهکار تست کردن این باگ‌ها درون یک محیط ایزوله آزمایشگاهی هست، پس هر وقت که حوصله داشتید برید توی این سایت و نرم افزار \href{https://webgoat.github.io/WebGoat/}{\textcolor{blue} {webgoat}} رو نصب کنید و یک تجربه جذابی از هکر بودن (حداقل توی آزمایشگاه) رو داشته باشید. + + + +\section*{{\titr جزییات آسیب پذیری‌ها}} +\addcontentsline{toc}{section}{{\fehrestContent جزییات آسیب پذیری‌ها}} + + +\subsection*{{\lr{\titr Replay Attacks}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Attacks Replay}} +همان طور که اسمش پیداست، این حمله زمانی رخ می‌دهد که یک مهاجم (\lr{‌attacker}) پیام‌های رد و بدل شده بین سرور و کلاینت شما را برای خود ذخیره می‌کند(\lr{intercepting and capturing packets})، سپس پس از مدتی آن‌ها را دوباره به مقصد می‌فرستد یا حجم زیادی از این پیام‌ها را از طرف خودش به مقصد می‌فرستد. حال اگر دریافت کننده پیام، با این پیام‌های تکراری کاری انجام دهد که مطلوب نیست، \lr{replay attack} رخ داده است. + +برای توضیحات بیش‌تر به این \href{https://www.kaspersky.com/resource-center/definitions/replay-attack} {\textcolor{blue}{\underline{لینک}}} مراجعه کنید. + + + + +\subsection*{{\lr{\titr Improper Inputs}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Inputs Improper}} +ممکن است به سمت سرور شما هر نوع ورودی فرستاده شود. اگر در سمت سرور (گیرنده پیام) هیچ اعتبار سنجی (validation)‌ و یا اعتبار سنجی ضعیفی انجام شود،‌ ممکن است سبب متوقف شدن سرور مثلا پرتاب شدن exception و یا تغییر در وضعیت سرور شود که مطلوب نیست. هدف این حمله این است که با دادن ورودی‌های نامعتبر به سرور دچار خلل در کار سرور شویم. یا به عبارتی دسترسی پذیری (‌availability)‌ سرور را از بین ببرد. +\bigskip + +همچنین حالت‌هایی را درنظر بگیرید که کلاینت و سرور پیامی را با هم رد و بدل کردند،‌ شخصی در این بین این پیام را شنود کرد (‌کاری که در شبکه انجام دادنش اصلا سخت نیست برای مثال با استفاده از برنامه ای مثل wireshark). سپس این فرد شنودکننده،‌ پیام را تغییر می‌دهد و برای سرور مجددا می فرستد. نباید با این کار اثر نامطلوبی بر روی عملکرد سرور ایجاد شود. + +\bigskip + +حالتی دیگر این است که سرور به کلاینت این اجازه را بدهد که نامی با هر طولی وارد کند، بنابراین کلاینت (فرستنده)‌ می‌تواند با نوشتن یک رشته بسیار طولانی، حجم بزرگی از حافظه سرور را اشغال کند و با تکرار این عمل،‌ سرور را کُند کرده و یا از کار بیندازد. + +این یک آسیب پذیری کلی، ابتدایی و در عین حال خطرناک است،‌ برای مطالعه بیشتر در مورد آن به این \href{https://cwe.mitre.org/data/definitions/20.html}{\textcolor{blue}{\underline{{لینک}}}} مراجعه کنید. + + + + +\subsection*{{\lr{\titr SQL-Injection}}} +\addcontentsline{toc}{subsection}{{\fehrestContent SQL-Injection}} +در صورت استفاده از دیتابیس‌های SQL ، این حملات می تواند کاملا دیتابیس شما را پاک کند یا اینکه در آن تغییرات مورد‌نیاز نفوذگر را پیاده کند، از این حملات برای دور زدن صفحات احراز هویت نیز استفاده می‌شود. اما در زبان جاوا راهکار‌ها و کنترل‌های بسیار کارایی برای مقابله با این حملات وجود دارد که شما باید در هنگام نوشتن نرم افزار خود از آن استفاده کنید. + +این \href {"https://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-using-prepared-callable-statement"}{\textcolor{blue}{\underline{لینک}}} +راهکار عملی رفع این آسیب پذیری را در زبان جاوا نشان می‌دهد. اما پیش از آن بهتر است در مورد این آسیب پذیری \href {https://www.w3schools.com/sql/sql_injection.asp}{\textcolor{blue}{\underline{مطالعه}}} داشته باشد. + + + +\subsection*{{\lr{\titr Broken Authentication}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Authentication Broken}} +هدف اولیه و اصلی حمله کننده (attacker) به سرور، این است که بدون داشتن اطلاعات صحیح (مثلا یوزر و پسورد)، خودش را به جای شخص دیگری جا بزند یا به عبارتی وانمود کند که شخص دیگری است. برای این دسته از کارها او باید احراز هویت سرور (authentication)‌را دور بزند. برای این کار می‌تواند از روش‌های مختلفی استفاده کند یا در واقع احراز هویت شما ممکن است به اشکال مختلفی فریب بخورد. + +اشکال مختلف این حمله و همچنین راه‌های جلوگیری از آن‌ها در این \href{https://hdivsecurity.com/owasp-broken-authentication}{\textcolor{blue}{\underline{لینک}}} قابل مشاهده است. + + + + +\subsection*{{\lr{\titr Sensitive Data Exposure}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Exposure Data Sensitive}} +برنامه شما اطلاعاتی از کاربران مختلف دارد. این اطلاعات همواره باید محرمانه باقی بمانند.(confidentiality) مثلا در این پروژه، یک خریدار عادی نباید بتواند اطلاعات کاربری مدیر فروشگاه را بفهمد. یا بعنوان مثال دیگر وقتی خریدار وارد اکانت خود می‌شود،‌ نباید اطلاعات مربوط به یوزر و پسورد و یا هرنوع اطلاعات دیگری از او، توسط شخصی که صرفا پیام‌های رد و بدل شده را شنود می‌کند، قابل دیدن و شناسایی باشد. + +مثلا به‌عنوان مثال برای اینکه پیام‌های رد و بدل شده شنود نشوند می‌توان از رمزنگاری استفاده کرد. رمزنگاری از رایج‌ترین کنترل‌ها برای حفظ محرمانگی پیام‌های در حال انتقال و همچنین پیام‌های ذخیره شده در حافظه است. + +\subsection*{{\lr{\titr Brute force attack}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Attack force Brute}} +در صورتی که کاربری قصد داشته باشد برای دور زدن یک فرم در نرم افزار شما (به طور مثال یک فرم ورود به حساب کاربری) تعداد زیادی تلاش ناموفق می‌کند و سعی می‌کند با حدس زدن، ورودی درست را پیدا کند. این کار می‌تواند هم به مانند آسیب پذیری DoS عمل کند و هم می‌تواند باعث به مخاطره افتادن اطلاعات حیاتی نظیر رمز کاربران شود. + +\bigskip + +ساده‌ترین روش کنترل قرار دادن یک شمارنده برای تعداد تلاش‌های ناموفق هر IP است ، به طور مثال اگر یک IP در کمتر از 10 ثانیه بیش از 5 (با توجه به نوع برنامه و سرویس شما این عدد متفاوت است) درخواست اشتباه برای سرور فرستاد، باید آن IP توسط سرور در لیست سیاه موقت قرار گیرد و اجازه اتصال به آن به صورت موفق داده نشود. + +\subsection*{{\lr{\titr Broken Access Control}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Control Access Broken}} +کنترل دسترسی یا \lr{access control} بخشی از سیستم است که مشخص می‌کند چه کسی چه اجازه‌ای دارد. مثلا در این پروژه، مدیر فروشگاه یکسری دسترسی‌هایی دارد که خریدار عادی ندارد. این دسترسی‌ها باید کنترل شوند. +\bigskip +مثلا در سیستم عامل شما، ممکن است کاربران (user)‌ متفاوتی وجود داشته باشند و یک کاربر به فایل‌های کاربر دیگر دسترسی نداشته باشه و یا مثلا فقط اجازه خواندن از آن‌ها را داشته باشد (و نه نوشتن). کنترل کردن و هندل کردن این دسترسی‌ها و اجازه دادن به یک شخص (‌subject‌) که از یک منبع (‌object‌) استفاده کند،‌ توسط \lr{access control} انجام‌می شود. + +حال اگر بتوان به راحتی کنترل دسترسی را دور زد و مثلا یک خریدار بتواند خودش را به جای مدیر فروشگاه جا بزند، این یک آسیب پذیری محسوب می‌شود و امنیت را نقض می‌کند. + + +\subsection*{{\lr{\titr Remote Code Execution}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Execution Code Remote}} +از جمله آسیب پذیری‌های یک سیستم (‌بطور خاص یک سرور)، این است که کلاینت (هر کسی که به‌عنوان کاربر برای آن سرور محسوب می‌شود) بتواند کدی مخرب را بر روی آن بفرستد و اجرا کند. نام دیگر آن \lr{code injection} نیز هست. + + + +به این کار exploit کردن نیز گفته می‌شود و روش‌های بسیار متنوعی دارد. برای مطالعه بیشتر به این \href{https://owasp.org/www-community/attacks/Code_Injection}{\textcolor{blue}{\underline{لینک}}} مراجعه کنید. البته این حمله و فهمیدن مثال‌‌های آن نیاز به یکسری پیش زمینه‌هایی دارد که بهترین کار برای افراد علاقه مند جست و جو کردن و رفتن به سمت این مباحث است. + + + +\subsection*{{\lr{\titr Man In The Middle}}} +\addcontentsline{toc}{subsection}{{\fehrestContent Middle The In Man}} +این حمله، حمله بسیار معروفی است که متوجه بسیاری از ارتباطات (‌communication) است. مثل فرض کنید محسن۱ و محسن۲ می‌خواهند از طریق شبکه با هم صحبت کنند (شبکه را صرفا یک سری کابل در نظر بگیرید که پیام را از یک فرد گرفته و به دیگری می‌رساند). همچنین فرض کنید در این شبکه (یه مشت کابل)‌ یک نفر سومی به اسم صابر، یک کابل را قطع می‌‌کند و خودش بین این دو سرِ کابل می‌نشیند. + +\bigskip + +حال محسن۱ می‌خواهد به محسن۲ سلام بگوید. محسن۱ پیام را روی کابل می‌فرستد (نزدیکترین کابل به خودش) و این پیام به راهش ادامه می‌دهد تا این که به کابل قطع شده (صابر)‌می‌رسد، صابر که آدم ناجوری است(!!) این پیام را از یک سرِ کابل قطع شده گرفته، آن را به یک فحش تبدیل می‌کند و آن پیام را برروی آن یکی سرِ کابل قطع شده به سمت محسن۲ می‌فرستد. + +همان طور که دیدید، در واقع صابر پیام خودش را به جای پیام محسن۱ به محسن۲ می‌رساند و بالعکس. + +\bigskip +این حمله در تصویر زیر نیز نشان داده شده است و مسلما خطرات زیادی دارد. + +\begin{figure} + \includegraphics[width=\linewidth]{images/man-in-the-middle.png} +\end{figure} +\bigskip + +برای مطالعه بیش‌تر و دقیق‌تر در مورد این نوع حمله به این \href{https://www.imperva.com/learn/application-security/man-in-the-middle-attack-mitm/}{\textcolor{blue}{\underline{لینک}}} + و این \href{https://en.wikipedia.org/wiki/Man-in-the-middle_attack}{\textcolor{blue}{\underline{لینک}}} مراجعه کنید. + + + + + +\subsection*{{\lr{\titr Denial of Service (DoS)}}} +طبیعی است که هر نرم افزاری با کاربر خود در ارتباط است و تعدادی پیام با سرور جابجا می‌شود، اما گاهی فرد خرابکار سعی می‌کند با استفاده از یک کد تعداد بسیار زیادی درخواست به سرور شما در مدت زمان کم ارسال کند و با توجه به محدود بودن نرخ پذیرش پیام توسط سرور‌، باعث مختل شدن کل سرور و از کار افتادن سرویس شما می‌شود، پس شما باید با روش‌های هوشمندانه جلوی این رفتارهای خرابکارانه را بگیرید. +\bigskip + +ساده ترین روش کنترل قرار دادن یک شمارنده برای هر IP است ، به طور مثال اگر یک IP در کمتر از 10 ثانیه بیش از 100 (با توجه به نوع برنامه و سرویس شما این عدد متفاوت است) درخواست برای سرور فرستاد، باید آن IP توسط سرور در لیست سیاه قرار گیرد و اجازه اتصال به آن داده نشود. (در صورتی که فرد خرابکار از تعداد زیادی IP برای حمله به سرویس شما استفاده کند این راهکار شکست می‌خورد، به آن نوع از حملات انکار، \lr{Distributed Denial of Service} یا DDoS می‌گویند.) + +\section*{{\titr پس پروژه چی شد این وسط؟؟}} +\addcontentsline{toc}{section}{{\fehrestContent پس پروژه چی شد این وسط؟؟}} +آسیب پذیری‌هایی که می‌توانید در پروژه‌تان جلویش را بگیرید و برای نمره‌ی امتیازی چک می‌شوند (در واقع چک کردنشون سخت نیست!‌)، فقط موارد ستاره دار در لیست بالا هستند. (‌البته ممکن است موارد دیگری هم در داک مربوط به امتیازات اضافه شود.) + +\begin{itemize} +\item +برای بررسی کردن و نمره دادن به این بخش، از شما یک \textcolor{red}{مستند} (یا در کل یک گزارش مکتوب) از کارهایی که برای رفع این آسیب پذیری‌ها و حملات انجام دادید، خواسته می‌‌شود. این که مستند چطور نوشته شود خیلی اهمیت ندارد اما باید هر کاری که برای جلوگیری از حمله مد نظر انجام دادید را قید کنید و مواردی که نوشته باشید، چک خواهند شد. +\item +همچنین نیازی نیست جلوی همه‌ی حملات ستاره دار را بگیرید‌،‌ هر حمله نمره خاص خود را خواهد داشت. +\end{itemize} + + +\section*{{\titr سایر منابع}} +\addcontentsline{toc}{section}{{\fehrestContent سایر منابع}} + +برای مشاهده آخرین آسیب پذیری‌های ثبت شده، هرگونه اطلاعات آماری و آسیب پذیری‌های مربوط به یک محصول یا شرکت خاص دیتابیس‌هایی موجود هستند و این آسیب پذیری‌ها را ثبت می‌کنند و به آن‌ها شناسنامه می‌دهند. از جمله معروف‌ترین‌ها CVE است. + +\begin{flushleft} +\href{https://www.cvedetails.com}{\textcolor{blue}{\underline{\lr{https://www.cvedetails.com}}}} +\end{flushleft} +\bigskip + +همچنین بنیادی تحت عنوان \lr{Open Web Application Security Project} یا OWASP با هدف بهبود امنیت نرم افزار وجود دارد و مثلا پروژه‌ای تحت عنوان \lr{OWASP Top 10 Web Application Security Risks} وجود دارد که هر ساله لیستی از رایج‌ترین ریسک‌ها در زمینه برنامه‌های تحت وب ارائه می‌دهد. ( و بطور مشابه پروژه‌ای برای موبایل و … ) + +\begin{flushleft} +\href{https://owasp.org/www-project-top-ten}{\textcolor{blue}{\underline{\lr{https://owasp.org/www-project-top-ten}}}} +\end{flushleft} + +\bigskip +هم چنین مسابقاتی تحت عنوان CTF یا \lr{Capture The Flag} برگزار می‌شوند که چالش‌هایی برای شرکت کنندگان دارند. خوب است در این زمینه هم جست و جویی داشته باشید. این رویداد امسال از طرف دانشکده خودمان هم انجام شد: + +\begin{flushleft} +\href{https://susec.tf}{\textcolor{blue}{\underline{\lr{https://susec.tf}}}} +\end{flushleft} + + + + + +\newpage + + + +\end{document} + + + + + + + diff --git a/phase_3/security/sharif.png b/phase_3/security/sharif.png new file mode 100644 index 0000000..ffebcd7 Binary files /dev/null and b/phase_3/security/sharif.png differ diff --git a/phase_3/security/sharif1.png b/phase_3/security/sharif1.png new file mode 100644 index 0000000..43413c8 Binary files /dev/null and b/phase_3/security/sharif1.png differ diff --git a/phase_3/security/tex.bib b/phase_3/security/tex.bib new file mode 100644 index 0000000..0f0b879 --- /dev/null +++ b/phase_3/security/tex.bib @@ -0,0 +1,20 @@ +@Manual{tikzpgf2.10, + title = {TikZ \& PGF, Manual for Version 2.10}, + author = {Till Tantau}, + year = 2007, + url = {http://sourceforge.net/projects/pgf} +} + +@book{texbook, + author = "Donald E. Knuth", + title = "The {TeX}book", + publisher = "Addison-Wesley", + year = 1996, +} + +@Manual{tikzpgf3.0.0, + title = {TikZ \& PGF, Manual for Version 3.0.0}, + author = {Till Tantau}, + year = 2013, + url = {http://sourceforge.net/projects/pgf} +}