اذهب إلى المحتوى

السؤال

نشر (معدل)

السلام عليكم ورحمة الله وبركاته

استفسار ي اخوان لو تكرمتو

كيف يمكن عمل نظام تقييم المنتج

مثلا لدي تطبيق يعرض منتجات وارغب بجعل المستخدمين قادرين على تقييم المنتجات

نجمه نجمتين ثلاث وما شابه

وارغب بحفظ التقيم في قاعدة بيانات mysql واستعادتها 

بحيث تكون محفوظه من الفقد

حاولت ابحث عن مثال ولكن لم اجد

 

مثل هذا

159236977328171.png

 

تم التعديل في بواسطة مروان مروان3

Recommended Posts

  • 1
نشر
بتاريخ 14 ساعات قال مروان مروان3:

ياليت لو عندك مثال كيف اربطه باستخدام مكتبة Volley وكيف استعيد العدد او التقيم

 

أهلا بك أخي @مروان مروان3

تمام أولا نحتاج إلى عمل ال api الخاص بإستلام البيانات القادمة من التطبيق وهي عدد النجمات في قسم السيرفر ,نقوم بعمل ملف php بسيط 

<?php

include 'Config.php';

 $con = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName);
 
 $s_count = $_POST['stars_count'];
 
 
 $Sql_Query = "insert into Userd (stars_count) values ('$s_count')";
 
 if(mysqli_query($con,$Sql_Query)){
 
 echo 'Stars Count Inserted Successfully';
 
 }
 else{
 
 echo 'Try Again';
 
 }
 mysqli_close($con);
?>

ملاحظة لا تنسى تغيير include 'config.php' بالملف الخاص بك ,تمام هنا إنتهينا من جهة السيرفر قم بإعطاء الملف إسم مثلاً insert_stars.php نذهب إلى أندرويد إستديو 

نقوم بعمل requestqueue في الكلاس MainActivity مثلا  

RequestQueue requestQueue;

وأيضا نقوم بعمل متغير من نوع string ونقوم بإعطائه الرابط للسيرفر الخاص بنا مع إسم الملف مثال

String HttpUrl = "http://test.com/insert_stars.php";

والأن في ال onCreate ميثود نقوم بعمل طلب Volly جديد هكذا

requestQueue = Volley.newRequestQueue(MainActivity.this);

ونقوم بعمل ميثود من نوع StringRequest خارج ال onCreate ميثود هكذا

StringRequest stringRequest = new StringRequest(Request.Method.POST, HttpUrl,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String ServerResponse) {


                // Showing Server response coming from server.
                Toast.makeText(MainActivity.this, ServerResponse, Toast.LENGTH_LONG).show();
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {


                // Showing Server Error message .
                Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_LONG).show();
            }
        }) {

قمت بإضافة توست لإظهار الرسالة القادمة من السيرفر في حالة نجاح إدخال البيانات وكذلك توست أخر في حالة حدوث خطأ وأيضا نقوم بعمل ميثود أخرى تقوم بإرجاع عدد النجمات أسفل الميثود الأولى

 @Override
            protected Map<String, String> getParams() {

                
                Map<String, String> params = new HashMap<String, String>();

                // Adding AllStars value to Params.
                params.put("stars_count", starsparam);
               

                return params;
            }

        };

لكن قم بتغيير الجزر الأول هنا

params.put("stars_count", starsparam);

وهو stars_count إلى إسم الحقل في قاعدة البيانات والجزء الثاني المتغير الخاص بعدد النجوم ,الأن جزء ال Volly 

نقوم بعمل طلب volly جديد ونقوم بتمرير الميثود الأولى له هكذا

   // Creating RequestQueue.
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);

        // Add the stars StringRequest object into requestQueue.
        requestQueue.add(stringRequest);

يمكنك إضافة السطرين إلى الميثود onCreate  هكذا إنتهينا :) ,ولا تنسى إضافة ال internet permıssıon إلى ملف mainfest 

<uses-permission android:name="android.permission.INTERNET"/>

الجزء أعلاه لإدخال عدد النجوم إلى قاعدة البيانات ,الأن بخصوص جزء إستعادة عدد النجوم من قاعدة البيانات ووضعها في ال ratingbar نبدأ سبق لك إستخدام volly لإرجاع البيانات هذا الجزء أتوقع سهل نقوم بعمل ميثود لذلك

/**
 * Method to make json object request where json response to get StarsCount via Server {
 * */
private void starsCountJsonRequest() {
 
    
 
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
            urlJsonObj, null, new Response.Listener<JSONObject>() {
 
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, response.toString());
 
                    try {
                        // Parsing json object response
                        // response will be a json object
                        String starscount = response.getString("starsC");
                       
 
                        jsonResponse = "";
                        jsonResponse += starscount;
                        
 
                        starsbar.numStars(jsonResponse);
 
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(this,
                                "Error: " + e.getMessage(),
                                Toast.LENGTH_LONG).show();
                    }
                   
                }
            }, new Response.ErrorListener() {
 
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    Toast.makeText(this,
                            error.getMessage(), Toast.LENGTH_SHORT).show();
                    
                }
            });
 
    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq);
  
  
}

