7

Ich habe eine kleine MVC-Website, die für einen Friseursalon ist. Auf dieser Seite habe ich ein div, das verwendet wird, um eine Nummer anzuzeigen, die es aus einem Datenbankeintrag nimmt. Diese Zahl ist die aktuelle Anzahl der Personen, die in der Warteschlange auf einen Haarschnitt warten.Automatischer Countdown-Timer zum Anpassen der Datenbankaufzeichnung

Was ich zur Zeit habe, ist die Möglichkeit, sich auf einer "admin" -Seite anzumelden und diese Nummer mit einem Formular zu aktualisieren, von "2" bis "5", dann "5" in "6" ändern, abhängig davon, wie viele Menschen sitzen in dieser Schlange.

Dies ist eine manuelle Operation, wie sie derzeit steht. Code ist unten:

=============================

-Controller

[HttpPost] 
     public ActionResult Update(Data data) 
     { 
      if (ModelState.IsValid) 
      { 
       data.ID = 1; //EF need to know which row to update in the database. 
       db.Entry(data).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index", "Home"); 
      } 

      return View(data); 
     } 

= ===================================

Modellcode

{ 
    public class Data 
    { 
     public int ID { get; set; } 
     public string Queue_Number { get; set; } 
    } 

    public class DataDBContext : DbContext 
    { 
     public DbSet<Data>Queue { get; set; } 
    } 
} 

Was ich würde wirklich gerne geschehen, wenn Sie die Queue-Nummer manuell aus dem for aktualisiert haben m auf der "admin" -Seite Ich möchte einen automatischen Countdown von 20 Minuten (die ungefähre Zeit, die für den Haarschnitt benötigt wird) und dann die Queue Number automatisch um eins herunterregeln, bis sie "0" erreicht.

z.B. Wir haben 5 Leute in der Warteschlange, 20 Minuten später ist es automatisch auf 4 Personen eingestellt und die Webseite wird automatisch aktualisiert/aktualisiert, dann kommen noch 2 Leute herein, so dass wir sie manuell auf 6 Personen in der Warteschlange einstellen und der Timer startet erneut , jede 20 min dauert die Warteschlange wird um -1 angepasst, bis es auf "0" geht. Sobald es auf "0" steht, bleibt es dort, bis wir manuell weitere Personen zur Warteschlange hinzufügen.

Ich habe Angst, ich habe keine Ahnung, wie man überhaupt mit einer solchen Anfrage beginnt, oder auch wenn es möglich ist?

