• 1615阅读
  • 49回复

关于原创达人勋章的研究修改及勋章自动回收任务 [复制链接] [手机版]

上一主题 下一主题
离线zhangjingyu

只看楼主 倒序阅读 使用道具 绿 楼主  发表于: 2021-09-18 15:08:05 星期六
前几天顾兄发帖勋章回收通知说他的原创达人勋章被回收了。我看了下顾兄的发帖情况,觉得他的原创达人勋章按理说应该早就回收了才对,但为什么直到在9月8日发表了主题“开始筹备厦门之行”之后的同时就收到了勋章回收的系统通知呢(27楼)?所以,我决定研究下。

经过几天的研究,结果如下:数据表中记录连续发主题天数的动作是受发表新主题控制的,并不是每天都更新的。(如果真是每天更新,顾兄的原创达人勋章应该早就被回收了)也就是说,只有当用户发表新主题的时候,数据表才会更新该用户对应的连续发新主题天数的相关数据,包括发主题当天0时0分0秒的时间戳和相应天数。(29楼)

主要研究过程记录在上面提到的顾兄发表的主题里。早一些的相关主题2019年1月24日:修改“忠实会员”勋章颁发条件可以顺带看看。主要的数据表是pw_member_behavior_statistic,里面记录有用户行为相关数据,包括:
            1=>'continue_login',        //'连续登录天数'
            2=>'continue_post',            //'连续发贴天数'
            3=>'continue_thread_post',    //'连续发主题天数'
            4=>'continue_punch',        //'连续打卡天数'
            5=>'continue_user_upgrade',    //'用户升级记录'
            6=>'today_add_follow',        //'记录今日关注'
家园论坛数据表,里面只有1到4,后面两个没有接触,也不知道具体是啥。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 沙发  发表于: 2021-09-18 15:47:30 星期六  点亮(0)

这就是上面提到的pw_member_behavior_statistic数据表,只有4个字段。“behavior”列里面的3就是表示连续发表主题天数,“lastday”列表示上一次发表主题当天0时0分0秒的时间戳。(32楼)

这是勋章中心截图。由于数据表只有在用户发表主题的时候才更新,所以勋章中心显示的连续主题天数并不是都准确的(只有当天发主题了才准确)。也同样的,即使原创达人勋章已经无效了,但由于用户没有发表主题而促使数据表更新,所以勋章并不会被回收。直到用户发表一篇新的主题后数据表更新,勋章也就被回收了,也就是顾兄的情况。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 板凳  发表于: 2021-09-18 16:25:42 星期六  点亮(0)
后台有一个“勋章自动回收”的计划任务,但却是关闭的。尝试打开测试也确实与原创达人勋章类的自动勋章无关,应该是回收手动颁发的具有有效期的勋章。本地已经开启测试,等待最后的测试结果。
发表于: 2021-09-18 11:51:55  点亮(0) 来自:本机地址  编辑
今天上午测试勋章有效期。把“合作商家认证”的有效期改为3天,同时申请颁发了。查看数据表,记录在pw_medal_award里。时间戳是1631934335,转换成具体时间就是2021-09-18 11:05:35。“勋章自动回收”(这个名称可能不太准确,到时候根据测试结果再修改)任务已经开启,到期的时候看看。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 地板  发表于: 2021-09-18 17:45:00 星期六  点亮(0)
主帖最前面提到的“勋章回收通知”这个主题记录了“研究”的过程,结果大致如上。41楼说:
研究了一圈,连续主题天数还是不会自动更新,勋章中心里显示的天数是来自数据表的,并不是准确的数据。既然数据表不能更新,那就将更新天数的工作交给前台吧。我想法儿在前台显示为准确的连续主题天数。
发这个主题算是官方总结和继续吧——既然研究了这么多天,而且基本都到半夜一两点钟(白天时间不多,收秋)——总得稍微修改下吧。原创达人勋章不能及时回收,勋章中心显示的天数不是实时准确的数据,不得不说,真是挺大的BUG。前一个问题解决不了,后一个似乎还有可能,所以发这个主题继续记录后面的修改工作。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 4楼 发表于: 2021-09-18 19:09:45 星期六  点亮(0)
修改工作是16号晚上开始的。之前想过修改的方法,觉得里面需要用到查询,也想过大致该怎么写查询语句。结果看到文件内容,觉得应该还好,不会太难。
apps/medal/action/behavior.php
  1. } elseif ($medalInfo['associate'] == 'continue_thread_post') {
  2.             $attention = '<p class="gray">注意:1天不登录,现有连续登录天数会减1</p>';
  3.             $notice = ($needNum > 0) ? '你还需连续发主题'.$needNum.'天' : '再发1主题帖即可获得此勋章';
  4.             $notice = $notice . '(现有天数:'.$num.')';
  5.             $nowhave = '(现有连续主题天数:'.$num.')';
  6.         } elseif
