PDA

View Full Version : آموزش: ایجاد سطح دسترسی برای فرم ها و کنترلها



ASKaffash
دوشنبه 12 خرداد 1393, 07:13 صبح
با سلام
من سعی می کنم در چند پست این موضوع را تشریح کنم :
ابتدا چند نکته که لازم است مد نظر قرار گیرد :
- هر فرم در دات نت می تواند برای سطوح دسترسی مورد هدف واقع شود و خاصیت نام فرم و یا خاصیت Tag یک مشخصه Uniq است که می تواند بعنوان کلید ارتباط باین فرم و بانک اطلاعاتی قرار گیرد
- چون نام فرم می تواند در آتی توسط برنامه نویس عوض شود یک راه مناسب استفاده از وراثت فرمها است (حرفه ای)
- برای دسترسی به اجزای یک فرم مشابه نام کنترل یا Tag نیز Uniq است و می تواند بعنوان کلید آیتم بین فرم و بانک اطلاعات مورد استفاده قرار گیرد
- در طراحی نرم افزارهای کاربردی برمبنای نام کاربری و رمز عبور عموما یک جدول کاربران با حداقل سه فیلد مورد نیاز است
- در طراحی حرفه ای تر چون یک کاربر یک شی از کلاس نقش ها می باشد بنابراین یک جدول بنام نقش ها نیز به مجموعه افزوده می شود
- خاصیت Tag در کلیه اشیا از جمله فرم و کنترل و ... می تواند بعنوان مشخصه دات نت و بانک اطلاعاتی مورد استفاده قرار گیرد

ASKaffash
دوشنبه 12 خرداد 1393, 07:36 صبح
با سلام
بخش دوم :
با توضیحان ارائه شده برای ساده تر شدن مسئله فعلا حالت ذیل مد نظر قرار میگیرد ولی در صورت تمایل موضوع نقش و وراثت را نیز تشریح خواهم کرد :
- از جدول کاربران به تنهائی استفاده می شود
- از خاصیت Tag برای ارتباط با بانک اطلاعاتی استفاده می شود
با این توضیحات معماری جداول بانک اطلاعاتی به شرح ذیل خواهد بود :

جدول کاربران :
- کلید کاربر احتمالا 2 بایتی (PK)
- مشخصه کاربر حدودا" 50 بایت و به لاتین
- نام فارسی کاربر حدود 200 بایت
کلمه عبور به طول دلخواه (Encrypt شده یا Free باتوجه به حساسیت پروژه)

نکته : ایندکس Uniq روی مشخصه فرم فراموش نشود

جدول دسترسی به فرم توسط کاربر :
- کلید فرم که در خاصیت Tag قرار دارد 2 بایت (PK)
- کلید کاربر 2 بایت
نکته : ایندکس روی به ترتیب کلید کاربر و کلید فرم فراموش نشود


جدول اشیاء قابل دسترس برای کاربر روی هر فرم :
- کلید فرم 2 بایت
- ID کنترل روی فرم که در خاصیت Tag قرار دارد معادل 2 بایت

نکته : ایندکس روی به ترتیب کلیدفرم و ID کنترل فراموش نشود


لطفا دوستان تا اینجا جداول را طراحی و منتظر پیاده سازی در بخش #C باشند

ASKaffash
دوشنبه 12 خرداد 1393, 08:02 صبح
با سلام
بخش سوم :
پروژه ای که قرار است سطوح دسترسی برای آن مدیریت شود بصورت ساده به شکل ذیل است فعلا هیچ کد خاصی ندارد و نکته این است که همه فرم ها از فرمی بنام InheritForm ارث بری کرده اند که در آینده تشریح خواهم کرد که به چه علت از این روش استفاده میگردد :

ASKaffash
سه شنبه 13 خرداد 1393, 15:12 عصر
سلام
بخش چهارم :
Script معماری بانک به شکل ذیل است :


