2011-05-11 53 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触发(或不过你插入数据时,用户完成任务),这则执行该用户的必要的行动,以确定他/她获得的成绩,然后相应地更新成就表。

然后,每一次你加载了对前端用户的信息,数据就已经是对他/她的成绩表,您可以直接访问它(我敢肯定你已经做到了)。