后面的“$nowhave = '(现有连续主题天数:'.$num.')';”这一行,就是图片中括号以及括号中的内容。

        $num = ($behavior) ? $behavior['num'] : 0;
        $needNum = $medalInfo['confine'] - $num;
该文件中上面的代码稍微向上一点儿有上面这两行,$behavior['num']就是连续天数,那最后发主题时间就是$behavior['lastday'],所以我说不用自己写查询了。

再往上有类似这样的代码:
$otherHtml = '<p class="mb5">获得时间:' . date('Y-m-d', $awardMedal['timestamp']) . '</p><p><span class="mr20">有效期:' . $medalInfo['confine'] . ' 天</span>'. '到期时间:' . date('Y-m-d', $awardMedal['deadline']) . '</p>';
也就是可以直接格式化时间。于是,尝试添加代码。
        //2021.9.16
        $pastday = ($tdtime - $behavior['lastday'])/86400;
        $shengyu = $num - $pastday +1;//截止到昨天的剩余天数
$nowhave行改为:
$nowhave = ($pastday > 0)? '(上次发主题时间:'.date('Y-m-d',$behavior['lastday']).',剩余连续天数:'.$shengyu.')' : '(今天已发主题,连续主题天数:'.$num.')';
代码没写错,因为勋章中心原创达人勋章那里显示基本正常。之所以说基本正常,是因为发主题时间有点儿对不上:明明是9月13日,但在勋章中心却显示是9月12日。把格式化时间的代码单独写出来,“$lasttime = date('Y-m-d',$behavior['lastday']);”结果还是显示9月12日。百思不得其解。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 5楼 发表于: 2021-09-18 19:31:29 星期六  点亮(0)
使用上面的date()函数显示9月12日,但使用get_date()函数却能正确显示为9月13日。而上面明明使用的也是date()函数,应该没问题的才对,怎么我这里就不行呢?幸亏我知道测试时间(lastday),要不然直接看见显示没问题就收工了,岂不是留下了后遗症?
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 6楼 发表于: 2021-09-18 21:04:54 星期六  点亮(0)
本来想在哈罗cq论坛发帖问问关于上面这两个函数显示时间有问题的原因,可想想又算了,也不一定有准确的回答。自己百度看看吧,看能不能找到答案。于是,在网上看,最后找到这样一条:
php 时间问题 date() getdate() time() 时间误差
php时间问题date()getdate()time()实际当前时间是2012/1/422:25echodate("Y-m-dh:i:s");结果是2012-01-04-10:01:52(与实际时间偏差近12小时)但是$arr=getdate(time())echo$arr['y'].$...展开
PHP默认时区设置是会导致时间误差的,你在运行这些函数之前,先调用一个函数即可: date_default_timezone_set('Etc/GMT-8'); 这个时区误差只是在时间上的误差,日期误差一般不大,所以你输出的年,月,日都是相同的。
看到最后,说年月日都是相同的,怎么我这里就不一样啊。

再回头看我写的代码,“$lasttime = date('Y-m-d',$behavior['lastday']);”忽然想到输出:这样的格式只输出年月日。修改下,改为“$lasttime = date('Y-m-d H:i:s',$behavior['lastday']);”这样就能输出具体的时间了。保存文件,刷新勋章中心页面显示为“2021-09-12 16:00:00”,怎么是前一天的16点呢?

再看get_date()函数的“$lasttime = get_date($behavior['lastday'],'Y-m-d H:i:s');”显示为“2021-09-13 00:00:00”,这才是正确的时间。那跟date()函数怎么差8个小时呢?想想,应该可能就是时区问题吧,只是我感觉不应该啊。

