سامانه دانیال همراه
یکی از شرکت های معتبر واردات قعطات کامپیوتری (به نام دانیال همراه) هر ماه قطعاتی را از کشورهای مختلف وارد می کند. این شرکت اخیرا با مشکلات متعددی برای امور گارانتی خود مواجه شده است. روال گارانتی به این صورت است که الزاما بایستی شماره سریال قطعه مورد نظر توسط خریدار نهایی به شرکت اعلام شود. به همین دلیل شرکت برای هر دستگاه یک کارت گارانتی چاپ کرده که بر روی کارت شماره سریال قطعه و همچنین کد فعالسازی گارانتی چاپ شده است. کد فعالسازی به صورت مخفی و تحت یک scratch code
بر روی کارت چاپ می شود.
حال می خواهیم سیستمی با مشخصات زیر برای ارائه کدهای گارانتی به مشتریان شرکت پیاده سازی کنیم.
پروژه اولیه
فایل های پروژه اولیه را می توانید از اینجا دانلود کنید. این پروژه بر اساس کتابخانه لاراول نسخه 5.8.*
پیاده سازی خواهد شد.
فایل هایی که اضافه بر ساختار معمول پروژه های لاراول در اختیار شما قرار شده است عبارتند از :
-
فایل
input.xlsx
که در مسیرstorage/app/input.xlsx
قرار داده شده است. این فایل از طرف شرکت به ما داده می شود و شامل دو ستون است. ستون اول یاA
کد یکتای شناسایی محصولات (شبیه به شماره سریال) بوده و ستون دوم کد فعالسازی است که شرکت به صورت تصادفی برای هر قطعه مشخص کرده. -
فایل
CValidator.php
که در مسیرapp/CValidator.php
قرار داده شده است و شامل تابع اعبتارسنجی کد ملی است که برای قسمت اعتبارسنجی می توانید از آن استفاده کنید. -
فایل های مورد نیاز برای قسمت
Frontend
که در پوشه هایresource/views/home
وpublic/css
قرار داده اند تا نیازی به توسعهcss/html
از سمت شما به حداقل ممکن برسد.
لیست نیازمندی ها
-
با توجه با اینکه مدیریت شرکت نسبت به امنیت سامانه بسیار حساس است، مخالفت بسیار زیادی با این پروژه داشته است. لذا به ایشان اطمینان دادیم که امنیت سامانه به نحوی تامین شود که اگر حتی کل فایل ها و پایگاه داده برنامه مورد حمله واقع شد اطلاعات کد های فعالسازی دچار مشکل و دستبرد نشود. به همین دلیل امکان استفاده مستقیم از فایل اکسل ورودی را نداریم. بایستی یک دستور
Artisan
به نامGenerateFile
ایجاد کنید تا با فراخوانی این دستور یک فایلcsv
به این صورت ایجاد شود که هر سطر آن معادل یک سطر در فایل اکسل بوده با این تفاوت که فیلد شماره سریال ها (فیلد اول) به صورتhash
شده با الگوریتمsha1
ذخیره شود و فیلد دوم با استفاده از کلاسCrypto
لاراول رمز نگاری شود. در اینصورت حتی اگر کل اطلاعات در دسترس نفر دیگری قرار بگیرد بدون داشتن شماره سریال ها به صورتpalin text
نمی تواند از کدهای گارانتی استفاده کند. برای انجام این قسمت در نظر داشته باشید که فایلcsv
با نامdata.csv
در آدرسstorage/app/data.csv
باید ساخته شود و کاراکترdelimiter
حتما بایستی,
باشد اما خط ابتدای فایل که نامfield
ها در آن نوشته می شود مورد داوری قرار نمیگیرد و مختارید که از هر نامی استفاده کنید ولی وجود آن الزامی است. -
لیست
route
های مورد نیاز در فایلroutes/web.php
از قبل نوشته شده است. برنامه به صورت یک فرم ۳ مرحله ای بوده و در هر مرحله اطلاعات مورد نیاز دریافت و اعتبارسنجی (validate
) می شوند.-
در مرحله اول فیلدهای نام و نام خانوداگی صرفا خالی یا پر بودنشان ملاک بررسی است. هیچ شرط اضافه ای نخواهند داشت.
-
فیلد کد ملی علاوه بر شرط پر بودن باید با توجه به تابع موجود در فایل
CValidator
مورد بررسی قرار گرفته تا از اعتبار اولیه آن مطمئن شویم. -
منظور از فیلد کد گارانتی همان فیلد
serial_number
در فایل اکسل است که علاوه بر شرط پر بودن باید در لیست ارائه شده نیز موجود باشد. یعنی مقدار وارد شده توسط کاربر را بررسی خواهیم کرد که آیا در محتویات ستون اول فایل اکسل وجود دارد یا نه؟. ضمنا این فیلد بایستی از نظر تعداد کاراکتر ها (که ۲ کاراکتر عددی می باشد) نیز مورد بررسی قرار بگیرد -
در صورتیکه کلیه اطلاعات به درستی وارد شد، کاربر را به صفحه دوم منتقل میکنیم و قبل از آن دو کلید در
session
ست می کنیم. اول کلیدgid
که همان کد گارانتی است که کاربر به درستی وارد کرده و دوم کلیدcode
که محتوی کد موقتی است که برای اعتبار سنجی کاربر مورد استفاده قرار خواهد گرفت. -
کد موقت تولید شده قبلا از طریق پیامک به دست کاربر می رسید اما به دلیل شرایط مسابقه فعلا تصمیم گرفتیم که کد را مستقیما در مرحله دوم به کاربر نشان بدهیم.
-
با ارسال فرم در مرحله دوم اولا بررسی خواهیم کرد که کلید های
session
که در مرحله اول ست شده بودند همچنان وجود داشته و مقادیر آنها معتبر باشند (در صورت عدم وجود کلید ها بایستی کاربر به مرحله قبل منتقل شود) و دوما مقدارcode
که کاربر وارد میکند با کدی که در مرحله ۱ تولید شده است یکسان و همخوان باشد. ضمنا فیلدcode
بایستی از نظر تعداد کاراکتر ها (که ۶ کاراکتر عددی می باشد) نیز مورد بررسی قرار بگیرد -
در صورتیکه کد موقت به درستی وارد شود، کاربر را به مرحله سوم منتقل میکنیم و کد فعالسازی متناظر با کد گارانتی وارد شده را رمزگشایی کرده و به او نمایش میدهیم.
-
-
لطفا نکات زیر را برای داوری صحیح پاسخ هایتان در نظر داشته باشید :
-ملاک بررسی صحت اعتبارسنجی های انجام شده کلید
errors
درsession
می باشد که به صورت عادی توسط لاراول ست می شود. به بیان دیگر حتما سعی کنید از توابع و کلاس های موجود در لاراول برای اعتبارسنجی و تولید خطاهای احتمالی استفاده کنید تا کمترین میزان مغایرت با داوری را داشته باشید. به این منظور می توانید از قسمتValidation
کمک بگیرید.-پیغام های تولید شده در اعتبار سنجی ها کاملا باید مطابق لیست زیر باشد (واضح است که حتی ۱ کاراکتر اختلاف باعث رد شدن جواب خواهد شد) :
پر کردن فیلد نام اجباری می باشد پر کردن فیلد نام خانوادگی اجباری می باشد پر کردن فیلد کد ملی اجباری می باشد کد ملی وارد شده صحیح نمی باشد پر کردن فیلد کد گارانتی اجباری می باشد کد گارانتی وارد شده معتبر نمی باشد تعداد رقم های وارد شده برای کد گارانتی صحیح نمی باشد پر کردن فیلد کد موقت اجباری می باشد تعداد رقم های وارد شده برای کد موقت صحیح نمی باشد کد موقت وارد شده صحیح نمی باشد کد فعالسازی شما عبارت است از : 13
-
در نظر داشته باشید که در طول برنامه پس از تولید فایل
data.csv
فایل ورودی اکسل اولیه حذف خواهد شد و دیگر در دسترس نخواهد بود. لذا در ادامه بایستی همه چیز با استفاده از اطلاعات فایل تولید شده بررسی و ارائه شود. -
برای استخراج اطلاعات از فایل اکسل می توانید از کتابخانه های آماده استفاده کنید و فایل
composer.json
را همراه پاسخ خود آپلود کنید. -
در صفحات مختلف، نسبت به مرحله ای که فعال می باشد، بایستی وضعیت نمایش داده شده در بالای فرم (که مراحل را به صورت فعال و غیر فعال نمایش می دهد) صحیح باشد. مثلا در صفحه ای که آدرس آن
/step2
است باید مراحل ۱ و ۲ هردو فعال باشند (کلاسactive
به عنصرli
داده شود).
آنچه باید آپلود کنید
پوشه های زیر را در یک فایل فشرده با فرمت zip
آپلود کنید :
app
config
resources
routes
composer.json
تصحیح
- گویا فایل
input.xlsx
که در پروژه اولیه قرار داده شده با نرم افزار اکسل مشکل دارد و باز نمیشود. اول این که فایل از نظر محتوایی سالمه و با کدهای php میشه محتواش رو خوند و دوم اینکه میتونید همون فایل رو با google sheet باز کنید یا اینکه فایل جدید رو از این آدرس دانلود کنید و جایگزین کنید. - در مرحله دوم در صورتیکه همه چیز صحیح باشد، بایستی کد فعالسازی به صورت رمزگشایی شده در یک متغیر
session
با کلیدactivation_code
قرار بگیرد و کاربر به مرحله سوم منتقل شده و کد فعالسازی به کاربر نشان داده شود.
ارسال پاسخ برای این سؤال