规则之树

typecho实现会员积分系统,及文章收费阅读

这是一个老早老早就有企划的二次开发,但是一直太忙了没有很好的抽出时间去研究,或者说之前在帮一个朋友做,bug发现原来的思路太麻烦,完全有更加简单的办法。其实严格来说typecho的二次开发真心简单得吓人,我已经决定好给它打上各种自己diy的东西后,当成一个php框架用了。所以回到正题,目前这篇文章还是积分系统和收费阅读,积分的获取还仅仅只能依靠手动充值来实现,我正好有一个收费的阅读网站要用到。
暂时为止,现在还是以最简单的方式实现功能,可能存在未知的bug(我php水平真的很菜),所以发现之后及时在评论留言,但是功能扩展性看来会很强,所以无需担心之后的升级。如果看了还是不会,又强烈需要的话,可以来博客的交流群,找我帮你配置好。
关于typecho支付宝的接口,我这些天也会制作,弄好了就会继续开新的文章。

那么,教程开始

数据库部分:

1.首先在数据库中增加两个字段,分别是typecho_contents和typecho_users表,都是在最后增加一个字段,按照我的截图来。

typecho_contents增加price(文章价格)字段,放在最后,类型为int,长度11,不允许为空,默认为0

typecho_users增加account(用户账户积分)字段,放在最后,类型为int,长度11,不允许为空,默认为0

2.新建一个数据库typecho_read,代码如下,我的是mysql5.5,其它版本可能会不同,但是参考这个就对了。

CREATE TABLE IF NOT EXISTS `typecho_read` (
  `rid` int(11) unsigned NOT NULL,
  `uid` int(11) DEFAULT '0',
  `pid` int(11) DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

这个数据表主要用于记录购买的用户和对应的文章,方便查询和使用。

typecho文件部分:

1.文章编辑接口新增字段price,参考typecho实现文章增加表单,具体操作,新增一个叫做price的字段,用来添加和编辑,注意的就是,在/admin/write-post.php合适位置,加上如下代码。

<section class="typecho-post-option">
    <label for="token-input-price" class="typecho-label"><?php _e('文章价格'); ?></label>
    <p><input id="price" name="price" type="text" value="<?php $post->price(); ?>" class="w-100 text" /></p>
    <p class="description">输入积分数量,默认为0,设置大于0整数后则开始收费</p>
</section>

2.在用户编辑接口,新增字段account,具体文件在/var/Widget/Users/Edit.php。
110行下面添加:

/** 用户账户 */
$account = new Typecho_Widget_Helper_Form_Element_Text('account', NULL, NULL, _t('用户积分'), _t('用户积分用于抵扣付费文章,由管理员进行调控.')
    . '<br />' . _t('如果你将此项留空, 将默认为0.'));
$form->addInput($account);

153行下面添加:

$account->value($this->account);

216行改为如下:

$user = $this->request->from('name', 'mail', 'screenName', 'password', 'url', 'group', 'account');

247行改为如下:

$user = $this->request->from('mail', 'screenName', 'password', 'url', 'group', 'account');

操作完上述步骤后,用户添加编辑里面就会出现积分账户的输入框,可以设置积分,并且会在数据库存储,而调用这个积分的标签为

<?php $user->account(); ?>

typecho模板部分:

1.在function.php中加入如下代码,用来在模板层面上实现积分阅读,作者加分,用户扣分的功能,这里特别复杂,可能有bug,如果我发现会立刻补充修改。

/** 判断文章是否支付 */
function post_read($uid,$pid){
    $cid    = $archive->cid;
    $db     = Typecho_Db::get();
    $prefix = $db->getPrefix();
    $row = $db->fetchRow($db->select()->from('table.read')->where('uid = ?', $uid)->where('pid = ?', $pid));
    return sizeof($row);

}
/** 文章开始支付 */
function post_buy($uid,$pid,$account,$price,$concent,$aid,$buy,$Uaccount){
    $account = (int)$account;
    $price = (int)$price;
    $Ye = $account - $price;
    $Ze = $Uaccount + $price;
    $db     = Typecho_Db::get();
    $prefix = $db->getPrefix();
    $row = $db->fetchRow($db->select()->from('table.contents')->where('authorId = ?', $uid)->where('cid = ?', $pid));
    $i = sizeof($row);
    if($price == 0||$i != 0){
        echo $concent;
    }else{
        
        if($buy==1){
            if($account < $price){
                echo "<p>余额不足,请联系管理员充值<p>";
            }else{
                
                if(post_read($uid,$pid) !=0){
                    echo $concent;
                }else{
                    //添加阅读记录
                    $db->query($db->insert('table.read') ->rows(array('uid' => $uid, 'pid' => $pid)));
                    //用户扣除积分
                    $db->query($db->update('table.users')->rows(array('account' =>(int)$Ye ))->where('uid = ?', $uid));
                    //文章作者添加积分
                    $db->query($db->update('table.users')->rows(array('account' =>(int)$Ze))->where('uid = ?', $aid));
                      //$db->query($db->update('table.users')->rows(array('account' => (int) $row['account'] + (int)$price))->where('uid = ?', $aid));
                    //返回阅读页面
                    $s = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
                    $url = str_replace('?buy=1', '', $s);
                    echo "<script>window.location.href=\"".$url."\";</script>";
                }
                
            }
            
        }else{
            if(post_read($uid,$pid) !=0){
                echo $concent;
            }else{
                echo "<p>阅读此文章需要".$price."积分,请<a href=\"?buy=1\">确认支付</a><p>";
            }
            
        }
    }
}

2.在文章模板post.php,头部加入以下代码,主要是让用户对这篇文章的购买进行确认

$buy = 0;
if(isset($_GET['buy'])){
    $buy = $_GET['buy'];
}

另外文章内容调用标签由<?php $this->content(); ?>替换如下

<?php post_buy($this->user->uid,$this->cid,$this->user->account,$this->price,$this->content,$this->author->uid,$buy,$this->author->account); ?>

到这里,积分系统和文章收费阅读完全以最简单方式实现,至于支付宝充值接口,就几天后的另一篇文章见吧。
演示网站:暂无(我搭建好就摆这里)
部分截图:



更多的typecho二次开发&&模板开发需求,不是太难的,可以来博客群联系我,价格好说。

规则之树版权所有,转载请注明来源,标明作者及原文链接

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »