我正在考虑设计一个在我的网站上使用的成就系统的最佳方法.数据库结构可以在最佳方式找到,告诉3个或更多连续记录缺失,这个线程实际上是从开发人员那里获得想法的扩展.
我在这个网站上有很多关于徽章/成就系统的讨论就是这个问题 - 这都是谈话而不是代码.实际的代码实现示例在哪里?
我在这里提出一个设计,我希望人们可以做出贡献,并希望为编码可扩展的成就系统创建一个好的设计.我不是说这是最好的,远非它,但它是一个可能的起点.
请随时提出您的想法.
我的系统设计理念
似乎普遍的共识是创建一个"基于事件的系统" - 每当一个已知事件发生时,如创建,删除等帖子,它就像这样调用事件类.
$event->trigger('POST_CREATED', array('id' => 8));
Run Code Online (Sandbox Code Playgroud)
然后事件类找出哪些徽章正在"监听"此事件,然后查找requires该文件,并创建该类的实例,如下所示:
require '/badges/' . $file;
$badge = new $class;
Run Code Online (Sandbox Code Playgroud)
然后它调用默认事件传递调用时收到的数据trigger;
$badge->default_event($data);
Run Code Online (Sandbox Code Playgroud)
徽章
这就是真正的魔法发生的地方.每个徽章都有自己的查询/逻辑,以确定是否应颁发徽章.每个徽章都以例如以下格式列出:
class Badge_Name extends Badge
{
const _BADGE_500 = 'POST_500';
const _BADGE_300 = 'POST_300';
const _BADGE_100 = 'POST_100';
function get_user_post_count()
{
$escaped_user_id = mysql_real_escape_string($this->user_id);
$r = mysql_query("SELECT COUNT(*) FROM posts
WHERE userid='$escaped_user_id'");
if ($row = mysql_fetch_row($r))
{
return $row[0];
}
return 0;
}
function default_event($data)
{ …Run Code Online (Sandbox Code Playgroud) 我一直在考虑如何在新网站上实现类似于SO的徽章功能.存储徽章标准的最佳方法是什么?
两个想法:
还有更好的方法吗?