一。总体流程

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. 消息点击事件的响应链---hitTest:withEvent:方法

    *当用户点击屏幕时,会产生一个触摸事件,系统会将触摸事件加入到 UIApplication管理事件队里中 *UIApplication 会从事件队列中取出最前面的事件进行分发以便处理,通常,先发送事件 ...

  2. jira的插件

    jira的插件开发流程实践   怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项 ...

  3. "Mac OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("Mac OS X"想使用系统钥匙串)

    不知什么时候开始,每次我在运行xcode在真机上,或者archive打包的时间,都会弹出输入用户名和密码的框,搞的烦死了: 解决方法: 打开钥匙串访问 双击那些密钥弹出框: 改变到允许所有应用程序访问 ...

  4. 9、android开发之java.lang.verifyError(转载)

    原文链接: http://www.linuxidc.com/Linux/2012-08/67289.htm 解决方案: 最近在做一个Android开发小项目的时候,遇到java.lang.verify ...

  5. 缓存应用--Memcached分布式缓存简介

    一.   什么是Memcached Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态. ...

  6. Application, JDBC, 数据库连接池, Session, 数据库的关系

    RT,这几个东东已经困扰我很长一段时间了... 这次争取把她们理清楚了! 参考资料: 1. 数据库连接池:http://www.cnblogs.com/shipengzhi/archive/2011/ ...

  7. 玩具装箱 bzoj1010 斜率优化

    斜率优化的题好像都是这样的方程:左边关于j,k的一个(...)/(...)的式子,右边是个只与i有关的可算的数字: 然后把它放到二维坐标轴上,用单调队列维护一个凸壳,O(n)的复杂度: 这道题但是我发 ...

  8. javascript中继承(二)-----借用构造函数继承的个人理解

    本人目录如下: 零.寒暄&回顾 一,借用构造函数 二.事件代理 三,call和apply的用法 四.总结 零.寒暄&回顾 上次博客跟大家分享了自己对原型链继承的理解,想看的同学欢迎猛击 ...

  9. vsm shadowmap format

    遇到个奇怪的问题. 在做vsm ,shadowmap format RGBA8 结果正常 RGBA16F 场景不形成阴影的地方变纯黑,因为sm里面这些地方变纯黑(感觉这个好修一些) RGBA32F 阴 ...

  10. jdbc读取数据库表

    把结果集封装为List // 通过结果集元数据封装List结果集 public static List<Map<String, Object>> read(String sql ...