PDA

View Full Version : پیاده سازی درجه های مختلف برای کاربران (Multi Level)



Mousavmousab
شنبه 17 آبان 1393, 22:46 عصر
سلام

من فارسیشو نمی دونم چی بنویسم ولی انگلیسیش این میشه :Multi Level User implementation

برای جدول User ها در وبسایتم می خوام کاربران را دسته بندی کنم.

1-) مدیر کل سایت
2-) مدیر بخش
3-)کاربران خاص
4-)کاربران معمولی
...


اگر من 2 تا table داشته باشم یکی master و دیگری Detail و در Detail به ازای تمام این مدیر ها یک Record و ID این رکود را را در جدول Master به کار ببرم مشکلم توی دیتابیس حل میشه
ولی توی برنامه نویسی مشکل برام پیش می آد و نمیشه اونو Handle کرد.

( ساده بگم الان اینجا یک یعنی مدیر کل سایت و 2 یعنی مدیر بخش ، شاید این اعداد عوض بشه من چطوری باید متوجه بشم؟)
مشکل اینجاست که : وقتی من می خوام این Level ها را به یک مدیر اختصاص بدم تا در موقع لذوم یک کاربر عادی را تبدیل به کاربر خاص کند ، ناچار یا ناخواسته چون Admin یا مدیر کل سایت در این جدول است در اختیار مدیر قرار میگیره و من نمی خوام این آیتم (یعنی مدیر کل سایت مثلاٌ در Combobox نمایش داده شود.)



نمی دونم متوجه من شدیدی یا نه ؟

ولی اگه جایی را متوجه نشدین بگین من بیشتر توضیح بدم.

rambod18
شنبه 17 آبان 1393, 22:53 عصر
شاید من خو متوجه نشذه باشم
شما توی query یک شرط بذارید که افرادی رو بیاره که سطح دسترسی اونها مدیریت کل نیست

Mousavmousab
سه شنبه 20 آبان 1393, 09:44 صبح
125523


ایندفعه دیگه حرفمو به صورت بصری نشون دادم.

دوست عزیز شرطی که شما گفتی اینطوریه :

where userlevel.id !=1


این طوری جواب میده ولی درست و اصولی نیست. چون الان مدیر برابر 1 است. ممکنه این اطلاعات به هر نحوی پاک بشه و بعداٌ تغییر پیدا کنه و مثلاٌ مدیر به 201
اون موقع چی؟ مدلی که شما گفتین Static است و منعطف نیست.


دوستان کسی راه حل دیگه ای نداره ؟

fatemesoleimani
سه شنبه 20 آبان 1393, 10:28 صبح
نمیشه یه فیلد دیگه به نام flag تعریف کنی و مقدار flag را برای مدیر true و برای بقیه false بزاری بعد اینطوری تو کوئری حتی اگه مقدار مدیر عوض شه باز می تونی select کنی

Mousavmousab
سه شنبه 20 آبان 1393, 13:25 عصر
نمیشه یه فیلد دیگه به نام flag تعریف کنی و مقدار flag را برای مدیر true و برای بقیه false بزاری بعد اینطوری تو کوئری حتی اگه مقدار مدیر عوض شه باز می تونی select کنی



اینم میشه ولی 2 تا مشکل داره

اولین مشکل :

افزونگی: فکرشو بکن ، اگر 100 هزار کاربر داشته باشم ، همه ی رکورد ها باید یک مقدار False (به معنی اینکه مدیر نیست) داره الکی ثبت میشه و تنها یکی (True) است و باعث افزایش اطلاعات میشه.

مشکل دوم :من اگر 5 سطح داشته باشم باید برای هر سطح یک فیلد تو جدول User داشته باشم. و اگر در آینده وقتی پروژه رو سروی آپ شد و چند ماه بعد خواستم یک سطح دیگه اضافه کنم. باید با Tsql بنویسم تا یک Column با Field دیگه اضافه بشه که این راه درستی نیست.


شما تو پروژه هاتون چطوری این مشکل را حل می کنید ؟

fatemesoleimani
سه شنبه 20 آبان 1393, 15:59 عصر
برنامه تحت وب که تو دلفی انجام داده بودم که برای هر کاربر یه پنل داشت مثلا تو مدرسه یه پنل برای دانش اموز و یه پنل برای معلم و...و توی کد با یک کوئری به پنل خود هدایت