طبعاً هنا  starsbar هو ال RatingBar فيو هنا

    starsbar.numStars(jsonResponse);

 

  • 1
نشر

وعليكم السلام أخي @مروان مروان3

الأمر سهل :) ,يمكنك عمل ذلك من خلال إضافة Ratingbar فيو في الlayout الذي تريد هكذا

<RatingBar
android:id="@+id/RatingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

وقم بإعطاءه id معين ,والأن نقوم بالإشارة إليه(تفعيله initiate) في ال onCreate ميثود بعد setContentview  بهذه الطريقة

RatingBar simpleRatingBar = (RatingBar) findViewById(R.id.RatingBar); 

ونقوم بإرجاع عدد النجمات المختارة من قبل المستخدم من خلال الميثود getNumStars(); ستقوم بإرجاع عدد النجمات المختارة هكذا

int Starscount = simpleRatingBar.getNumStars(); 

بعد ذلك يمكنك حفظ القيمة في قاعدة البيانات القيمة تخزن في المتغير Starscount ,وبخصوص الحفظ والإسترجاع من قاعدة البيانات هل تريد مثال لقاعدة بيانات محلية ؟أم بإستخدام api أي حفظ عن بعد 

  • 1
نشر

مرحباً مروان 

تطبيق الأندرويد الخاص بك لا يستطيع التواصل مباشرة مع قاعدة البيانات MySQL وإنما يتم بناء واجهة برمجية API حيث أن التطبيق سيقوم بإرسال طلب ( request ) لهذه الواجهة و ترجع له رد ( response ) و يتم بناء هذه الواجهة بإستعمال إحدى لغات البرمجة التي تعمل في جانب الخادم 

فمثلا في حالتك عند تسجيل الدخول من طرف المستخدم من خلال التطبيق يتم التواصل مع الواجهة البرمجية بإرسال طلب بالمعلومات التي أدخلها المستخدم و بعدها تتم معالجة هذه البيانات من طرف ال back end و إرجاع رد للتطبيق. في حالة نجاح عملية تسجيل الدخول يتم إستعراض صفحات التطبيق التي تحتاج تسجيل الدخول أما في حالة فشل العملية يتم عرض رسالة خطأ للمستخدم 

مثلاً إذا نجح المستخدم في تسجيل دخوله للتطبيق يصبح بإمكانه عمل تقييم لمنتج و في هذه الحالة أيضا سيتم إرسال طلب او request للواجهة البرمجية و ستتم معالجة الطلب و حفظ البيانات في قاعدة البيانات و إرجاع رد للتطبيق 

ملاحظة: عملية التقييم لا تحتاج فقط إلى تسجيل الدخول بل إلى شرط إضافي و هو شراء المستخدم للمنتج الذي يريد أن يُقيِّمه

هذه هي الفكرة بشكل عام و تتضمن نقطتين و هما :

  1. بناء الواجهة البرمجية و عمل حماية لها 
  2. ربط التطبيق مع الواجهة البرمجية 

يتوجب عليك تجربة الواجهة البرمجية قبل ربط التطبيق معها 

بالتوفيق 

  • 1
نشر

بشكل عام تقيم النجوم يتم من خلال إحتساب عدد مرات تقيم المنتج و قيمة كل تقيم ،  بمعنى أنه يجب عليك حفظ عدد مرات تقيم كل منتج في قاعدة البيانات و كل مرة يقيم فيها المستخدم منتج ما يزداد عدد مرات التقيم في قاعدة البيانات بواحد ، و يتم عمل معادلة جديدة تحسب التقيم الجديد الذي حصل عليه المنتج و تعديله في قاعدة البيانات - إليك المثال التالي :- 

    //  تقيم المنتج الحالي -  من قاعدة البيانات
double currRatingVal =  barberDoc['rating'];

   // عدد مرات تقيم المنتج - من قاعدة البيانات 
int numOfRating =  barberDoc['numOfRating'];
                                                  
  // معادلة جديدة تحسب تقيم المنتج الجديد 
double finalRatingVal =  ((currRatingVal *  numOfRating) + ratingVal) / (numOfRating + 1);

بعد ذلك،  عليك أن تعدل قيمة تقيم المنتج داخل قاعدة البينات بناءً على القيمة الجديدة  التي حصلت عليها ، و اضافة 1 على عدد مرات التقيم

  • 0
نشر (معدل)
بتاريخ 1 ساعة قال Mohamd Imran:

وعليكم السلام أخي @مروان مروان3

الأمر سهل :) ,يمكنك عمل ذلك من خلال إضافة Ratingbar فيو في الlayout الذي تريد هكذا


<RatingBar
android:id="@+id/RatingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

وقم بإعطاءه id معين ,والأن نقوم بالإشارة إليه(تفعيله initiate) في ال onCreate ميثود بعد setContentview  بهذه الطريقة


