PDA

View Full Version : تکنیکهای مهم در راه اندازی برنامه ویندوزی درون سازمانی



Cadivar
سه شنبه 28 آذر 1396, 23:13 عصر
با سلام و احترام خدمت دوستان
یک برنامه ای رو با سی شارپ و SQL SERVER در سازمانی که من در اون شاغلم نوشتم(در سطح استان) تعداد کاربران برای استفاده از نرم افزار 1500 و حداکثر کاربر آنلاین 150 نفر می باشد(شبکه داخلی ) که همه روزه با اون کار می کنند
این برنامه الان برای کمتر از 20 درصد کاربران بدون هیچ مشکلی راه اندازی شده و در حال استفاده است با توجه به اینکه تا ماه آینده برای کلیه کاربران برنامه اجرایی می شه می خواستم نظر و تجربیات دوستان رو در مورد چالشهای مطرح شده زیر بدونم

-دیتابیس بروی WIN 7 با یه کانفیگ معمولی (ram:4Gb && Core i5 && Win 32Bit) تا الان بدون هیچ مشکلی جواب داده آیا لازمه سرور خریداری بشه یا کانفیگ رو بالا ببریم
با توجه به اینکه حجم داده ها خیلی بالا نیست (حداکثر 5 میلیون رکورد) و داده های اصلی مورد نیاز بعد از ورود کاربر به برنامه در دیتاست قرار میگیرن که طبیعتا ارسال و دریافت
به سرور کاهش پیدا میکنه

-در آینده چه مشکلات پیش بینی نشده ای ممکنه بوجود بیاد یا به بیان دیگر رعایت چه تکنیکها و ملزومات در این دسته از برنامه ها ضروری است.

aliramazani
چهارشنبه 29 آذر 1396, 14:29 عصر
چون اونجا شاغلی ایشالا که مفت و مجانی کار نکرده باشی براشون

Cadivar
جمعه 01 دی 1396, 10:40 صبح
از دوستانی که در این زمینه تجربه دارند استدعا دارم تا خیلی کوتاه تجربیات خودشونو بیان کنند
مسلما افراد زیادی در موقعیت من قرار دارند و می تونن از این راهنمایی ها بهره ببرند

danialafshari
شنبه 02 دی 1396, 00:57 صبح
با سلام
بیشتر نکاتی که به ذهنم میرسه مربوط به بانک برنامه (SQL Server) هست
1- بهتره از Sql Server نسخه Enterprise استفاده کنید.
2- افزونگی رو حتماً رعایت کنید.
3- برای نرم افزار سطح دسترسی قرار بدید.
4- امکان ویرایش رو در اختیار کسانی با سطح دسترسی پایین قرار ندید.
5- حتماً تاریخ ثبت و ساعت رو + نام کاربری رو در جدولی که اطلاعات ذخیره میشن ثبت کنید تا بشه فهمید فلان رکورد و چه کسی و در چه زمانی ثبت کرده.
6- از index در Sql استفاده کنید.
7- برای بالا رفتن سرعت تراکنش ها از Stored Procedure استفاده کنید.
8- حتماً برای بانک Relationship ایجاد کنید.
9- علاوه بر Backup روزانه توسط DA یا همون مدیر بانک (Database Admin) یک سرور مجازی (VPS) کرایه کنید و روزانه backup نرم افزار رو درونش قرار بدید تا خدایی نکرده اطلاعات اگر دچار مشکل شد پشتیان داشته باشید.
10- ویندوز رو هم 64 بیت کنید، یکی از مزیتهاش اینه که می تونید از ظرفیت کامل 4 گیگابایت رم استفاده کنید در صورتی که ویندوز 32 بیت تنها 3.25 رو بیشتر نمیخونه.
اینها چیزهایی بود که به ذهنم رسید
موفق باشید

Cadivar
شنبه 02 دی 1396, 20:42 عصر
با تشکر از مهندس افشاری
نکات کلیدی رو مطرح کردید خوشبختانه تقریبا تمامی نکات رعایت شده بجز بند 7 که اشاره به استفاده از SP بجهت افزایش سرعت داره

رامین مرادی
یک شنبه 03 دی 1396, 12:45 عصر
با تشکر از مهندس افشاری
نکات کلیدی رو مطرح کردید خوشبختانه تقریبا تمامی نکات رعایت شده بجز بند 7 که اشاره به استفاده از SP بجهت افزایش سرعت داره