既然时间已经能正确显示,并且也大概知道了原因。只是,经过测试,我并不想显示最后发表主题的日期了,显示过去几天了更好些。修改代码后,显示如:“恭喜获得原创达人勋章(距离上次发主题已过去5天,到昨天剩余:27)”,我觉得这样不错。

$nowhave = ($pastday > 0)? '<span class="s3">(距离上次发主题已过去'.$pastday.'天,到昨天剩余:'.$shengyu.')</span>' : '<span class="s4">(今天已发主题,连续主题天数:'.$num.')</span>';
这是最后的修改代码,里面加了两个样式,以区分今天发和没发主题。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 7楼 发表于: 2021-09-18 22:43:48 星期六  点亮(0)
基本就是上面的这样了。说点儿其它的吧。

lib/user/behaviorservice.class.php
  1. /**
  2.          * 记录一个行为
  3.          * @param int $uid
  4.          * @param string $behavior
  5.          * @param int $lasttime
  6.          * @param bool $clear 未连续时清零
  7.          * @return array($num,$change)
  8.          */
  9.         function doBehavior($uid,$behavior,$lasttime=0,$clear = false) {
  10.                 global $tdtime;
  11.                 $uid = (int) $uid;
  12.                 $behavior = $this->_initBehavior($behavior);
  13.                 if (!$behavior || !$uid) return array(false,'数据有误');
  14.                 if ($lasttime && $lasttime>$tdtime) array(false,'无需操作');
  15.                 $statistic = $this->getBehaviorStatistic($uid, $behavior);
  16.                 if (!$statistic) {
  17.                         $this->addBehaviorStatistic(array('uid'=>$uid,'behavior'=>$behavior,'lastday'=>$tdtime,'num'=>1));
  18.                         //$this->addBehaviorLog($uid, $behavior, 1);
  19.                         return array(1,1);
  20.                 } else {
  21.                         if ($statistic['lastday']>=$tdtime) return array($statistic['num'],0);
  22.                         $changeDay = ($tdtime-$statistic['lastday'])/86400;
  23.                         $change = $changeDay == 1 ? 1 : 2-$changeDay;
  24.                         if ($clear) {
  25.                                 $newNum = $changeDay == 1 ? $statistic['num'] + 1 : 1;
  26.                         } else {
  27.                                 $newNum = $statistic['num'] + $change;
  28.                         }
  29.                         if ($newNum<=0) $newNum = 1;
  30.                         $this->updateBehaviorStatistic(array('lastday'=>$tdtime,'num'=>$newNum), $uid, $behavior);
  31.                         //if ($change) $this->addBehaviorLog($uid, $behavior, $change);
  32.                         return array($newNum,$change);
  33.                 }
  34.         }
  1. //2021.9.16
  2.         $pastday = ($tdtime - $behavior['lastday'])/86400;
  3.         $shengyu = $num - $pastday +1;//截止到昨天的剩余天数
上面是这个文件最前面的一个完整函数。下面是我自己写的,没有参考其它文件。可以看出$pastday和第23行的代码基本一致,$shengyu和28,24行的代码基本一致——我的“剩余”是累计到昨天,今天是加还是减没有算(取决于有没有发主题),所以是+1。上面的代码中是+2,那是因为“今天”发主题了。这个正好是“勋章回收通知”主题里29楼我写的公式:http://www.vtu425.com/read.php?tid=4123&ds=1&page=3#87302第26行代码就是上面帖子中我说的:“我想,如果这个过去的天数等于1(也就是说昨天发新主题了,今天又发了),就在原来上次的天数上加1;”。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 8楼 发表于: 2021-09-18 23:01:02 星期六  点亮(0)
对了,还有一处文字修改,是提示信息“注意:1天不登录,现有连续登录天数会减1”改成了:“注意:1天不发主题,现有连续天数会减1”,是对“勋章回收通知”主题里5楼的回复:
我感觉是这样:首先,这个勋章的有关描述可能不够准确,比如:1天不登录,现有连续登录天数会减1。
其次,这个勋章和发主题帖有关,和连续天数有关,这两点应该没异议,但跟登录应该关系不大。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 9楼 发表于: 2021-09-18 23:04:06 星期六  点亮(0)
今天下雨,才有时间发这个主题。费了不少的时间和脑细胞写了几个帖子,也不知道有用没有。好了,暂时这样吧。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!