MR.B4A 252 ارسال شده در 20 اردیبهشت اشتراک گذاری ارسال شده در 20 اردیبهشت این سورس به درد برنامه نویسان b4a میخورد که میخواهند با دیتابیس آنلاین کار کنند و اپلیکیشن های فروشگاهی و برنامه هایی مثل این ها که مربوط به دیتابیس آنلاین است، بنویسند. ( به همراه فایل های PHP ) ویژگی ها: *چهار عمل اصلی به دیتابیس ( نمایش، ورود، حذف، آپدیت اطلاعات ) *استفاده از کاستوم لیست ویو *ثبت نام و لاگین به دیتابیس *توضیح فارسی خط های مهم در برنامه *جستجوی آنلاین در دیتابیس *نمایش عکس از دیتابیس آنلاین + فایل های PHP دوستانی که سورس را تهیه میکنن به این نکته توجه کنند که این یک اپلیکیشن فروشگاهی نیست که بعد از دانلود اجرا کنید و صاحب یک فروشگاه شوید، بلکه فقط یک سورس پایه به زبان basic4android برای ساختن برنامه هایی با دیتابیس آنلاین است. تهیه و تنظیم مرتضی صباغی MR.B4A https://t.me/programmingwithb4a https://eitaa.com/mortezasabaghi لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
سید رضا 12 ارسال شده در 21 اردیبهشت اشتراک گذاری ارسال شده در 21 اردیبهشت ریگانشم میشه این بخش ۱: ساختار دیتابیس MySQL ابتدا یک دیتابیس در MySQL (مثلاً با phpMyAdmin) به نام b4a_app_db ایجاد کنید و سپس جدول زیر را در آن بسازید: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL, `password` varchar(255) NOT NULL, `fullname` varchar(200) NOT NULL, `profile_image` varchar(500) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; id: کلید اصلی و شمارنده خودکار. username و password: برای احراز هویت (توصیه میشود پسوردها در یک پروژه واقعی هش شوند). profile_image: مسیر فایل تصویر پروفایل کاربر که روی سرور آپلود میشود. بخش ۲: فایلهای PHP (سمت سرور - API) تمامی فایلهای PHP را در پوشهای مانند htdocs/b4a_api/ در سرور محلی (مثل XAMPP) یا هاست آنلاین خود قرار دهید -1. نکته مهم امنیتی: در تمام مثالهای زیر، برای سادگی، از پسورد به صورت Plain Text استفاده شده است. در پروژههای واقعی، حتماً از توابع هش کننده مانند password_hash() و password_verify() در PHP استفاده کنید. ۱. فایل پیکربندی دیتابیس (config.php) این فایل برای اتصال به دیتابیس در تمام فایلهای دیگر Require میشود. <?php // config.php $host = 'localhost'; // آدرس سرور $dbname = 'b4a_app_db'; // نام دیتابیس $username = 'root'; // نام کاربری دیتابیس $password = ''; // پسورد دیتابیس (در XAMPP پیشفرض خالی است) try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); // تنظیم PDO برای نمایش خطاها $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { // در صورت خطا در اتصال، یک آرایه JSON برگردانید echo json_encode(['error' => 'Connection failed: ' . $e->getMessage()]); exit; } ?> ۲. فایل ثبت نام (register.php) این فایل اطلاعات ثبت نام را از B4A دریافت کرده و کاربر جدیدی در دیتابیس ایجاد میکند. <?php // register.php require_once 'config.php'; header('Content-Type: application/json'); // دریافت دادههای ارسال شده توسط B4A (با متد POST) // برای آپلود تصویر، از $_FILES استفاده میکنیم $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; // در پروژه واقعی: هش شود $fullname = $_POST['fullname'] ?? ''; // بررسی تکراری نبودن نام کاربری $checkStmt = $pdo->prepare("SELECT id FROM users WHERE username = ?"); $checkStmt->execute([$username]); if ($checkStmt->fetch()) { echo json_encode(['status' => 'error', 'message' => 'Username already exists!']); exit; } // پردازش آپلود تصویر $imagePath = null; if (isset($_FILES['profile_image']) && $_FILES['profile_image']['error'] == 0) { $uploadDir = 'uploads/'; if (!is_dir($uploadDir)) { mkdir($uploadDir, 0777, true); // ساخت پوشه اگر وجود نداشت } $imagePath = $uploadDir . time() . '_' . basename($_FILES['profile_image']['name']); move_uploaded_file($_FILES['profile_image']['tmp_name'], $imagePath); } // درج اطلاعات در دیتابیس $insertStmt = $pdo->prepare("INSERT INTO users (username, password, fullname, profile_image) VALUES (?, ?, ?, ?)"); if ($insertStmt->execute([$username, $password, $fullname, $imagePath])) { echo json_encode(['status' => 'success', 'message' => 'Registration successful!']); } else { echo json_encode(['status' => 'error', 'message' => 'Registration failed!']); } ?> ۳. فایل لاگین (login.php) این فایل نام کاربری و رمز عبور را بررسی کرده و در صورت موفقیت، اطلاعات کاربر را برمیگرداند. <?php // login.php require_once 'config.php'; header('Content-Type: application/json'); $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; // در پروژه واقعی: verify hash $stmt = $pdo->prepare("SELECT id, username, fullname, profile_image FROM users WHERE username = ? AND password = ?"); $stmt->execute([$username, $password]); $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user) { // لاگین موفق echo json_encode(['status' => 'success', 'data' => $user]); } else { // لاگین ناموفق echo json_encode(['status' => 'error', 'message' => 'Invalid username or password!']); } ?> ۴. فایل نمایش کاربران (get_users.php) این فایل لیست تمام کاربران (برای نمایش در Custom List View) به همراه لینک تصویرشان را برمیگرداند. از این فایل برای جستجو نیز استفاده میکنیم. <?php // get_users.php require_once 'config.php'; header('Content-Type: application/json'); $search = $_GET['search'] ?? ''; // دریافت عبارت جستجو از B4A $sql = "SELECT id, username, fullname, profile_image FROM users"; if (!empty($search)) { // اگر عبارت جستجو وجود داشت، هیتلر کن $sql .= " WHERE username LIKE :search OR fullname LIKE :search"; $stmt = $pdo->prepare($sql); $stmt->execute(['search' => '%' . $search . '%']); } else { // در غیر این صورت همه کاربران را برگردان $stmt = $pdo->query($sql); } $users = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode($users); ?> ۵. فایل حذف کاربر (delete_user.php) یک کاربر را بر اساس id دریافتی حذف میکند. <?php // delete_user.php require_once 'config.php'; header('Content-Type: application/json'); $input = json_decode(file_get_contents('php://input'), true); $userId = $input['id'] ?? 0; if ($userId) { $stmt = $pdo->prepare("DELETE FROM users WHERE id = ?"); if ($stmt->execute([$userId])) { echo json_encode(['status' => 'success', 'message' => 'User deleted successfully!']); } else { echo json_encode(['status' => 'error', 'message' => 'Delete failed!']); } } else { echo json_encode(['status' => 'error', 'message' => 'Invalid user ID!']); } ?> ۶. فایل بهروزرسانی کاربر (update_user.php) اطلاعات یک کاربر موجود را ویرایش میکند. <?php // update_user.php require_once 'config.php'; header('Content-Type: application/json'); $userId = $_POST['id'] ?? 0; $fullname = $_POST['fullname'] ?? ''; if ($userId && $fullname) { // بررسی آپلود تصویر جدید $imageSql = ''; $params = [':fullname' => $fullname, ':id' => $userId]; if (isset($_FILES['profile_image']) && $_FILES['profile_image']['error'] == 0) { $uploadDir = 'uploads/'; $imagePath = $uploadDir . time() . '_' . basename($_FILES['profile_image']['name']); move_uploaded_file($_FILES['profile_image']['tmp_name'], $imagePath); $imageSql = ", profile_image = :profile_image"; $params[':profile_image'] = $imagePath; } $sql = "UPDATE users SET fullname = :fullname $imageSql WHERE id = :id"; $stmt = $pdo->prepare($sql); if ($stmt->execute($params)) { echo json_encode(['status' => 'success', 'message' => 'User updated successfully!']); } else { echo json_encode(['status' => 'error', 'message' => 'Update failed!']); } } else { echo json_encode(['status' => 'error', 'message' => 'Invalid data!']); } ?> بخش ۳: برنامه B4A در این بخش، کدهای سمت B4A را توضیح میدهیم. ۱. تنظیمات Manifest برای دسترسی به اینترنت، خط زیر را به فایل Manifest.txt اضافه کنید -1: text Copy Download CreateResourceFromFile(Macro, Core.Network) ۲. طراحی Layoutها شما به چند Layout نیاز دارید: layout_login: شامل دو EditText برای نام کاربری و رمز عبور، و یک دکمه "ورود". همچنین یک دکمه "ثبت نام" برای انتقال به صفحه ثبت نام. layout_register: شامل EditText برای نام کاربری، رمز عبور، نام کامل، یک دکمه برای انتخاب تصویر و یک دکمه "ثبت نام". layout_main: شامل یک EditText برای جستجو (با قابلیت جستجوی آنلاین)، یک دکمه "خروج" و یک Custom List View (از مسیر: Basic4android -> Views -> CustomListView) برای نمایش لیست کاربران. ۳. کد نویسی B4A ' Activity اصلی برای مدیریت کاربران Sub Process_Globals ' در اینجا متغیرهایی که بین تمام Activityها مشترک هستند تعریف میشوند Public httpJob As HttpJob Public UserId As Int ' برای نگهداری ID کاربر لاگین کرده (در این مثال ساده) End Sub Sub Globals ' متغیرهای مربوط به Activity اصلی (Main) Private CLV As CustomListView Private SearchBox As EditText Private BtnLogout As Button Private PanelNoData As Panel End Sub Sub Activity_Create(FirstTime As Boolean) Activity.LoadLayout("layout_main") httpJob.Initialize("HttpJob", Me) ' --- توضیح: تنظیم جستجو با تایپ کاربر --- SearchBox.AddTextChangedListener(New TextWatcher) ' --- بارگذاری اولیه لیست کاربران --- LoadAllUsers("") End Sub Sub Activity_Resume ' هر بار که Activity نمایان میشود، لیست را تازه کن (مثلاً بعد از ثبت نام) LoadAllUsers("") End Sub ' --- توضیح: تابع جستجوی آنلاین --- Sub SearchBox_TextChanged (Old As String, New As String) If New.Length > 2 Or New.Length = 0 Then ' اگر بیش از 2 حرف تایپ شد یا خالی بود، جستجو کن LoadAllUsers(New) End If End Sub ' --- توضیح: دریافت لیست کاربران از سرور (با قابلیت جستجو) --- Sub LoadAllUsers(SearchTerm As String) ' نمایش یک ProgressBar یا پیام لودینگ PanelNoData.Visible = False CLV.Clear Dim URL As String = "http://your-server-address/b4a_api/get_users.php?search=" & SearchTerm httpJob.Download(URL) ' درخواست GET به سرور httpJob.Tag = "get_users" End Sub ' --- توضیح: رویداد موفقیت یا شکست Job --- Sub JobDone (Job As HttpJob) If Job.Success Then Select Job.Tag Case "get_users" ' پردازش لیست کاربران دریافت شده Dim parser As JSONParser parser.Initialize(Job.GetString) Dim users As List = parser.NextArray ' دریافت آرایه JSON If users.Size > 0 Then For i = 0 To users.Size - 1 Dim map As Map = users.Get(i) Dim id As Int = map.Get("id") Dim username As String = map.Get("username") Dim fullname As String = map.Get("fullname") Dim imageUrl As String = map.Get("profile_image") ' --- توضیح: پر کردن Custom List View --- CLV.Add(CreateListItem(username, fullname, imageUrl), 70dip, id) Next Else PanelNoData.Visible = True ' نمایش پیغام "کاربری یافت نشد" End If Case "delete_user" ' پردازش نتیجه حذف Dim res As String = Job.GetString Log("Delete Result: " & res) LoadAllUsers("") ' پس از حذف، لیست را تازه کن Case "register", "update" ' پردازش نتیجه ثبت نام یا ویرایش ' ... End Select Else ' خطا در ارتباط با سرور ToastMessageShow("خطا در ارتباط با سرور: " & Job.ErrorMessage, True) End If Job.Release End Sub ' --- توضیح: تابع کمکی برای ساخت آیتم لیست --- Sub CreateListItem(UserName As String, FullName As String, ImageUrl As String) As Panel Dim p As Panel p.Initialize("") p.LoadLayout("layout_list_item") ' یک Layout ساده شامل ImageView و دو Label ' مقداردهی Viewها Dim lblUser As Label = p.GetView(0) ' فرض میکنیم اولین View، Label نام کاربری است Dim lblName As Label = p.GetView(1) ' دومین View، Label نام کامل Dim imgView As ImageView = p.GetView(2) ' سومین View، ImageView lblUser.Text = UserName lblName.Text = FullName ' --- توضیح: نمایش عکس از دیتابیس آنلاین --- If ImageUrl <> "" And ImageUrl <> "null" Then ' دانلود تصویر (میتوان از کتابخانههای کش مانند Picasso یا DiskCache استفاده کرد) Dim imgJob As HttpJob imgJob.Initialize("imgJob", Me) imgJob.Download("http://your-server-address/b4a_api/" & ImageUrl) imgJob.Tag = imgView ' آدرس ImageView را در Tag Job ذخیره میکنیم Else imgView.Bitmap = LoadBitmap(File.DirAssets, "default_user.png") ' تصویر پیشفرض End If Return p End Sub ' --- توضیح: دریافت تصویر و قرار دادن آن در ImageView مربوطه --- Sub JobDone_Image(Job As HttpJob) If Job.Success Then Dim imgView As ImageView = Job.Tag imgView.SetBitmap(Job.GetBitmap) ' تصویر دانلود شده را نمایش بده Else Log("خطا در دانلود تصویر: " & Job.ErrorMessage) End If Job.Release End Sub ' --- توضیح: رویداد کلیک روی آیتمهای لیست (برای ویرایش یا حذف) --- Sub CLV_ItemClick (Index As Int, Value As Object) Dim UserId As Int = Value ' مقدار UserId که در Add ذخیره کردیم ' نمایش یک Dialog با گزینههای ویرایش و حذف ' برای حذف: ' SendDeleteRequest(UserId) ' برای ویرایش، کاربر را به Activity ویرایش منتقل کنید ' StartActivity(EditProfile) و UserId را به آن پاس دهید End Sub ' --- توضیح: درخواست حذف کاربر به سرور --- Sub SendDeleteRequest(UserId As Int) Dim j As HttpJob j.Initialize("HttpJob", Me) j.Tag = "delete_user" ' ارسال درخواست POST با JSON j.PostString("http://your-server-address/b4a_api/delete_user.php", CreateJsonDelete(UserId)) j.GetRequest.SetContentType("application/json") End Sub ' تابع کمکی برای ساخت JSON حذف Sub CreateJsonDelete(UserId As Int) As String Dim m As Map m.Initialize m.Put("id", UserId) Dim jg As JSONGenerator jg.Initialize(m) Return jg.ToString End Sub ۴. توضیحات خطوط مهم برنامه B4A: httpJob.Initialize("HttpJob", Me): شیء HttpJob را برای ارتباط با سرور راهاندازی میکند -1. SearchBox.AddTextChangedListener(...): یک Listener به جعبه متن جستجو اضافه میکند تا با هر بار تایپ کاربر، تابع SearchBox_TextChanged فراخوانی شود و درخواست جستجو به سرور ارسال گردد. CLV.Add(...): در این خط، یک آیتم جدید به Custom List View اضافه میشود. تابع CreateListItem یک Panel شامل طرح آیتم را برمیگرداند. ارتفاع 70dip و Value که در اینجا id کاربر است، در رویداد کلیک قابل دسترسی خواهد بود. LoadBitmap(File.DirAssets, "default_user.png"): اگر کاربر تصویری نداشته باشد، یک تصویر پیشفرض از پوشه Files برنامه بارگذاری میکند. Sub CLV_ItemClick (Index As Int, Value As Object): این رویداد زمانی رخ میدهد که کاربر روی یکی از آیتمهای لیست کلیک کند. پارامتر Value همان مقداری است که هنگام فراخوانی CLV.Add به عنوان آرگومان سوم پاس داده شده بود (در اینجا id کاربر). جمعبندی و نکات تکمیلی امنیت: در مثالهای PHP، رمز عبور به صورت متن ساده ذخیره و ارسال میشود. این کار بسیار خطرناک است. حتماً از کتابخانه BCrypt در B4A برای هش کردن رمز قبل از ارسال و از password_hash() و password_verify() در PHP استفاده کنید -3. تصاویر: در این مثال، تصاویر به صورت جداگانه و با یک HttpJob دیگر دانلود میشوند. برای کارایی بهتر و کاهش مصرف پهنای باند، استفاده از کتابخانههای کش مانند DiskCache یا Picasso برای B4A توصیه میشود. سشن و Token: برای لاگین ماندن کاربر و افزایش امنیت، پس از لاگین موفق، سرور میتواند یک Token (مانند JWT) تولید کرده و به برنامه برگرداند. سپس برنامه این Token را در تمام درخواستهای بعدی (مثلاً در Header) ارسال کند -3. ویرایش اطلاعات: میتوانید یک Activity جدید بسازید و پس از کلیک روی گزینه ویرایش در Custom List View، UserId را به آن Activity ارسال کنید تا اطلاعات کاربر از سرور دریافت و در فرم ویرایش نمایش داده شود. نکات PHP: در فایلهای PHP، به جای mysql_* (که منسوخ شده) از PDO استفاده شده است که امنیت و انعطاف بیشتری دارد -3. این ساختار، یک پایه محکم برای پروژههای آینده شما فراهم میکند و میتوانید به راحتی ماژولهای دیگر را به آن اضافه کنید. موفق باشید! لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
ارسالهای توصیه شده
بایگانی شده
این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.