ردیف 3 و 4 رو میشه توضیح بدید چجوری پیداه کردید؟ نقش تعریف کردید یا برای هر شخص یه دسترسی های خاصی دادید؟

Cadivar
یک شنبه 03 دی 1396, 22:31 عصر
در سازمان من با توجه به شعب مختلف زیادی که وجود داره و هر شعبه هم رئیس و کارکنان زیر مجموعه داره من اومدم چند نقش مختلف با سطح دسترسی های متفاوت در هر شعبه ایجاد کردم بصورت پیش فرض رئیس هر شعبه دارای بالاترین قدرت در اون شعبه می باشد و بقیه کارمندان آن شعبه دارای پایین ترین قدرت (کاربر عادی) هستند و رئیس شعبه بنا به صلاحدید می تونه با دادن نقش جدید به کاربر، قدرت کاربران زیرمجموعه خود را براحتی کم یا زیاد کنه

sg.programmer
یک شنبه 03 دی 1396, 22:56 عصر
اگه ممکنه ردیف های 6 و 8 را هم توضیح بدید که چطور میشه ایندکس و Relationship تعریف کرد؟

danialafshari
دوشنبه 04 دی 1396, 02:07 صبح
با سلام
موردی رو که یادم رفت اضافه کنم این هست که بنده سعی می کنم در فرم های اصلی مانند صدور فاکتور و یا مالی رکوردی رو حذف نکنم و اپراتور در اصل با پاک کردن اون رکورد فقط از دید خارجش می کنه و یک فرم قرار میدم برای مدیر تا بتونه رکوردهایی که پاک شده رو مشاهده و کنترل کنه

ردیف 3 و 4 رو میشه توضیح بدید چجوری پیداه کردید؟ نقش تعریف کردید یا برای هر شخص یه دسترسی های خاصی دادید؟
بدلیل کم بودن وقت مجبور بودم نقش تعیین کنم


اگه ممکنه ردیف های 6 و 8 را هم توضیح بدید که چطور میشه ایندکس و Relationship تعریف کرد؟
-در سراسر اینترنت اگر بگردید به صورت کامل روش ایندکس گذاری و کاربردش رو توضیح داده

http://barnamenevis.org/showthread.php?130021-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%A7%DB%8C%D9%86%D8%AF%DA%A9%D8%B3-%D9%88-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%B1%D8%AF-%D8%A2%D9%86
http://barnamenevis.org/showthread.php?316520-%D9%81%D8%A7%DB%8C%D8%AF%D9%87-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-index-%D8%AF%D8%B1-%D8%AC%D8%AF%D8%A7%D9%88%D9%84-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F

-برای ایجاد Relationship در Sql Server هم مانند عکس زیر ایجاد میشه (باید حتماً بیش از یک جدول داشته باشید)

147318

https://www.google.com/search?ei=nzBAWvqcK8LX6QSGwrOYBQ&q=%D8%A2%D9%85%D9%88%D8%B2%D8%B4+%D8%B3%D8%A7%D8%A E%D8%AA+relationship+%D8%AF%D8%B1+sql&oq=%D8%A2%D9%85%D9%88%D8%B2%D8%B4+%D8%A7%DB%8C%D8% AC%D8%A7%D8%AF+%D8%B1%DB%8C%D9%84%DB%8C%D8%B4%D9%8 6%D8%B4%DB%8C%D9%BE+%D8%AF%D8%B1+sq&gs_l=psy-ab.3.0.0i22i30k1l2.453287.472054.0.473621.52.47.3. 1.1.0.464.7048.2-27j1j1.29.0....0...1c.1.64.psy-ab..20.28.5938...0j35i39k1j0i19k1j0i22i30i19k1j0i2 2i10i30i19k1j33i160k1.0.jRJCcq8Z1EE

موفق باشید

رامین مرادی
دوشنبه 04 دی 1396, 08:41 صبح
با سلام
موردی رو که یادم رفت اضافه کنم این هست که بنده سعی می کنم در فرم های اصلی مانند صدور فاکتور و یا مالی رکوردی رو حذف نکنم و اپراتور در اصل با پاک کردن اون رکورد فقط از دید خارجش می کنه و یک فرم قرار میدم برای مدیر تا بتونه رکوردهایی که پاک شده رو مشاهده و کنترل کنه

بدلیل کم بودن وقت مجبور بودم نقش تعیین کنم