می شدند اما تحت ویندوز من خودم هنوز یه پروژه بزرگ پیاده سازی نکردم ولی تو پروژه های انجام شده یه جا دیده بودم فکر کنم مشکل افزونگی داشتن و از همین روش فلگ استفاده

کرده بودن

fatemesoleimani
چهارشنبه 21 آبان 1393, 15:28 عصر
این هم یه روش که یه نقش تعریف کردن که هر بخش به چه تعداد از فرم ها میتونه دسترسی داشته باشه بعد تو تعریف کارکنان شرکت نوع نقش را تعیین می کنیم

saeed410
چهارشنبه 21 آبان 1393, 20:46 عصر
سلام. خب واسه اینکه فلگ هم استفاده نکنی بهتره یا با فایل کار کنی و ID کاربران سطح یک رو داخلش بریزی.یا اینکه جدول جدا ایجاد کنی و ID کاربران مدیر رو انجا بزاری. واسه select کردن هم میخایی مدیرا رو نشون نده inner join میکنی جاهایی که id جدول کاربرا با id جدول مدیرا برابر نیست.

Mousavmousab
جمعه 23 آبان 1393, 23:09 عصر
سلام. خب واسه اینکه فلگ هم استفاده نکنی بهتره یا با فایل کار کنی و ID کاربران سطح یک رو داخلش بریزی.یا اینکه جدول جدا ایجاد کنی و ID کاربران مدیر رو انجا بزاری. واسه select کردن هم میخایی مدیرا رو نشون نده inner join میکنی جاهایی که id جدول کاربرا با id جدول مدیرا برابر نیست.


مطمئناٌ توضیحانی که بالا دادم رو نخوندی یا متوجه نشدی !!!

روش کار با فایل هم منحله

saeed410
شنبه 24 آبان 1393, 23:55 عصر
متوجه نشدم. چرا باید تغییر بکنه؟ فقط در صورت پاک شدن تغییر میکنه. که در این صورت باید فیلدهای detail مربوط به ID اصلی هم پاک بشن.منظورم اینه وقتی شما میتونی از relation استفاده کنی و خاصیت های action مربوط به Delete و Update رو cascade انتخاب کنی. در این صورت اگر primary key حذف شد که کلیه اطلاعات مربوط به اون از جدول foreign key حذف میشن. و درست و اصولیشم همینه. یعنی وقتی در جدول نقش هات نقشی با مثلاً ID = 500 وجود نداره.هیچ دلیلی وجود نداره که در لیست تخصیص نقش ها به یک کاربر ID=500 رو به عنوان نقش بدی. اما هنگام update هم اگر primary key رو آپدیت کنی و تغییر بدی چون cascade انجام میشه اگر تو primary شما id=500 رو تبدیل به id=24345323 بکنی تو foreign هم همین اتفاق میفته. جواب سوالت.کاملاً اصولی.

saeed410
یک شنبه 25 آبان 1393, 00:00 صبح
این مدل داینامیکه اگه قواعد و اصول پایگاه داده رعایت بشه.

Mousavmousab
یک شنبه 25 آبان 1393, 18:29 عصر
دوست عزیز من تشکر را برات زدم چون تلاش کردی کمکم کنی ولی جواب سوال من نیست.

من میگم id=1 یعنی هر کاربری آیدیش 1 هست بعنی مدیر بخش. این ID به صورت اتوماتیک زده میشه. تا اینجا قبول ؟

من توی کد سی شارپ میگم
اگر ID=1 بود یعنی طرف مدیر است. من صد جای پروژه ام توی سی شارپ نوشتم اگر ID=1 بود ، فلان کارو بکن. حالا این ID حذف بشه ، (به هر دلیلی) فرض کن اصلاٌ برنامه داده وارد نشده و در جدول های دیگه هنوز داده بر این اساس وارد نشده باشه و من دستی میام یک رکورد ( که همین رکورد شماره یک مربوط به مدیر باشه را پاک می کنم) و دوباره می سازم و ID جدیدش میشه 10 و کل برنامه را باید عوض کنم و تو تمام if ها باید یک را تبدیل به 10 کنم ( دستی)

میگم این ساختار غلطه شما ساختار دیگه ای بلدین ؟ راهنمایی لطفاٌ.
خواهشا یه زحمت بکشین با شکل دقیق توضیح بدین و فقط حرف نزنین. ( ممنون)

sara147
دوشنبه 26 آبان 1393, 12:08 عصر
دوست عزیز من تشکر را برات زدم چون تلاش کردی کمکم کنی ولی جواب سوال من نیست.

