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

本文阅读 5 分钟
广告

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

那么,教程开始

数据库部分:

1.首先在数据库中增加两个字段,分别是typecho_contents和typecho_users表,都是在最后增加一个字段,按照我的截图来。
1.png
typecho_contents增加price(文章价格)字段,放在最后,类型为int,长度11,不允许为空,默认为0
2.png
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(); ?>

3.png

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); ?>

到这里,积分系统和文章收费阅读完全以最简单方式实现,至于支付宝充值接口,就几天后的另一篇文章见吧。
演示网站:暂无(我搭建好就摆这里)
部分截图:
4.png
5.png
6.png
更多的typecho二次开发&&模板开发需求,不是太难的,可以来博客群联系我,价格好说。

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

本文来自投稿,不代表本站立场,如若转载,请注明出处:https://www.ruletree.club/archives/1402/
杰奇cms配置邮件发信,实现用户邮箱验证
« 上一篇 09-09
杰奇3.0详细安装教程,附带绕域名授权方法
下一篇 » 09-23
广告

发表评论

V注册会员 L评论等级
R16 条回复
  1. sevensVLv.1 说道:
    2022-01-14     Win 10 /    Chrome

    前台注册的会员跳转到了后台界面这个怎么处理?

    1. 不暇VLv.6 说道:
      2022-01-15     Android /    Chrome

      @sevens

      typecho的模式就是这样,普通用户的的入口和管理员的入口是相同的,只是功能区开的不一样

  2. 单位单位Lv.1 说道:
    2021-07-20     Win 10 /    FireFox

    在文章模板post.php,头部加入以下代码后,无效果啊大大

  3. 仓鼠Lv.1 说道:
    2020-08-10     Win 10 /    Chrome

    在文章模板post.php,头部加入以下代码指的是哪里

    1. 不暇VLv.6 说道:
      2020-08-12     Win 7 /    Chrome

      @仓鼠

      就是头部引入header.php文件的php标签里面

  4. BeyondLv.1 说道:
    2020-05-21     Win 10 /    Chrome

    google进来的,cloudflare页面规则设置有教程吗?我也是用tyoecho,一样的主题

    1. 不暇VLv.6 说道:
      2020-05-22     Win 7 /    Chrome

      @Beyond

      和cdn没啥关系吧,cdn一般只是缓存js和php导致代码失效

      1. BeyondLv.1 说道:
        2020-05-22     Android /    Chrome

        @不暇

        这是我的站: https://here.sy 可能整站缓存了,你这个邮件回复的插件是哪个啊,不错哦

        1. 不暇VLv.6 说道:
          2020-05-22     Android /    Chrome

          @Beyond

          邮件回复是LoveKKComment这个插件。
          用cdn的话,一般都是被缓存导致的,不过我建议是直接下载打包zip,不要下载最新稳定版。

  5. icbugLv.1 说道:
    2020-04-18     Win 10 /    Chrome

    为什么点击确认支付是Database Query Error

    1. 不暇VLv.6 说道:
      2020-04-18     Win 7 /    Chrome

      @icbug

      数据库的表可能没有建立全

  6. 大佬Lv.1 说道:
    2020-02-11     Win 10 /    Chrome

    给个思路,其实不用每一篇文章扣分,判断用户的会员到期时间一个值就可以了~。

    这样就很简单咯~

    期待你出个插件,我来买。

    1. 不暇VLv.6 说道:
      2020-02-11     Android /    Chrome

      @大佬

      emmm,这是搞vip系统,我尝试下吧。

  7. shuzaitouVLv.1 说道:
    2019-10-26     Win 7 /    FireFox

    不过除了充值,还可以通过介绍会员注册获取积分,每个注册会员50分等,或者发文过审核后获得积分,这样如何?

    1. 不暇VLv.6 说道:
      2019-10-27     Win 7 /    Chrome

      @shuzaitou

      这个其实在我的设想之内,目前主要的问题是没时间去做

      1. shuzaitouVLv.1 说道:
        2019-10-27     Win 10 /    FireFox

        @不暇

        优秀的东西都是值得一等的 icon_lol.gif

没有更多评论了

作者信息

热门文章

标签TAG

热评文章