2011-05-11 52 views
3

所以我想在我的網站上設置成就係統。人們執行任務並上傳這些信息,然後存儲在數據庫中(想'時間','日期','任務'等)。檢查他們的信息和獎勵成就的最佳方法是什麼?我只是喜歡一個achievement.php,一旦上傳了信息,它會觸發這個文檔貫穿所有檢查,以確定用戶是否需要獲得成就?或者有什麼服務器端我應該設置獎勵用戶?網站設計:如何獎勵具有成就的用戶任務?

感謝任何幫助或建議,意見等:d

編輯:我目前有

任務存儲在數據庫中列出的成就,(ID,姓名,班級) (「DATE_TIME」,「時間」,「裝置」,「USER_ID [FK]」)

編輯2:也不少成果將不僅基於當前用戶提交的任務來計算,但考慮到以前的任務除了新增的任務之外。 EX:如果用戶在連續3天內完成了3個任務,那麼他們將被授予它

回答

1

它實際上取決於您的業務邏輯佈局的偏好所在,你要如何實時acheivements是。如果你想在你的sql服務器上卸載一堆業務邏輯,把它放在一個存儲過程中,否則,將計算分類到一個php類中,然後使用該類來確定新的成就。

我肯定會建議在正常頁面響應之外進行處理。也許會啓動一個服務器端的php cli調用,或者設置一個cron作業來運行所有的個體,並通過一定的時間間隔檢查結果。

編輯:

爲獎勵成績的實際方法,我會認爲你是最靈活,最簡單的實現(你會發現更多的簡單/不太靈活,更靈活/更少簡單的選擇我敢肯定)將創建一個AwardRunner類,一個IAward接口和一系列IAward的獨立實現,以獲得您的每個獎項。基本的想法是這樣的:

<?php 
    class AwardRunner { 
     var $UserId = 0; 

     function AwardRunner($userId) { 
      $this->UserId = $userId; 

      $dir = "/path/to/your/folder/full/of/IAwards/"; 
      $includes = read_dir($dir); 

      //include all files that exist 
      foreach($includes as $include) 
      { 
       if (is_file($include)) 
       { 
        require($include); 
       } 
      } 
     } 

     public function Run() { 
      $classList = get_declared_classes(); 

      foreach($classList as $key => $className) 
      { 
       if (in_array('IAward', class_implements($className))) { 
        $award = $className(); 
        $award->UserId = $this->UserId; 
        $award->GrantIfUserQualifies(); 
       } 
      } 

     } 

     //function for reading all files in a directory. 
     //this is recursive, so any files in subfolders will also make it in 
     function read_dir($dir) 
     { 
      $array = array(); 
      $d = dir($dir); 
      while (false !== ($entry = $d->read())) { 
       if($entry!='.' && $entry!='..') { 
        $entry = $dir.'/'.$entry; 
        if(is_dir($entry)) { 
         $array = array_merge($array, read_dir($entry)); 
        } else { 
         $array[] = $entry; 
        } 
       } 
      } 
      $d->close(); 
      return $array; 
     } 
} 
?> 

我想的IAward接口將是什麼樣子會從使用很清楚的,雖然你可能從你的表添加到它的ID字段想法所以它可以將自己插入到數據庫中,就像調用AwardRunner類一樣。

這個想法應該是有效的,無論你是否有一些批處理循環遍歷所有用戶的獎勵過程,或者是在每次提交任務後將其關閉。

+0

運行檢查服務器上的成就,獨立於用戶的體驗,聽起來像迄今爲止的最佳解決方案。我只是不確定我應該如何去檢查成就獎。現在我有一個頁面,其中包含一系列成就條件。然而,由於各種原因,這似乎不是最佳解決方案。有任何想法嗎? – daveomcd 2011-05-11 18:07:07

+1

@daveomcd,看修改後的答案。 – 2011-05-12 16:56:57

+0

非常感謝,我覺得我很接近一個完整的新手在這個東西,但我相信能理解你在上面做的所有事情。我從來沒有想過這樣做,至少現在似乎是一個令人驚歎的建立方式! :)感謝所有的幫助,現在我將開始設置它! – daveomcd 2011-05-12 18:08:38

2

最好的辦法是創建一個任務的點值表,然後創建一個可以獲取的存儲過程來自適當表格的適當計數並將其乘以點值。這就是我過去所做的 - 它允許您從數據庫中隨時修改點值。

+2

存儲過程在數據庫中?我強烈建議不要這樣做 – dynamic 2011-05-11 17:33:39

+0

這些任務並沒有真正的點值,它們只是基於稀有度而分成三類。我要設置它的方式是創建一個php文件,該文件將根據用戶完成的最新任務執行一系列條件。許多獎項都是基於數據的積累。 (對於實例:人員在5天內完成5個任務,[或1天,等等...])在用戶上傳任務後執行這些條件的文件的這種方法似乎不是最佳解決方案。 – daveomcd 2011-05-11 17:40:59

+0

然後刪除pointValue表並手動計算您的稀有度..? – Dutchie432 2011-05-11 18:53:33

1

如何創建的任務提交PROC觸發(或不過你插入數據時,用戶完成任務),這則執行該用戶的必要的行動,以確定他/她獲得的成績,然後相應地更新成就表。

然後,每一次你加載了對前端用戶的信息,數據就已經是對他/她的成績表,您可以直接訪問它(我敢肯定你已經做到了)。