一。总体流程

1):管理员在后台修改积分规则
2):数据被写入数据表creditrule 中,并将数据写入缓存文件data/data_creditrule.php 中
3):用户发表文章或者进行其他操作的时候,通过getreward函数来获取奖罚积分  
4):将数据写入用户数据库表space中,从而增加或减少用户积分

二。具体文件

1):UCHOME积分变动提示是通过footer.htm的showreward()来监控

2):showreward()在source/script_common.js中

function showreward() {
if(Cookie.get('reward_notice_disable')) {
return false;
}
var x = new Ajax();
x.get('do.php?ac=ajax&op=getreward', function(s){
if(s) {
msgwin(s, 2000);
}
});
}

3):AJAX处理页面source/do_ajax.php中的getreward部分

elseif($op == 'getreward') {
$reward = '';
if($_SCOOKIE['reward_log']) {
$log = explode(',', $_SCOOKIE['reward_log']);
if(count($log) == 2 && $log[1]) {
@include_once(S_ROOT.'./data/data_creditrule.php');
$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('creditlog')." WHERE clid='$log[1]'");
$creditlog = $_SGLOBAL['db']->fetch_array($query);
$rule = $_SGLOBAL['creditrule'][$log[0]];
$rule['cyclenum'] = $rule['rewardnum']? $rule['rewardnum'] - $creditlog['cyclenum'] : 0;
}
ssetcookie('reward_log', '');
} }

 

三。关键函数