RatingBar simpleRatingBar = (RatingBar) findViewById(R.id.RatingBar); 

ونقوم بإرجاع عدد النجمات المختارة من قبل المستخدم من خلال الميثود getNumStars(); ستقوم بإرجاع عدد النجمات المختارة هكذا


int Starscount = simpleRatingBar.getNumStars(); 

بعد ذلك يمكنك حفظ القيمة في قاعدة البيانات القيمة تخزن في المتغير Starscount ,وبخصوص الحفظ والإسترجاع من قاعدة البيانات هل تريد مثال لقاعدة بيانات محلية ؟أم بإستخدام api أي حفظ عن بعد 

هلا بيك عزيزي

@Mohamd Imran

شكرا على ردك عزيزي

بنسبه ل نوع قاعدة البيانات

mysql

واستخدم Volley connection + php file

علي سيرفر محلي wmap

ياليت لو عندك مثال كيف اربطه باستخدام مكتبة Volley وكيف استعيد العدد او التقيم

وعذرا على الازعاج

بتاريخ منذ ساعة مضت قال عبود سمير:

مرحباً مروان 

تطبيق الأندرويد الخاص بك لا يستطيع التواصل مباشرة مع قاعدة البيانات MySQL وإنما يتم بناء واجهة برمجية API حيث أن التطبيق سيقوم بإرسال طلب ( request ) لهذه الواجهة و ترجع له رد ( response ) و يتم بناء هذه الواجهة بإستعمال إحدى لغات البرمجة التي تعمل في جانب الخادم 

فمثلا في حالتك عند تسجيل الدخول من طرف المستخدم من خلال التطبيق يتم التواصل مع الواجهة البرمجية بإرسال طلب بالمعلومات التي أدخلها المستخدم و بعدها تتم معالجة هذه البيانات من طرف ال back end و إرجاع رد للتطبيق. في حالة نجاح عملية تسجيل الدخول يتم إستعراض صفحات التطبيق التي تحتاج تسجيل الدخول أما في حالة فشل العملية يتم عرض رسالة خطأ للمستخدم 

مثلاً إذا نجح المستخدم في تسجيل دخوله للتطبيق يصبح بإمكانه عمل تقييم لمنتج و في هذه الحالة أيضا سيتم إرسال طلب او request للواجهة البرمجية و ستتم معالجة الطلب و حفظ البيانات في قاعدة البيانات و إرجاع رد للتطبيق 

ملاحظة: عملية التقييم لا تحتاج فقط إلى تسجيل الدخول بل إلى شرط إضافي و هو شراء المستخدم للمنتج الذي يريد أن يُقيِّمه

هذه هي الفكرة بشكل عام و تتضمن نقطتين و هما :

  1. بناء الواجهة البرمجية و عمل حماية لها 
  2. ربط التطبيق مع الواجهة البرمجية 

يتوجب عليك تجربة الواجهة البرمجية قبل ربط التطبيق معها 

بالتوفيق 

هلا بيك اخوي

شكرا على توضيح الفكره عزيزي

بنسبه للي ذكرته انته في الاعلى

اعرف اطبقه مافيه اي مشكله فيه كله واضح وتعامل مع قواعد البيانات وما سبق كله واضح

ولكن لم يسبق لي اضافة نظام التقيم وربطه ب قاعدة بيانات وموضوع معين هذا المشكله التي تواجهني

 

الشروحات التي وجدتها في الانترنت كلها لتقيم التطبيق او مجرد مثال بدون قاعدة بيانات

 

اكرر شكري لك عزيزي

تم التعديل في بواسطة مروان مروان3
  • 0
نشر
بتاريخ On 17‏/6‏/2020 at 09:38 قال Mohamd Imran:

وعليكم السلام أخي @مروان مروان3

الأمر سهل :) ,يمكنك عمل ذلك من خلال إضافة Ratingbar فيو في الlayout الذي تريد هكذا


<RatingBar
android:id="@+id/RatingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

وقم بإعطاءه id معين ,والأن نقوم بالإشارة إليه(تفعيله initiate) في ال onCreate ميثود بعد setContentview  بهذه الطريقة


RatingBar simpleRatingBar = (RatingBar) findViewById(R.id.RatingBar); 

ونقوم بإرجاع عدد النجمات المختارة من قبل المستخدم من خلال الميثود getNumStars(); ستقوم بإرجاع عدد النجمات المختارة هكذا


int Starscount = simpleRatingBar.getNumStars(); 

بعد ذلك يمكنك حفظ القيمة في قاعدة البيانات القيمة تخزن في المتغير Starscount ,وبخصوص الحفظ والإسترجاع من قاعدة البيانات هل تريد مثال لقاعدة بيانات محلية ؟أم بإستخدام api أي حفظ عن بعد 

هلا بيك عزيزي @Mohamd Imran

شاكر لك ي غالي كثير والسموحة والعذر لني تعبتك معي كثير  

ربي يرزقك جنات النعيم يا رب 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...