موفق باشید

جالبه که منم میخواستم همین مدلی نقش ها رو پیاده کنم. اما جور در نیومد. انتظاری که ازم دارن اینه که مثلا آقای فلانی در فلان فرم دکمه افزودن فعال باشه ولی دکمه حذف غیرفعال.یا مثلا فلان منو برای فلان کاربر فعال باشه ولی برای کاربر دیگه که همون مسئولیت و همون کارو انجام میده غیر فعال باشه. با این حال مجبورم برای هر دکمه یک فیلد تعریف کنم. با احتساب کاری که انجام میدم نزدیک پونصد فیلد فک کنم باید تعریف بشه.سخت نیست اما به نظر خودم جالب هم نیست

rahmatipoor
دوشنبه 04 دی 1396, 10:31 صبح
جالبه که منم میخواستم همین مدلی نقش ها رو پیاده کنم. اما جور در نیومد. انتظاری که ازم دارن اینه که مثلا آقای فلانی در فلان فرم دکمه افزودن فعال باشه ولی دکمه حذف غیرفعال.یا مثلا فلان منو برای فلان کاربر فعال باشه ولی برای کاربر دیگه که همون مسئولیت و همون کارو انجام میده غیر فعال باشه. با این حال مجبورم برای هر دکمه یک فیلد تعریف کنم. با احتساب کاری که انجام میدم نزدیک پونصد فیلد فک کنم باید تعریف بشه.سخت نیست اما به نظر خودم جالب هم نیست

با سلام
بنده این مشکل رو به این شکل حل کردم :

همونطوری که حتما میدونید هر دکمه یا منو یا ... که روی فرم قرار میدید یک خاصیت داره به نام tag.

من برای هر دکمه ، منو یا هر چیز دیگه ای که نیازه تعیین مجوز بررسی بشه خاصیت tag اون رو یک مقدار متمایز دادم.

همه این مقادیر tag ها که برای دکمه ها ، منو ها و غیره ( اونهایی که نیازه با مجوز اجرا بشن ) رو توی یک جدول توی دیتابیس با نام PermissionList (که سه تا فیلد داره : "PermissionID" "tag" "Detailes" ) ذخیره کردم و عنوان دکمه ، منو یا .... رو هم نوشتم.

مثلا
PermissionID = 1
tag = t145
"حذف فاکتور" = Detailes

توی قسمت کاربران ( که میشه این کار رو برای نقشها هم انجام داد ) یک فرم تعیین مجوز قرار دادم که میاد برای هر کاربر لیست همه مجوزها رو نشون میده و مدیر میتونه مجوزهایی رو که میخواد به یک کاربر خاص اعطا کنه تیک بزنه.

یک جدول دیگه هم داریم به نام UserPermission که دو تا فید داره tag و UserId که تگ مجوزهایی که مدیر توی قسمت تعیین مجوز به کاربران داده به همراه آی دی کاربر موردنظر توی این جدول ذخیره میشه. ( به ازای هر یک مجوزی که به هر کاربر داده شده یک رکورد توی این جدول ثبت میشه )


توی نرم افزار هم یک کلاس برای انجام همه این کارها داریم.
توی این کلاس یک متد هست با عنوان checkPermission که دو تا ورودی داره tag و userID . خروجی این تابع هم از نوع منطقیه که true یا false هست

این متد بررسی میکنه که آیا توی جدول UserPermission رکوردی با این مشخصات ( tag ورودی و userID ورودی ) وجود داره یا خیر که اگه وجود داشته باشه به این معناست که این مجوز به کاربر اعطا شده و در نتیجه مقدار true برگردونده میشه .

موقعی هم که مثلا روی یک دکمه کلیک می کنید یک شرط هست که کدهای اون دکمه درصورتی که شرط برقرار باشه اجرا میشن.
اون شرط هم اینه : متد checkPermission که قبلا توضیح دادم رو اجرا میکنه و مقدار tag دکمه یا منو یا ... که روی اون کلیک شده رو به همراه ID کاربر جاری به متد checkPermission ارسال میکنه و در صورتی که مقدار بازگشتی true بود دستورات رو اجرا میکنه در غیر این صورت به کاربر پیغام میده که شما دسترسی به اون قسمت رو ندارید.