Ich wäre wirklich dankbar für jede Hilfe von den Experten hier, die in der Lage sein könnten, es für mich zu "babstep". Alle Informationen, die ich nicht zur Verfügung gestellt habe Ich werde versuchen, hinzuzufügen - Ich weiß, ich bin nicht der beste zu erklären :-(

Antwort

7

Haben Sie Ajax in Betracht gezogen? Speichern Sie die letzte aktualisierte Zeit auf die manuelle Einstellung der Flagge? Sie können die Ajax-Anfrage verwenden, um gleichzeitig mit jQuery-Set-Intervall zu laufen, was die Ajax-Anfrage alle 2 Minuten auslöst.Suche das letzte Mal, wenn es aktualisiert wurde, wenn es 20 Minuten lang ist, dann entferne eins aus der Datenbank Anzahl und jquery für Sie, diese Zahl aktualisieren.

ein ziemlich einfacher Prozess tatsächlich aber genauer auf die zugrunde liegenden Daten benötigen.

Hier ist, wie ich es Arbeit von Ihrem questio sehen n

Kontroller

public ActionResult ajaxUpdate() 
     { 
      //open connection 
      dbcontext db = new dbcontext(); 
      db.Connection.Open(); 

      // get the last updated record in the database. 
      var entry = db.Entry.OrderByDecending(m=> m.LastUpdatedDate).FirstOrDefault(); 

      //clean up 
      db.Connection.Close(); 
      db.Dispose(); 

      //return -1 as error 
      if(entry == null){ 

       return Json(-1,JsonRequestBehavior.AllowGet); 

      } 

      // get current number of people in queue 
      Int32 numberOfPeople = entry.QueueNumber; 

      TimeSpan span = DateTime.Now.Subtract(entry.LastUpdatedDate); 

      if(span.Minutes >= 20){ 

       // if 20 mins have passed assume a person has been completed since manual update 
       numberOfPeople--; 

      } 

      //this returns a number, alternatively you can return a Partial 
      return Json(numberOfPeople, JsonRequestBehavior.AllowGet); 
     } 

JQuery und Ajax

$(document).ready(function() { 

    // run function every x minutes 
    setInterval(function() { 
     UpdateQueue(); 
    }, 100000); 





}); 
    function UpdateQueue() { 

    $.ajax({ 
     cache: true, 
     type: 'POST', 
     url: "/ControllerName/ajaxUpdate", 
     async: false, 
     dataType: "json", 
     success: function (result) { 
      // on success result will be the number returned 

      // -1 is error 
      if (result == -1) { 
       return; 

      } 

      // check the -- didn't return a negative 
      if (result < 0) { 

       result = 0; 

      } 

      //find your element in the HTML to update 
      $('#NumberElement').text().replaceWith(result); 


     } 

    }); 


} 

Sie müssen sicherstellen, dass Sie Ihre jquery Bibliotheken schließen, bevor Sie diesen Code enthalten oder Sie müssen JQuery nicht definiert.

+0

Dank Craig, ich habe Ajax nicht in Betracht gezogen, hauptsächlich weil ich gerade erst begonnen habe, MVC zu verwenden, und keinen coding Hintergrund habe, so würde nicht wirklich eine Ahnung haben, wo ich anfangen soll. Ich schätze die Antwort jedoch. Ich habe noch nicht darüber nachgedacht, wie ich das angehen sollte, ein Teil der Frage war, Ideen zu bekommen, was eine gute Idee wäre, um zu erreichen, was ich will. Ich speichere derzeit nur die Queue-Nummer in der Datenbank, sonst nichts. – Harry

+2

@Harry Schauen Sie sich die Uhrzeit an und verwenden Sie dann jQuery und Ajax, um die Nummer ohne Aktualisierung zu aktualisieren. Es gibt eine Menge Dokumentation zu Ajax und Codebeispielen. Ich werde die Antwort aktualisieren, um Sie in Gang zu bringen. – CR41G14

+0

Danke Craig, ich werde anfangen, Ajax zu erforschen. Ich schätze deine Hilfe, nochmals vielen Dank. – Harry

4

Ich habe für Sie serverseitige Lösung mit ein wenig Threading gemacht.Ich hoffe, ich bin in kritischen Bereichen gesperrt.

Es hat den Vorteil, dass der Administrator Ihrer Anwendung nicht auf der Seite hängen muss, um die Anzahl der aktuellen Kunden herunterzurechnen (wie er es bei Ajax-Anfragen tun sollte).

Wie es

On 'Anzahl der Kunden-Update funktioniert es (falls erforderlich) neu Zählens-down Gewinde beginnt, die (Betten) für vordefinierte Intervall wartet, und verringert dann die Nummer.

public class CustomerAdminService 
{ 
    // time in milliseconds it will take to decrease number of waiting customers 
    const int sleepTime = 10000; 
    // current number of customers (just for simplicity - you can have it in db or somewhere else) 
    static int numberOfCustomers; 

    static Thread updaterThread; 

    // object lock 
    static readonly object locker = new Object(); 

    public int GetNumberOfCustomers() 
    { 
     return numberOfCustomers; 
    } 

    public void UpdateCustomers(int value) 
    { 
     lock (locker) 
     { 
      if (updaterThread == null) 
      { 
       //start new downcounting thread 
       updaterThread = new Thread(new ThreadStart(UpdateWorker)); 
       updaterThread.Start(); 
      } 
      SetNumberOfWaitingCustomers(value); 
     } 
    } 

    private void SetNumberOfWaitingCustomers(int value) 
    { 
     numberOfCustomers = value; 
    } 

    // downcounting thread method 
    private void UpdateWorker() 
    {  
     while (true) 
     { 
      // sleep for predefined time 
      Thread.Sleep(sleepTime); 
      lock (locker) 
      {    
       var number = GetNumberOfCustomers();    
       if (number <= 1) 
       { 
        // if number of currents customers is now zero - end the downcounting thread 
        SetNumberOfWaitingCustomers(0); 
        updaterThread = null; 
        return; 
       } 
       SetNumberOfWaitingCustomers(number - 1); 
      } 
     } 
    } 
} 

Kommentar: Sie können für einige Timer Rückwärtszählbetrieb Skript mit jQuery betrachten. Zeige etwas wie: Sie können in 40 Minuten serviert werden ;-)

1

Ja Ajax ist der Schlüssel. Es kann von Ihrer Website verwendet werden, um unbemerkt mit Ihrem Server zu kommunizieren.

1

Ein alternativer Ansatz wäre, die Zählung in der Datenbank nicht zu aktualisieren, sondern einfach eine Abfrage zu verwenden, um die Anzahl der Kunden innerhalb eines bestimmten Zeitraums zu bestimmen. Sie können dies tun, indem Sie das Modell so ändern, dass es anstelle von QueueNumber eine Ankunftszeit verwendet und den Controller so ändert, dass er einen neuen Datensatz einfügt.

{ 
    public class Data 
    { 
     public int ID { get; set; } 
     public DateTime Arrival_Time { get; set; } 
    } 

    public class DataDBContext : DbContext 
    { 
     public DbSet<Data> Queue { get; set; } 
    } 
} 

Auf diese Weise, wie andere vorgeschlagen haben Sie AJAX verwenden können, für die Anzahl der Personen in der Warteschlange mit einer Controller-Aktion abzufragen, die wie folgt aussehen könnte:

[HttpGet] 
public ActionResult NumberOfPeopleInQueue() 
{ 
    var result = db.NumberOfCustomersSince(DateTime.Now.AddMinutes(-20)); 
    return Json(result); 
} 

Das schöne an Dieser Ansatz ist, dass, wenn Frisuren beginnen sollten länger zu dauern (sagen wir 30 Minuten) Sie einfach die Abfrage ändern können und die Anwendung weiterhin funktioniert.