سلام دوستان وقتتون بخیر باشه.
قصد پیاده سازی یه برنامه تحت وب برای مدیریت پروژه داشتم. من برای مدلسازی یکم گیچ شدم، گفتم این موضوع رو به اشتراک بزارم و از تجربیات و پیشنهادات شما استفاده کنم.
در برنامه ما 3 نقش کاربری با دسترسی متفاوت وجود داره
1- مدیر پروژه
2- کارمند ارشد
3- کارمند عادی
مدیرپروژه قابلیت تعریف کارمند ارشد و کارمندهای عادی داره و میتونه تسک های اونارو مدیریت کنه.
و کارمند ارشد هم فقط به کاربران عادی دسترسی داره و قابلیت تعریف تسک برای اون ها داره.
چالشی که وجود داره
فرض کنید یک کاربر در پروژه x مدیر هست و در پروژه دیگه یعنی y کاربر عادی هست. این چالش باعث شده پیاده سازی سطح دسترسی یکم برای من مبهم به وجود بیاد و گیج بشم.
من این دسترسی ها رو چطور به وجود بیارم و مدیریت کنم؟
آیا باید برای هر سه سطح دسترسی سه تا پنل متفاوت تعریف کنم یا پنل مدیریت را بر اساس هر پروژه جدا کنم.
ایده خودم این هست که وقتی لاگین شد بپرسه قصد داره به کدوم پروژه وارد بشه.
بعد که وارد اون پروژه شد دسترسی اون پروژه رو بگیره و فیلترهارو اونجا پیاده بشه.
یعنی بگم کاربر جاری پروژه ایکس رو انتخاب کرده.
داشبورد و سطح دسترسی ها رو بر اساس اون فیلتر کن.
در واقع شما در دیتابیستون یک جدول projects دارید برای ذخیره سازی اطلاعات پروژه هاتون و بعد یک جدول project_members دارید برای ذخیره سازی کاربران پروژه هاتون که به این صورته که سه تا فیلد کلیدی داره یکی user_id یعنی مربوط به کدوم user هست و یکی project_id که مربوط به کدوم پروژه هست و یکی role که نقش کاربر رو مشخص میکنید و مسلما یک جدول users دارید برای اطلاعات کاربر هاتون این میشه یک الگوی کلی برای طراحی دیتابیستون بهتون پیشنهاد میکنم اول از همه روی طراحی دیتابیستون وقت بزارید حالا برای مدیریت سطح دسترسی شما میاید چک میکنید که کاربری که میخواد وارد این پروژه هست آیا اصلا عضو این پروژه هست؟ که خب خیلی سادست یک کوئری select میزنید در جدول project_members که آیا رکوردی با user_id = آیدی کاربرتون و بعد project_id = آیدی پروژتون وجود داره اگر وجود داشته باشه یعنی کاربر عضو هست در غیر اینصورت خیر حالا بعدش چک میکنید که role کاربر چی هست و طبق نقش کاربریش بهش دسترسی میدید حالا فرض کنیم کاربر چند تا پروژه داره که ممکن تو یکیش مدیر باشه تو یکیش کارمند عادی و تو یکیش کارمند ارشد اینو چطوری هندل کنیم؟ خیلی ساده براش یک بخش به نام پروژه های من ایجاد میکنیم و تمام پروژه هاشو اونجا میزاریم چطوری پروژه هاشو پیدا کنیم خیلی ساده یک کوئری select توی جدول project_members میزنیم و میگیم هر رکوردی که user id = آیدی کاربر باشه رو به من بده و تمامی اون رکورد ها میشه پروژه های کاربر حالا کاربر به عنوان مثال میخواد وارد پروژه شماره 1 بشه خب وقتی وارد شد قبل از این که پنل رو بهش نشون بدیم میایم role اون رو مورد بررسی قرار میدیم اگر مدیر بود بهش پنل مدیر رو نشون میدیم اگر کارمند عادی پنل کارمند عادی و اگر هم کارمند ارشد بود بهش پنل کارمند ارشد رو نشون بدیم و نکته اینجاست که ما باید سه پنل مختلف برای سه نقش کاربری مختلف ایجاد کنیم و بعد کاربر خواست وارد هر پروژه ای بشه اول نقش کاربریش رو چک میکنیم و متناسب با نقش کاربریش بهش پنل مربوطه رو نشون میدیم
این فقط نظر من هست شما تصمیم گیرنده ای
سلام و احترام.
کمی فشار ذهنی داشتم، بابتِ عدم تمرکز عذر میخوام.
درکل باید جزئیات پروژه رو بررسی کرد، گاهی بعضی چیزها با کوئری هندل میشه، گاهی با پرمیژندهی.
آخرین پروژهای که درگیرش بودم و امشب هم به اتمام رسید، بخش عظیمیش در همین باره بود.
پروژه، یه سیستم مدیریت کارکنان شرکت بود.هرشرکتی کارمند داره، بخشهای مختلف داره، مدیر بخش، مدیرعامل و ... داره. دسترسیها همگی متفاوت هستند.
من پنل جداگونهای رو قرار ندادم، چیزی که به نظرم درستتر اومد، این بود که یه تیبل role ساختم و یه تیبل users و پرمیژندهی رو اگر اشتباه نکرده باشم به صورت morph پیادهسازی کردم.
برای هندل کردن سطوح دسترسی، پرمیژنهایی رو ایجاد کردم و به اونها یه کلید یونیک دادم.
مثلا اکشنِ ایجادِ تسک، دیلیتِ کاربر، اتچ کردنه یک پروژه یا تسک به سایرین. نمایش داده شدنِ یک صفحهی خاص.
از سمت دیگه توی پنل مدیریت بخشی رو به وجود آوردم که لیست نقشها وجود داشت و جلوشون گزینهای برای اعمال سطح دسترسی گذاشتم.
تنها مدیر شرکت به این قسمت دسترسی داره و میتونه رولها رو ببینه. گفتم که روی هر رول، یه گزینه گذاشتم که با زدنِ روش، یه مُدال که حاوی کل پرمیژنهای ایجادی هست نمایش داده میشه. مثلا اگر روی مدیر کل کلیک کرده باشه، میتونه از بینِ کل پرمیژنها یکییکی تیک بزنه و بگه مثلا همچین رولی، فلان و فلان پرمیژن رو داشته باشه. حالا هر یوزر که اون رول رو به خودش بگیره، میتونه این دسترسیها رو داشته باشه.
از سمتِ دیگهی ماجرا، توی نمایشِ هر صفحه، توی نمایشِ هر آیکون، هر دکمه، ایجادِ هر اکشن، باید چک بشه که آیا یوزری که لاگینه، سطح دسترسیش در حدی هست که بتونه به صفحهی فلان دسترسی داشته باشه؟ آیا میتونه توی صفحهی تسکها آیکونِ دیلیت تسک رو مشاهده کنه؟
این مدلی هرکس که لاگین بشع، تنها چیزی که باید رو میبینه...
البته، صفر تا صَدِ پرمیژندهی رو از صفر نوشتم خودم و نمیشه ساده هم این کار رو کرد.
منتهی خواستم روش خودم رو توضیح داده باشم که شاید تبادل ایده بشه. که شاید بهتون توی پیاده سازی کمک بشه.
درکل جداگونه چیزیرو ایجاد نکنید، یک چیز واحد ایجاد کنید و سطوح دسترسی رو مدیریت کنید. البته هم که پروژه تا پروژه فرق داره.
موفق باشی به هرحال
در واقع شما در دیتابیستون یک جدول projects دارید برای ذخیره سازی اطلاعات پروژه هاتون و بعد یک جدول project_members دارید برای ذخیره سازی کاربران پروژه هاتون که به این صورته که سه تا فیلد کلیدی داره یکی user_id یعنی مربوط به کدوم user هست و یکی project_id که مربوط به کدوم پروژه هست و یکی role که نقش کاربر رو مشخص میکنید و مسلما یک جدول users دارید برای اطلاعات کاربر هاتون این میشه یک الگوی کلی برای طراحی دیتابیستون بهتون پیشنهاد میکنم اول از همه روی طراحی دیتابیستون وقت بزارید حالا برای مدیریت سطح دسترسی شما میاید چک میکنید که کاربری که میخواد وارد این پروژه هست آیا اصلا عضو این پروژه هست؟ که خب خیلی سادست یک کوئری select میزنید در جدول project_members که آیا رکوردی با user_id = آیدی کاربرتون و بعد project_id = آیدی پروژتون وجود داره اگر وجود داشته باشه یعنی کاربر عضو هست در غیر اینصورت خیر حالا بعدش چک میکنید که role کاربر چی هست و طبق نقش کاربریش بهش دسترسی میدید حالا فرض کنیم کاربر چند تا پروژه داره که ممکن تو یکیش مدیر باشه تو یکیش کارمند عادی و تو یکیش کارمند ارشد اینو چطوری هندل کنیم؟ خیلی ساده براش یک بخش به نام پروژه های من ایجاد میکنیم و تمام پروژه هاشو اونجا میزاریم چطوری پروژه هاشو پیدا کنیم خیلی ساده یک کوئری select توی جدول project_members میزنیم و میگیم هر رکوردی که user id = آیدی کاربر باشه رو به من بده و تمامی اون رکورد ها میشه پروژه های کاربر حالا کاربر به عنوان مثال میخواد وارد پروژه شماره 1 بشه خب وقتی وارد شد قبل از این که پنل رو بهش نشون بدیم میایم role اون رو مورد بررسی قرار میدیم اگر مدیر بود بهش پنل مدیر رو نشون میدیم اگر کارمند عادی پنل کارمند عادی و اگر هم کارمند ارشد بود بهش پنل کارمند ارشد رو نشون بدیم و نکته اینجاست که ما باید سه پنل مختلف برای سه نقش کاربری مختلف ایجاد کنیم و بعد کاربر خواست وارد هر پروژه ای بشه اول نقش کاربریش رو چک میکنیم و متناسب با نقش کاربریش بهش پنل مربوطه رو نشون میدیم
این فقط نظر من هست شما تصمیم گیرنده ای
@arshia.moharrary
@mjokarr
سپاس از دوستان بزرگوار بابت پاسخگویی
ممنونم که تجربیاتتون رو برام به اشتراک گذاشتید.
@abolfazlzarei
درود آقای زارعی
برای بحث بک با جنگو پیاده سازی شده.
و سمت فرانت هم ویو جی اس.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