admin 发表于 2024-5-12 22:45:54

Discuz x3.5 核心文件 class_card.php

<?php

/**
*       (C)2001-2099 Comsenz Inc.
*      This is NOT a freeware, use is subject to license terms
*
*      $Id: class_card.php 27449 2012-02-01 05:32:35Z zhangguosheng $
*/

if(!defined('IN_DISCUZ')) {
        exit('Access Denied');
}
class card{

        var $set = array();
        var $rulekey = array("str"=>"\@", "num"=>"\#", "full"=>"\*");
        var $sysrule = '';
        var $rule = '';
        var $rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
        var $rulemap_num = "123456789";

        var $rulereturn = array();
        var $cardlist = array();

        var $succeed = 0;
        var $fail = 0;
        var $failmin = 1;
        var $failrate = '0.1';


        function __construct() {
                $this->init();
        }
        /**
       * 初始化函数
       * 设置系统变量和规则
       */
        function init() {
          global $_G;
          $this->set = &$_G['setting']['card']; // 引用全局设置中的卡片设置
          $this->sysrule = "^+$"; // 定义系统认可的规则字符集
        }

        /**
       * 生成卡片规则
       * @param string $rule 用户自定义规则,为空则使用默认规则
       * @param int $num 生成卡片的数量
       * @param array $cardval 卡片值的数组,包含额外的信息如生成者UID和时间戳
       * @return int 返回生成结果,成功为true,失败为-1或其他错误代码
       */
        function make($rule = '', $num = 1, $cardval = array()) {
          global $_G;
          $this->rule = empty($rule) ? $this->set['rule'] : trim($rule); // 确定使用的规则
          if(empty($this->rule)) {
                return -1; // 如果没有有效的规则,直接返回-1
          }
          $this->fail($num); // 初始化失败尝试次数
          $cardval['makeruid'] = $_G['uid']; // 设置制作卡片的用户UID
          $cardval['dateline'] = $_G['timestamp']; // 设置卡片创建时间戳
          for($i = 0; $i < $num ; $i++) { // 开始生成指定数量的卡片
                if($this->checkrule($this->rule)) { // 检查规则是否符合要求
                    $card = $this->rule; // 使用规则创建卡片
                    foreach($this->rulereturn AS $key => $val) { // 替换规则中的占位符
                      $search = array();
                      foreach($val AS $skey => $sval) {
                            $search[] = '/'.$this->rulekey[$key].'/';
                      }
                      $card =preg_replace($search, $val, $card, 1);
                    }
                } else {
                    return 0; // 如果规则检查失败,则返回0
                }
                $cardval['id'] = $card; // 设置卡片ID
                C::t('common_card')->insert($cardval, false, false, 'SILENT'); // 试图插入卡片信息到数据库
                if(($sqlerror = DB::error())) { // 检查数据库操作是否出错
                    if($sqlerror == 1062) { // 处理唯一性冲突
                      $this->fail++;
                      if($this->failmin > $this->fail) {
                            $num++;
                      } else {
                            $num = $i - 1;
                      }
                    }
                } else {
                    $this->succeed += intval(DB::affected_rows()); // 记录成功插入的卡片数量
                    $this->cardlist[] = $card; // 收集生成的卡片ID
                }
          }
          return true; // 如果生成过程没有遇到错误,则返回true
        }

        /**
       * 检查规则是否有效
       * @param string $rule 待检查的规则
       * @param string $type 检查类型,默认为'0'
       * @return int 返回检查结果,true表示规则有效,-2表示规则格式不正确
       */
        function checkrule($rule, $type = '0') {
          if(!preg_match("/($this->sysrule)/i", $rule)){ // 检查规则是否符合系统定义的格式
                return -2;
          }
          if($type == 0) { // 如果是类型0的规则,进一步处理
                foreach($this->rulekey AS $key => $val) { // 遍历规则关键字
                    $match = array();
                    preg_match_all("/($val){1}/i", $rule, $match); // 匹配规则中出现的关键字
                    $number[$key] = count($match); // 统计每个关键字出现的次数
                    if($number[$key] > 0) { // 如果有关键字出现,则随机替换为具体值
                      for($i = 0; $i < $number[$key]; $i++) {
                            switch($key) {
                            case 'str':
                                $rand = mt_rand(0, (strlen($this->rulemap_str) - 1));
                                $this->rulereturn[$key][$i] = $this->rulemap_str[$rand];
                                break;
                            case 'num':
                                $rand = mt_rand(0, (strlen($this->rulemap_num) - 1));
                                $this->rulereturn[$key][$i] = $this->rulemap_num[$rand];
                                break;
                            case 'full':
                                $fullstr = $this->rulemap_str.$this->rulemap_num;
                                $rand = mt_rand(0,(strlen($fullstr) - 1));
                                $this->rulereturn[$key][$i] = $fullstr[$rand];
                                break;
                            }
                      }
                    }
                }
          }
          return true; // 如果规则检查通过,则返回true
        }

        /**
       * 根据生成卡片的数量,计算允许的失败次数
       * @param int $num 企图生成的卡片数量
       */
        function fail($num = 1) {
          $failrate = $this->failrate ? (float)$this->failrate : '0.1'; // 获取失败率,若未设置则默认为0.1
          $this->failmin = ceil($num * $failrate); // 计算最少的失败次数
          $this->failmin = $this->failmin > 100 ? 100 : $this->failmin; // 限制失败次数的最大值为100
        }
};
?>
页: [1]
查看完整版本: Discuz x3.5 核心文件 class_card.php