• 785阅读
  • 17回复

关于在帖子阅读页头像弹出层显示今日发帖数的研究 [复制链接] [手机版]

上一主题 下一主题
在线zhangjingyu

只看楼主 倒序阅读 使用道具 绿 楼主  发表于: 2022-01-14 21:54:06 星期五
前天晚上突然有个想法:
你说在头像弹出层把今日发帖数也显示下,会不会更好。
http://www.vtu425.com/read.php?tid=4212&ds=1#89402

本来是没有看到顾兄在论坛发帖,以为他没来。但从头像弹出层的最后登录时间来看,其实前天顾兄是登录了论坛的,只是没有发帖,所以也是突然间有了想把今日发帖数显示下的想法。只是没想到,看似简单的工作,愣是花了昨天和今天数个小时的时间才成功实现。本地测试通过后,家园论坛文件也已经修改,还需要后续持续观察。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 沙发  发表于: 2022-01-14 22:19:37 星期五  点亮(0)
在read.htm文件中,像:
<li><span>注册时间</span>{$read[regdate]}</li>
<li><span>最后登录</span>{$read[lastlogin]}</li>
<li><span>发帖</span>$read[postnum]</li>
这样的代码中的变量大多可以直接或(通过read.php)稍加转换就可以输出。有的字段和今日发帖数的字段“todaypost”一样存在于会员数据表(pw_memberdata)中。所以我想,添加“<li><span>今日发帖</span>{$read[todaypost}</li>”这样一行代码就可以了。结果,没有结果!那可能是没有查询结果,查询在哪里呢?想办法加上查询应该就可以了。

以“regdate”在read.php文件中搜索,果然找到了,而且正是查询,那把“todaypost”添加进去就应该可以了啊(红色的“,md.todaypost”)!
//@
$threadService = L::loadClass('threads','forum');
$atData = $threadService->getAtUsers($tid,$pids);
//读取用户信息

if ($_uids) {
    $_userIds = array_keys($_uids);
    if (perf::checkMemcache()){
        $_cacheService = Perf::gatherCache('pw_members');
        $pwMembers = $tableinfo ? $_cacheService->getAllByUserIds($_userIds, true, true, true) : $_cacheService->getAllByUserIds($_userIds, true, true);
        $showCustom && $customdb = $_cacheService->getMemberCreditByUserIds($_userIds);
        $db_showcolony && $colonydb = $_cacheService->getCmemberAndColonyByUserIds($_userIds);    
        //为了兼容原来版本中的查询字段取别名 'icon as micon'
        if (S::isArray($pwMembers)){
            foreach ($pwMembers as $k=>$v){
                $pwMembers[$k]['micon'] = $pwMembers[$k]['icon'];
                unset($pwMembers[$k]['icon']);
            }
        }
    } else {
        $_dbCacheService = Perf::gatherCache('pw_membersdbcache');
        list($pwMembers, $customdb, $colonydb) = $_dbCacheService->getUserDBCacheByUserIds($_userIds, $showCustom, $db_showcolony, $showfield);
        /**
        $skey = array();
        foreach ($_uids as $key=>$value) {
            $skey[$value] = $key;
            $db_showcolony && $skey['UID_GROUP_'.$key] = $key;
            $showCustom && $skey['UID_CREDIT_'.$key] = $key;
        }
        
        $_cache = getDatastore();
        $arrValues = $_cache->get(array_keys($skey));
    
        $tmpUIDs = $tmpGROUPs = $tmpGROUPs = $tmpCacheData = $tmpColonydb = $tmpCustomdb = array();
        foreach ($skey as $key=>$value) {
            $prefix = substr($key,0,strrpos($key,'_'));
    
            switch ($prefix) {
                case 'UID' :
                    if (!isset($arrValues[$key])) {
                        $tmpUIDs[$key] = $value;
                        $tmpCacheData[$key] = '';
                    } else {
                        $pwMembers[$value] = $arrValues[$key];
                    }
                    break;
                case 'UID_CREDIT' :
                    if (!isset($arrValues[$key])) {
                        $tmpCREDITs[$key] = $value;
                        $tmpCustomdb[$key] = '';
                    } else {
                        $customdb[$value] = $arrValues[$key];
                    }
                    break;
                case 'UID_GROUP' :
                    if (!isset($arrValues[$key])) {
                        $tmpGROUPs[$key] = $value;
                        $tmpColonydb[$key] = '';
                    } else {
                        $colonydb[$value] = $arrValues[$key];
                    }
                    break;
            }
        }
        if ($db_showcolony && $tmpGROUPs) {#会员群组信息
            $query = $db->query("SELECT c.uid,cy.id,cy.cname"
                                . " FROM pw_cmembers c LEFT JOIN pw_colonys cy ON cy.id=c.colonyid"
                                . " WHERE c.uid IN(".S::sqlImplode($tmpGROUPs,false).") AND c.ifadmin!='-1'");
            while ($rt = $db->fetch_array($query)) {
                $colonydb[$rt['uid']] = $tmpColonydb['UID_GROUP_'.$rt['uid']] = $rt;
            }
            is_object($_cache) && $_cache->update($tmpColonydb,3600);
            $db->free_result($query);
        }
    
        if ($showCustom && $tmpCREDITs) {#自定义积分显示
            $query = $db->query("SELECT uid,cid,value FROM pw_membercredit WHERE uid IN(".S::sqlImplode($tmpCREDITs,false).")");
            while ($rt = $db->fetch_array($query)) {
                $customdb[$rt['uid']][$rt['cid']] = $rt['value'];
                $tmpCustomdb['UID_CREDIT_'.$rt['uid']][$rt['cid']] = $rt['value'];
            }
            is_object($_cache) && $_cache->update($tmpCustomdb,3600);
            $db->free_result($query);
        }
    
        if ($tmpUIDs) {#会员信息
            $query = $db->query("SELECT m.uid,m.username,m.gender,m.oicq,m.aliww,m.groupid,m.memberid,m.icon AS micon ,m.hack,m.honor,m.signature,m.regdate,m.medals,m.userstatus,md.postnum,md.digests,md.rvrc,md.money,md.credit,md.currency,md.thisvisit,md.lastvisit,md.onlinetime,md.starttime,md.todaypost $fieldinfo FROM pw_members m LEFT JOIN pw_memberdata md ON m.uid=md.uid $tableinfo WHERE m.uid IN (".S::sqlImplode($tmpUIDs,false).") ");
            while ($rt = $db->fetch_array($query)) {
                is_array($pwMembers[$rt['uid']]) ? $pwMembers[$rt['uid']] += $rt : $pwMembers[$rt['uid']] = $rt;
                $tmpCacheData['UID_'.$rt['uid']] = $rt;
                $todaypost=$rt['todaypost'];//2021.1.13
            }
            is_object($_cache) && $_cache->update($tmpCacheData,3600);
            $db->free_result($query);
        }
        unset($skey,$_uids,$_cache,$tmpUIDs,$tmpCREDITs,$tmpGROUPs,$tmpColonydb,$tmpCustomdb,$tmpCacheData);
        **/
    }
}
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 板凳  发表于: 2022-01-14 22:28:21 星期五  点亮(0)
结果,还是没有结果! 再仔细看代码,发现上面的代码中大多代码是不起作用的,也就是两个黄色背景色标记间的代码都注释了,不会被执行的,所以添加的查询根本没用。那查询到底在哪里呢?
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 地板  发表于: 2022-01-14 22:32:55 星期五  点亮(0)
上面大概就是昨天下午进行的工作,然后三点四十左右才去学校接孩子放寒假。

今天上午简单修改了下个人中心/个人空间里的“帖子”,然后继续研究这个看似简单实则不那么简单的工作。
初二寒假放假
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 4楼 发表于: 2022-01-14 22:38:35 星期五  点亮(0)
找不到查询,只能继续看read.php文件中的代码。当看到1楼那部分代码时,也就是第一处黄色背景色标记的上面,里面有“getUserDBCacheByUserIds”,而这应该是一个函数啊!
list($pwMembers, $customdb, $colonydb) = $_dbCacheService->getUserDBCacheByUserIds($_userIds, $showCustom, $db_showcolony, $showfield);
于是搜索它。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 5楼 发表于: 2022-01-14 22:41:16 星期五  点亮(0)
果然在lib/gather/gathercache/pw_membersdbcache.cache.php文件中找到了:
    /**
     * 从dbcache获取用户信息, 积分信息,群组信息 (该函数仅供read.php页面调用)
     *
     * @param array $userIds
     * @param boolean $showCredit 是否要获取积分信息
     * @param boolean $showColony 是否要获取群组信息
     * @param boolean $withMemberInfo 是否获取MemberInfo信息
     * @return array()
     */
    function getUserDBCacheByUserIds($userIds, $showCredit = false, $showColony = false, $showfield = false) {
        if (!S::isArray($userIds)) return array(array(), array(), array());
        $membersKeys = $colonyKeys = $creditKeys = $members = $colony = $credit = array ();
        foreach ( $userIds as $userId ) {
            $membersKeys [$this->_getMembersKey($userId)] = $userId;
            $showCredit && $creditKeys [$this->_getCreditKey($userId)] = $userId;
            $showColony && $colonyKeys [$this->_getColonyKey($userId)] = $userId;            
        }
        $tmpResult = $this->get(array_keys($membersKeys + $colonyKeys + $creditKeys));
        if ($tmpResult){
            foreach ( $tmpResult as $key => $value ) {
                if (!is_array($value)) continue;
                if (isset($membersKeys[$key])){
                    $members[$membersKeys[$key]] = $value;
                    unset($membersKeys[$key]);
                }else if (isset($creditKeys[$key])){
                    $credit[$creditKeys[$key]] = $value;
                    unset($creditKeys[$key]);
                }else if (isset($colonyKeys[$key])){
                    $colony[$colonyKeys[$key]] = $value;
                    unset($colonyKeys[$key]);            
                }
            }
        }
        if ($membersKeys) { #会员信息
            $members += (array)$this->_getMembersByUserIdsNoCache($membersKeys, $showfield);
        }
        if ($showCredit && $creditKeys) { #自定义积分显示
            $credit += (array)$this->_getCreditByUserIdsNoCache($creditKeys);
        }
        if ($showColony && $colonyKeys) { #群组信息
            $colony += (array)$this->_getColonyByUserIdsNoCache($colonyKeys);
        }        
        return array($members, $credit, $colony);
    }
然后里面又提到了一个函数getMembersByUserIdsNoCache,就在该文件后面紧跟着呢。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 6楼 发表于: 2022-01-14 22:45:04 星期五  点亮(0)
    /**
     * 获取会员信息
     *
     * @param array $userIds
     * @param boolean $showfield 是否获取MemberInfo信息
     * @return array()
     */
    function _getMembersByUserIdsNoCache($userIds, $showfield = false) {
        if (!S::isArray($userIds)) return array();
        global $customfield;
        $fieldinfo = '';
        if (is_array($customfield)) {
            foreach ($customfield as $value) {
                if ($value['ifsys']) continue;
                $fieldinfo .= ',mi.field_'.(int)$value['id'];
            }
        }
        !empty($showfield) && $fieldinfo .= ',mi.customdata';
        $tableinfo = $fieldinfo ? 'LEFT JOIN pw_memberinfo mi ON mi.uid=m.uid' : '';        
        $query = $this->_db->query ( "SELECT bg.membg,bg.conbg,m.uid,m.username,m.gender,m.oicq,m.aliww,m.groupid,m.memberid,m.icon AS micon ,m.hack,m.honor,m.signature,m.regdate,m.medals,m.userstatus,md.postnum,md.digests,md.rvrc,md.money,md.credit,md.currency,md.thisvisit,md.lastvisit,md.onlinetime,md.starttime,md.punch,md.todaypost,md.monthpost,md.lastpost,md.monoltime $fieldinfo FROM pw_members m LEFT JOIN pw_memberdata md ON m.uid=md.uid LEFT JOIN pw_show_users bg ON bg.uid=m.uid $tableinfo WHERE m.uid IN (" . S::sqlImplode ( $userIds, false ) . ") " );
        $members = $tmpMembers = array();
        while ( $rt = $this->_db->fetch_array ( $query ) ) {
            $members [$rt ['uid']] = $rt;
            $tmpMembers [$this->_getMembersKey($rt ['uid'])] = $rt;
        }        
        foreach ($userIds as $userId){
            !isset($members[$userId]) && $tmpMembers[$this->_getMembersKey($userId)] = array();
        }            
        $this->update ($tmpMembers);
        return $members;
    }
看注释“获取会员信息”,还有里面的查询,没错,就是这里了! 红色部分就是这次添加的查询。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 7楼 发表于: 2022-01-14 22:56:13 星期五  点亮(0)
md.todaypost就是今日发帖数;
md.monthpost是本月发帖数;
md.lastpost是上次发帖时间;
md.monoltime是本月在线时间。

其中的本月发帖数可以直接输出,因为“monthpost”字段会在月初的第一天由计划任务文件修改为0,也就是重新开始计算。也就是说,会员数据表中它的数据是准确的,可以直接从表中读出。

本月在线时间通过read.php文件稍微格式化下也可以直接输出。

那今日发帖数呢?它不能直接输出,因为数据表中的数据不是每天自动清零的,不会自动重新累计,所以需要用到比较。用什么做比较呢?就是上次发帖时间字段,只要它大于今天0时0分0秒的时间戳(也就是$tdtime),也就是表示今天发帖了,那么数据表中的今日发帖数就是准确的。所以,需要这个查询。

这个文件搞定后,后面就简单了,这是关键所在,找到并添加查询。随后就是在本地花大量的时间进行测试,确定基本没有问题后修改家园论坛的文件,实际测试。目前,初步正常,后续还要观察。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 8楼 发表于: 2022-01-14 23:07:29 星期五  点亮(0)

这是本地测试截图。为了便于观察,把lastpost和tdtime显示出来。tdtime一直没有问题,但这个lastpost有时候在有的帖子中不显示;有的时候又显示不正确,显示的是pw_threads里面的最后回帖时间戳,也是lastpost一样的字段名。

本月在线时间(分钟)有时候显示为0分钟,也是不准确的数据。

由于不确定,所以在家园论坛实际测试。如果有问题,可以做出舍弃。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 9楼 发表于: 2022-01-14 23:13:19 星期五  点亮(0)
这次在头像弹出层添加了3个信息:本月在线时间(以前只能在手机版中查看,这回添加后就方便多了吧),今日发帖和本月发帖。后面两个加了判断,如果今天发帖了才会显示(也就是上次发帖时间lastpost大于$tdtime),否则不显示。

期待一切正常吧。今天又花了数个小时的时间,也不知道这么一处小修改是否值得?是否真有必要?

本来也没想着今天更新完,大致就是这些。竟然完成了,去睡觉吧。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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