خوبی این روش اینه که دیگه نیازی به تعریف فیلد برای هر یک از دکمه ها نیست . مثلا فرض کنید شما یک قسمت به نرم افزارتون اضافه کنید. توی روش خودتون باید بیاید و دوباره یک سری فیلد جدید رو به جدول پرمیشن ها اضافه کنید و کدها رو تغییر بدید و ... که دردسر زیادی داره
اما توی این روش فقط کافیه برای دکمه های جدید خاصیت tag رو مقدار دهی کنید و اون مقدار رو با عنوانش توی جدول PermissionList لیست ذخیره کنید. که دیگه نیازی به تغییر ساختار دیتابیس و جدول مجوزها و تغییر کدنویسی و ... نداره.

خوبی دیگه این روش اینه که میتونید موارد بالا رو توی یک کلاس مثلا با نام Permission بنویسید و برای همه نرم افزارهای دیگه تون هم استفاده کنید.

رامین مرادی
دوشنبه 04 دی 1396, 12:16 عصر
با سلام
بنده این مشکل رو به این شکل حل کردم :

همونطوری که حتما میدونید هر دکمه یا منو یا ... که روی فرم قرار میدید یک خاصیت داره به نام tag.

من برای هر دکمه ، منو یا هر چیز دیگه ای که نیازه تعیین مجوز بررسی بشه خاصیت tag اون رو یک مقدار متمایز دادم.

همه این مقادیر tag ها که برای دکمه ها ، منو ها و غیره ( اونهایی که نیازه با مجوز اجرا بشن ) رو تعریف کردم توی یک جدول توی دیتابیس با نام PermissionList (که سه تا فیلد داره : "PermissionID" "tag" "Detailes" ) ذخیره کردم و عنوان دکمه دکمه یا منو یا .... رو هم نوشتم.

مثلا
PermissionID = 1
tag = t145
"حذف فاکتور" = Detailes

توی قسمت کاربران ( که میشه این کار رو برای نقشها هم انجام داد ) یک فرم تعیین مجوز قرار دادم که میاد برای هر کاربر لیست همه مجوزها رو نشون میده و مدیر میتونه مجوزهایی رو که میخواد به یک کاربر خاص اعطا کنه تیک بزنه.

یک جدول دیگه هم داریم به نام UserPermission که دو تا فید داره tag و UserId که تگ مجوزهایی که مدیر توی قسمت تعیین مجوز به کاربران داده به همراه آی دی کاربر موردنظر توی این جدول ذخیره میشه. ( به ازای هر یک مجوزی که به هر کاربر داده شده یک رکورد توی این جدول ثبت میشه )


توی نرم افزار هم یک کلاس برای انجام همه این کارها داریم.
توی این کلاس یک متد هست با عنوان checkPermission که دو تا ورودی داره tag و userID . خروجی این تابع هم از نوع منطقیه که true یا false هست

این متد بررسی میکنه که آیا توی جدول UserPermission رکوردی با این مشخصات ( tag ورودی و userID ورودی ) وجود داره یا خیر که اگه وجود داشته باشه به این معناست که این مجوز به کاربر اعطا شده و در نتیجه مقدار true برگردونده میشه .

موقعی هم که مثلا روی یک دکمه کلیک می کنید یک شرط هست که کدهای اون دکمه درصورتی که شرط برقرار باشه اجرا میشن.
اون شرط هم اینه : متد checkPermission که قبلا توضیح دادم رو اجرا میکنه و مقدار tag دکمه یا منو یا ... که روی اون کلیک شده رو به متد checkPermission ارسال میکنه و در صورتی که مقدار بازگشتی true بود دستورات رو اجرا میکنه در غیر این صورت به کاربر پیغام میده که شما دسترسی به اون قسمت رو ندارید.

خوبی این روش اینه که دیگه نیازی به تعریف فیلد اضافی نیست . مثلا فرض کنید شما یک قسمت به نرم افزارتون اضافه کنید. توی روش خودتون باید بیاید و دوباره فیلدها رو اضافه کنید و کدها رو تغییر بدید و ...
اما توی این روش فقط کافیه برای دکمه های جدید خاصیت tag رو مقدار دهی کنید و اون مقدار رو با عنوانش توی جدول PermissionList لیست ذخیره کنید.

ممنون از توضیحات جامع و کاملتون در صورت امکان یک نمونه فرم کوچک در حد سه دکمه بزارید.در ضمن دیتابیس هم فقط عکس جدولو بدید.متشکر