uchome 积分体系
一。总体流程
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 积分体系的更多相关文章
- 搭建属于自己的VIP积分系统(1)
很久没写博客了,如果有写得不好的地方,还请多多见谅. 架构设计 需求分析 这篇文章主要是介绍此VIP系统的基础架构.说实在的,我其实对 架构方面也不是很懂,我这套框架 还是拿别人的东西改过来的,并不是 ...
- Java生鲜电商平台-电商会员体系系统的架构设计与源码解析
Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...
- Java生鲜电商平台-会员积分系统的设计与架构
Java生鲜电商平台-会员积分系统的设计与架构 说明:互联网平台积分体系主要用于激励和回馈用户在平台的消费行为和活动行为,一个良好的积分体系可以很好的提升用户的粘性及活跃度. 一.互联网平台积分体系设 ...
- 国内为什么没有好的 Stack Overflow 的模仿者?
国内为什么没有好的 Stack Overflow 的模仿者? 个人觉得, 高端的程序员会直接上stackoverflow提问, 所以国内中文的stackoverflow必然面对低端程序员. 鉴于中国程 ...
- 关于Apple Pay,一篇让你不看就会后悔的文章
编者按:本文作者康上明学为“小米生活”产品经理,在苹果Apple Pay发布后,他对该产品做了深入研究,带来这篇文章. 对于 Apple Pay ,我有几个疑问: 线下支付是一个庞大复杂的流程,当中涉 ...
- 新闻娱乐类APP的后端核心逻辑总结
一.主要功能: 用户:登录.注册(微信账号登录.手机号登录).修改.审核 内容:发布.审核.分享.点赞.收藏及置顶热推等相关操作 评论:发布.审核.点赞及热评等相关操作 消息推送:站内信如用户修改结果 ...
- 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车
朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车 [下载本文PDF进行阅读] 这里所说的三架马车是指微服务.消息队列和定时任务.如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构 ...
- PM九步法
本文转载自网络. 多年以后,当我面对那些年青的产品经理,我会想起自己当年从事的是一份高薪的工作.那是2000年,我大学毕业后在北京一家IT网站做搜索引擎PM,当时我一个月的薪水能在亚运村买一平方米房子 ...
- O2O(online to offline)营销模式
O2O营销模式又称离线商务模式,是指线上营销线上购买带动线下经营和线下消费.O2O通过打折.提供信息.服务预订等方式,把线下商店的消息推送给互联网用户,从而将他们转换为自己的线下客户,这就特别适合必须 ...
随机推荐
- Swing做的非阻塞式仿飞秋聊天程序
采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ...
- linux - 自动删除n天前日志
1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -m ...
- java基础学习之对象转型
对象转型(casting): 1)一个基类的引用类型变量可以指向其子类的对象 2)一个基类的引用不可以访问其子类对象新增加的成员(属性和方法) 3)可以使用引用变量instanceof类名,来判断该引 ...
- android开发 drawtext的开始坐标位置
我们canvas绘制文字的遇到一个不知道drawtext(str,x,y,paint) 中的x.y坐标值怎么定义,,如果设为(0,0)的话文字就不会出来了.因此查找到一下资料: 问:canvas.d ...
- android开发 两张bitmap图片合成一张图片
场景:对android4.4解码gif(解码文章见前面一篇)后的图片进行每帧处理,android4.3 解码出来的每帧都很完整,但是到android4.4版本就不完整了,每帧都是在第一帧的基础上把被改 ...
- modernizr.js
1.判断浏览器是否支持 h5 if(Modernizr.canvas){ alert(123); }else{ alert(321); } 2.判断浏览器是否支持 canvas function su ...
- cygwin chmod 失效
问题背景 为了在 Cygwin 下使用之前最喜爱的 screen 命令, 安装 Cygwin 时就选上了 screen 来运行一把 ganiks.liu@MAMIS-Gaiks-Liu /tmp $ ...
- String str=new String("a")和String str = "a"有什么区别?
问:String str=new String("a")和String str = "a"有什么区别? 答:String str = "a" ...
- Linux --windows vs
我其实并不是很清楚我在做什么....希望做完之后可以解答....... 在看了一堆GNU, Clang, GCC, QT, MinGW, CygWin, POSIX 这些概念之后,我觉得我在做的事情就 ...
- 17+个ASP.NET MVC扩展点,含源码{转}
1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.在自定义的HttpMo ...