من میگم id=1 یعنی هر کاربری آیدیش 1 هست بعنی مدیر بخش. این ID به صورت اتوماتیک زده میشه. تا اینجا قبول ؟

من توی کد سی شارپ میگم
اگر ID=1 بود یعنی طرف مدیر است. من صد جای پروژه ام توی سی شارپ نوشتم اگر ID=1 بود ، فلان کارو بکن. حالا این ID حذف بشه ، (به هر دلیلی) فرض کن اصلاٌ برنامه داده وارد نشده و در جدول های دیگه هنوز داده بر این اساس وارد نشده باشه و من دستی میام یک رکورد ( که همین رکورد شماره یک مربوط به مدیر باشه را پاک می کنم) و دوباره می سازم و ID جدیدش میشه 10 و کل برنامه را باید عوض کنم و تو تمام if ها باید یک را تبدیل به 10 کنم ( دستی)

میگم این ساختار غلطه شما ساختار دیگه ای بلدین ؟ راهنمایی لطفاٌ.
خواهشا یه زحمت بکشین با شکل دقیق توضیح بدین و فقط حرف نزنین. ( ممنون)

به نظر میاد شما در زمینه پایگاه داده مبتدی باشید!

saeed410
سه شنبه 27 آبان 1393, 18:28 عصر
فرآیند توسعه نرم افزار شامل تجزیه تحلیل طراحی کد نویسی تست و آزمایش و اعتبارسنجی و استقرار است. قبل از مرحله کد نویسی باید شما یک مدل stable از طراحی خودتون داشته باشید. اگر فکر میکنید بلافاصله بعد از اولین نسخه از اپلیکشنتون باید تغییرات ساختاری اساسی رو نرم افزارتون بدید به این معناست که تحلیل شما اشتباه بوده. در مورد اینکه شما تو کدهاتون ID نقش ها رو میخوایید استفاده کنید هم این یک روش کاملاً غیر اصولی و ایستاست. در توضیحات بالا ، اکثر دوستان توضیح دادند که باید چکار کنید. برای تمام قسمتهایی که نیاز به احراز هویت دارند باید شما در پایگاه دادتون شناسه نقش هایی که مجاز به خواندن نوشتن دیدن هستند رو داشته باشی. نگران یکی دو فیلد افزونگی نباش. زمانی که یک صفحه رو لود میکنی قبل از هر چیز چک میکنی کاربر داخل کدوم نقش بعد جدول permission ها رو نگاه میکنی ؛ و بر اساس مقادیر مختلف در این جدول برای قسمت های مختلف میتونی visibility یا availability یا enabling رو مشخص کنی. مثلاً اگر کاربری حق دیدن نوشتن خواندن یک دکمه رو نداشته باشه واسه دکمه visible=false و enable=false رو میزاری. و .....

saeed410
سه شنبه 27 آبان 1393, 18:30 عصر
میدونم الان میپرسی اگر یک نقش رو حذف کردیم چی. خب نقش رو وقتی حذف کردی باید تمام اطلاعات مربوط به تخصیص در جدولهای وابسته حذف بشه.

Mousavmousab
شنبه 01 آذر 1393, 12:34 عصر
به نظر میاد شما در زمینه پایگاه داده مبتدی باشید!


سابقه هر فرد مشخص میکنه مبتدی هست یا نه ! ( مگه می خوای منو استخدام کنی؟)

مشکل شما اینه که فکر می کنید خیلی حالیتونه !

خدا نکنه یه روزی استاد جایی بشین. همه را نادون می دونید و خودتونو دانا ! ( همینه که وضع موجود دانشگاه ها این طوریه دیگه)

شما مثل یکی از اساتید قدیمیم تو دانشگاه هستی که می گفت Access بیست سال پیش 10 میلون رکورد توش ثبت می کردم و آخ نمی گفت ! و ما به صرف اینکه در حکم شاگردی بودیم باید نشنیده می گرفتیم.

برو بگو بزرگترت بیاد.


Action , Reaction

saeed410
یک شنبه 02 آذر 1393, 01:05 صبح
بیخیال. باهم خوب باشین بحث نکنین.

Mousavmousab
یک شنبه 02 آذر 1393, 19:38 عصر
بیخیال. باهم خوب باشین بحث نکنین.

قبل از برنامه نویسی باید چیز دیگری یاد گرفت.