//获取指定动作能获得多少积分
function getreward($action, $update=1, $uid=0, $needle='', $setcookie = 1) {
global $_SGLOBAL, $_SCOOKIE; $credit = 0;
$reward = array(
'credit' => 0,
'experience' => 0
);
$creditlog = array();
@include_once(S_ROOT.'./data/data_creditrule.php');
$rule = $_SGLOBAL['creditrule'][$action]; if($rule['credit'] || $rule['experience']) {
$uid = $uid ? intval($uid) : $_SGLOBAL['supe_uid'];
if($rule['rewardtype']) {
//增加积分
$query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('creditlog')." WHERE uid='$uid' AND rid='$rule[rid]'");
$creditlog = $_SGLOBAL['db']->fetch_array($query); if(empty($creditlog)) {
$reward['credit'] = $rule['credit'];
$reward['experience'] = $rule['experience'];
$setarr = array(
'uid' => $uid,
'rid' => $rule['rid'],
'total' => 1,
'cyclenum' => 1,
'credit' => $rule['credit'],
'experience' => $rule['experience'],
'dateline' => $_SGLOBAL['timestamp']
);
//判断是否需要去重
if($rule['norepeat']) {
if($rule['norepeat'] == 1) {
$setarr['info'] = $needle;
} elseif($rule['norepeat'] == 2) {
$setarr['user'] = $needle;
} elseif($rule['norepeat'] == 3) {
$setarr['app'] = $needle;
}
} if(in_array($rule['cycletype'], array(2,3))) {
$setarr['starttime'] = $_SGLOBAL['timestamp'];
}
$clid = inserttable('creditlog', $setarr, 1);
} else {
$newcycle = false;
$setarr = array();
$clid = $creditlog['clid'];
switch($rule['cycletype']) {
case 0: //一次性奖励
break;
case 1: //每天限次数
case 4: //不限周期
$sql = 'cyclenum+1';
if($rule['cycletype'] == 1) {
$today = sstrtotime(sgmdate('Y-m-d'));
//判断是否为昨天
if($creditlog['dateline'] < $today && $rule['rewardnum']) {
$creditlog['cyclenum'] = 0;
$sql = 1;
$newcycle = true;
}
}
if(empty($rule['rewardnum']) || $creditlog['cyclenum'] < $rule['rewardnum']) {
//验证是否为需要去重操作
if($rule['norepeat']) {
$repeat = checkcheating($creditlog, $needle, $rule['norepeat']);
if($repeat && !$newcycle) {
return $reward;
}
}
$reward['credit'] = $rule['credit'];
$reward['experience'] = $rule['experience'];
//更新次数
$setarr = array(
'cyclenum' => "cyclenum=$sql",
'total' => 'total=total+1',
'dateline' => "dateline='$_SGLOBAL[timestamp]'",
'credit' => "credit='$reward[credit]'",
'experience' => "experience='$reward[experience]'",
);
}
break; case 2: //整点
case 3: //间隔分钟
$nextcycle = 0;
if($creditlog['starttime']) {
if($rule['cycletype'] == 2) {
//上一次执行时间
$start = sstrtotime(sgmdate('Y-m-d H:00:00', $creditlog['starttime']));
$nextcycle = $start+$rule['cycletime']*3600;
} else {
$nextcycle = $creditlog['starttime']+$rule['cycletime']*60;
}
}
if($_SGLOBAL['timestamp'] <= $nextcycle && $creditlog['cyclenum'] < $rule['rewardnum']) {
//验证是否为需要去重操作
if($rule['norepeat']) {
$repeat = checkcheating($creditlog, $needle, $rule['norepeat']);
if($repeat && !$newcycle) {
return $reward;
}
}
$reward['experience'] = $rule['experience'];
$reward['credit'] = $rule['credit']; $setarr = array(
'cyclenum' => "cyclenum=cyclenum+1",
'total' => 'total=total+1',
'dateline' => "dateline='$_SGLOBAL[timestamp]'",
'credit' => "credit='$reward[credit]'",
'experience' => "experience='$reward[experience]'",
);
} elseif($_SGLOBAL['timestamp'] >= $nextcycle) {
$newcycle = true;
$reward['experience'] = $rule['experience'];
$reward['credit'] = $rule['credit']; $setarr = array(
'cyclenum' => "cyclenum=1",
'total' => 'total=total+1',
'dateline' => "dateline='$_SGLOBAL[timestamp]'",
'credit' => "credit='$reward[credit]'",
'starttime' => "starttime='$_SGLOBAL[timestamp]'",
'experience' => "experience='$reward[experience]'",
);
}
break;
} //记录操作历史
if($rule['norepeat'] && $needle) {
switch($rule['norepeat']) {
case 0:
break;
case 1: //信息去重
$info = empty($creditlog['info'])||$newcycle ? $needle : $creditlog['info'].','.$needle;
$setarr['info'] = "`info`='$info'";
break;
case 2: //用户去重
$user = empty($creditlog['user'])||$newcycle ? $needle : $creditlog['user'].','.$needle;
$setarr['user'] = "`user`='$user'";
break;
case 3: //应用去重
$app = empty($creditlog['app'])||$newcycle ? $needle : $creditlog['app'].','.$needle;
$setarr['app'] = "`app`='$app'";
break;
}
}
if($setarr) {
$_SGLOBAL['db']->query("UPDATE ".tname('creditlog')." SET ".implode(',', $setarr)." WHERE clid='$creditlog[clid]'");
} }
if($setcookie && $uid = $_SGLOBAL['supe_uid']) {
//其中有新值时才重写cookie值
if($reward['credit'] || $reward['experience']) {
$logstr = $action.','.$clid;
ssetcookie('reward_log', $logstr);
$_SCOOKIE['reward_log'] = $logstr;
}
}
} else {
//扣除积分
$reward['credit'] = "-$rule[credit]";
$reward['experience'] = "-$rule[experience]";
}
if($update && ($reward['credit'] || $reward['experience'])) {
$setarr = array();
if($reward['credit']) {
$setarr['credit'] = "credit=credit+$reward[credit]";
}
if($reward['experience']) {
$setarr['experience'] = "experience=experience+$reward[experience]";
}
$_SGLOBAL['db']->query("UPDATE ".tname('space')." SET ".implode(',', $setarr)." WHERE uid='$uid'");
}
}
return array('credit'=>abs($reward['credit']), 'experience' => abs($reward['experience']));
}