USE [HA]
GO
/****** Object: Table [dbo].[Users] Script Date: 06/03/2014 15:44:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Users](
[UserID] [smallint] NOT NULL,
[UserCode] [varchar](50) NOT NULL,
[UserName] [nvarchar](200) NOT NULL,
[UserPass] [varchar](50) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'کلید کاربر' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'UserID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'مشخصه لاگین' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'UserCode'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'نام فارسی کابر' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'UserName'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'کلمه عبور' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Users', @level2type=N'COLUMN',@level2name=N'UserPass'
GO
/****** Object: Table [dbo].[Forms] Script Date: 06/03/2014 15:44:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Forms](
[FormID] [smallint] NOT NULL,
[UserID] [smallint] NOT NULL,
CONSTRAINT [PK_Forms] PRIMARY KEY CLUSTERED
(
[FormID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'کلید فرم' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Forms', @level2type=N'COLUMN',@level2name=N'FormID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'کلید کاربر' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Forms', @level2type=N'COLUMN',@level2name=N'UserID'
GO
/****** Object: Table [dbo].[Objects] Script Date: 06/03/2014 15:44:42 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Objects](
[FormID] [smallint] NOT NULL,
[ObjectID] [smallint] NOT NULL
) ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'کلید فرم' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Objects', @level2type=N'COLUMN',@level2name=N'FormID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'کلید شی درون فرم' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Objects', @level2type=N'COLUMN',@level2name=N'ObjectID'
GO
/****** Object: ForeignKey [FK_Forms_Users] Script Date: 06/03/2014 15:44:42 ******/
ALTER TABLE [dbo].[Forms] WITH CHECK ADD CONSTRAINT [FK_Forms_Users] FOREIGN KEY([UserID])
REFERENCES [dbo].[Users] ([UserID])
GO
ALTER TABLE [dbo].[Forms] CHECK CONSTRAINT [FK_Forms_Users]
GO
/****** Object: ForeignKey [FK_Objects_Forms] Script Date: 06/03/2014 15:44:42 ******/
ALTER TABLE [dbo].[Objects] WITH CHECK ADD CONSTRAINT [FK_Objects_Forms] FOREIGN KEY([FormID])
REFERENCES [dbo].[Forms] ([FormID])
GO
ALTER TABLE [dbo].[Objects] CHECK CONSTRAINT [FK_Objects_Forms]
GO


و دیاگرام ارتباط نیز به شکال ذیل :

ASKaffash
چهارشنبه 14 خرداد 1393, 21:39 عصر
سلام
بخش پنجم :
خوب براساس موضوعات مطرح شده تغییری در معماری بانک ایجاد کردم تا موضوع نقش هم وارد پروژه شود بنابراین معماری جدید به شرح ذیل است :

ASKaffash
چهارشنبه 14 خرداد 1393, 21:58 عصر
سلام
بخش ششم :
از این لحظه به بعد من سورس #C را پیوست خواهم کرد ولی قبل از آن لطفا به نکات ذیل توجه کنید که منطق ارائه شده از اصول چهارگانه OOP بسیار استفاده شده است و موضوعات ذیل را خواهید دید :
- وراثت کلاسها
- متد Overloading
- موضوع Down Cast و Up Cast
- استفاده از متد ژنریک
- Recursive
در پروژه پیوست شما پنج فرم ملاحظه می کنید :
- فرم پدر که تمامی فرمهای مشمول دسترسی از آن ارث بری می کنند بنام InheritForm
- فرمهای Form1 و ّForm2 و Form3 و MainForm که از فرم InheritForm ارث بری شده اند
همچنین :
برای کنترلها و آیتم هائی که قرار است در دسترسی ظاهر شوند یک مقدار Uniq متناسب با فرم مقدار دهی شده است و هر فرم نیز برای Tag آن یک مقدار در نظر گرفته شده است که در شکل پیوست نمونه ای از آن را مشاهده می کنید
لطفا بانک اطلاعاتی پیوست را دستی خودتان به اسکیوال سرور اتچ کنید
درون سورس برنامه ConnectionString خودتات را ست کنید
سپس برنامه را اجرا و نتیجه را ببینید
من مقایر پیش فرض در برنامه برای دو نقش و سه کاربر و برای 4 فرم ست کرده ام که شما میتوانید تغییرات خودتان را انجام دهید در ضمن تمام پیچیدگی درون فرم وراثتی است لطفا ملاحظه و نتیجه را منعکس نمائید

ASKaffash
شنبه 25 بهمن 1393, 06:49 صبح
سلام
اینهم سورس مورد نظر :