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通过打折.提供信息.服务预订等方式,把线下商店的消息推送给互联网用户,从而将他们转换为自己的线下客户,这就特别适合必须 ...
随机推荐
- QT 环境下开发socketCan接口程序
使用头文件 #include <QMainWindow>#include "QTimer"#include "QTime"#include &quo ...
- [uwp开发]数据绑定那些事(2)
接着上一篇来侃. 二.实体到控件之间的绑定 这儿不知道用实体这个词恰不恰当,凑活着理解就行了.他可以是一个类实例,也可以是一个集合. 所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数 ...
- 结队开发项目—NABC模型
特点:可以避免食堂的用餐高峰,从而使使用者节约时间 need:很多学生中午下课在食堂吃饭会遭遇用餐高峰,使用这款软件,可以提前订饭,按时送达,从而避免食堂的用餐高峰期. approach:学生可以提前 ...
- Mac下安装及配置Eclipse
1.安装Eclipse前先确认你的Mac上是否已安装java运行环境.进入终端,输入”java -version”,如果返回了java版本号则说明已安装,否则,请先安装java运行环境: 2.访问ec ...
- js—对象
一.创建对象 var car = new Object(); var car = {}; 二.属性和方法 var car = { color : "red", run : func ...
- SwipeBackLayout的使用方法,右滑返回
使用方法: 需要右滑返回的activity继承baseActivity就可以, 如: public class SettingActivity extends BaseActivity {} 为防止滑 ...
- 利用doScroll在IE浏览器里模仿DOMContentLoaded
稍微了解一点框架的事件绑定的都知道 window.onload 事件需要在页面所有内容(包括图片.flash.iframe等)加载完后,才执行,但往往我们更希望在 DOM 一加载完就执行脚本,而各大框 ...
- 省选加油>_<
今天没有写题诶……看了看以前的模板……明天就要省选了>_<加油~~ 要不再去打局dota吧>_>
- 用vs2010 编写C语言程序,VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
编译mongodb-src-r2.2.2出现以下问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 这个是由于日志文件引起的,可以将 项目\ ...
- WaitForTargetFPS
WaitForTargetFPS,是关于帧数限制的,你可能开了垂直同步,其实是防止撕裂.先说撕裂,在显示器的帧缓存会被不同步的显卡的帧缓存给替换掉,导致显示器显示到一半的时候,内存被换掉,你看到上频是 ...