uchome 积分体系的更多相关文章

  1. 搭建属于自己的VIP积分系统(1)

    很久没写博客了,如果有写得不好的地方,还请多多见谅. 架构设计 需求分析 这篇文章主要是介绍此VIP系统的基础架构.说实在的,我其实对 架构方面也不是很懂,我这套框架 还是拿别人的东西改过来的,并不是 ...

  2. Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

    Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...

  3. Java生鲜电商平台-会员积分系统的设计与架构

    Java生鲜电商平台-会员积分系统的设计与架构 说明:互联网平台积分体系主要用于激励和回馈用户在平台的消费行为和活动行为,一个良好的积分体系可以很好的提升用户的粘性及活跃度. 一.互联网平台积分体系设 ...

  4. 国内为什么没有好的 Stack Overflow 的模仿者?

    国内为什么没有好的 Stack Overflow 的模仿者? 个人觉得, 高端的程序员会直接上stackoverflow提问, 所以国内中文的stackoverflow必然面对低端程序员. 鉴于中国程 ...

  5. 关于Apple Pay,一篇让你不看就会后悔的文章

    编者按:本文作者康上明学为“小米生活”产品经理,在苹果Apple Pay发布后,他对该产品做了深入研究,带来这篇文章. 对于 Apple Pay ,我有几个疑问: 线下支付是一个庞大复杂的流程,当中涉 ...

  6. 新闻娱乐类APP的后端核心逻辑总结

    一.主要功能: 用户:登录.注册(微信账号登录.手机号登录).修改.审核 内容:发布.审核.分享.点赞.收藏及置顶热推等相关操作 评论:发布.审核.点赞及热评等相关操作 消息推送:站内信如用户修改结果 ...

  7. 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车

    朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车 [下载本文PDF进行阅读] 这里所说的三架马车是指微服务.消息队列和定时任务.如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构 ...

  8. PM九步法

    本文转载自网络. 多年以后,当我面对那些年青的产品经理,我会想起自己当年从事的是一份高薪的工作.那是2000年,我大学毕业后在北京一家IT网站做搜索引擎PM,当时我一个月的薪水能在亚运村买一平方米房子 ...

  9. O2O(online to offline)营销模式

    O2O营销模式又称离线商务模式,是指线上营销线上购买带动线下经营和线下消费.O2O通过打折.提供信息.服务预订等方式,把线下商店的消息推送给互联网用户,从而将他们转换为自己的线下客户,这就特别适合必须 ...

随机推荐

  1. 【转载】about slack

    About Slack slack is the difference b/w the REQUIRED TIME and the ARRIVAL TIME. 1.WHAT IS SLACK WITH ...

  2. 简单修改 MySQL 的 root 账号密码

    首先这是一篇非常非常初级的教程. 平时为了方便,经常是直接在网上下载 PHP + MySQL 的集成环境,但有一些 MySQL 的 root 账号是没有密码的(例如大名鼎鼎的 XAMPP 就是这样), ...

  3. 软件工程实践小队Scrum Meeting

    例会记录 时间:2013年10月20日星期日 Part 1 会议要点: 1. 小组讨论PM.Dev.Test的各自特点: 2. 小组讨论我们的项目网上教学问答系统的相关问题: 3.确定小组成员在第一轮 ...

  4. js毫秒数转换成时间格式

    Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + ...

  5. camera render texture 游戏里的监控视角

    Camera里: 新建render texture并拖入到target texture里 新建材质球 拖入render texture      camera里的视角会在材质球上出现  新建一个pla ...

  6. Node.js 项目搭建

    关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...

  7. android开发 wifi开发不稳定性测试

    场景:工厂定制机器,要求一个设备创建wifi热点,一个设备去连接.但是现在发现wifi连接很不稳定,主要以下3方面: 1.连接之前,不容易连接上 2.连接上之后,连不到外网 3.连接上之后,稳定性不好 ...

  8. 《IT小小鸟》阅读心得

    我是一个不爱看书的人,认为看那些又臭又长废话连篇的书是在浪费时间,但我不认为在那么多的书中没有好书,在一次的职业生涯规划中老师推荐了这本书,一开始认为不值得一看,但还是拿了起来,读了有不少的感触. 书 ...

  9. ionic 运行过程中动态切换API服务器地址

    ionic 运行过程中动态切换API服务器地址 keywords: ionic,phonegap,cordova,网络制式,动态切换,变更,API,服务器地址,$resource,localstora ...

  10. NYOJ-655 光棍的YY AC 分类: NYOJ 2013-12-29 19:24 224人阅读 评论(0) 收藏

    #include<stdio.h> #include<string.h> char str[210]; int max[210][52]={0}; int sum(int n, ...