1
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
namespace app\command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Attribute\AsCommand;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use app\model\BalanceLog;
|
||||
|
||||
class BalanceLogTask extends Command
|
||||
{
|
||||
protected static $defaultName = 'balance:log-task';
|
||||
protected static $defaultDescription = 'balance:log-task';
|
||||
protected function configure()
|
||||
{
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output):int
|
||||
{
|
||||
// 1. 确保索引存在
|
||||
$output->writeln('Creating indexes...');
|
||||
$indexResults = BalanceLog::createAllIndexes();
|
||||
foreach ($indexResults as $currency => $messages) {
|
||||
$output->writeln("[$currency]");
|
||||
foreach ($messages as $message) {
|
||||
$output->writeln(" - $message");
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 执行数据归档
|
||||
$output->writeln('Archiving old data...');
|
||||
$archiveResults = BalanceLog::archiveData(3); // 归档3天前的数据
|
||||
foreach ($archiveResults as $currency => $result) {
|
||||
$output->writeln("[$currency]");
|
||||
$output->writeln(" - Table: {$result['table']}");
|
||||
$output->writeln(" - Archived: {$result['archived']} records");
|
||||
foreach ($result['messages'] as $message) {
|
||||
$output->writeln(" - $message");
|
||||
}
|
||||
}
|
||||
|
||||
$output->writeln('All tasks completed!');
|
||||
return self::SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
namespace app\command;
|
||||
|
||||
use Exception;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use think\db\PDOConnection;
|
||||
use support\think\Db;
|
||||
|
||||
class Clear extends Command
|
||||
{
|
||||
protected static $defaultName = 'clear';
|
||||
protected static $defaultDescription = '数据库缓存';
|
||||
protected function configure()
|
||||
{
|
||||
$this->setDescription('clear database.');
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$action = 'all';
|
||||
if($action == 'all'){
|
||||
Db::name('address')->where('id','>',0)->delete();
|
||||
Db::name('recharge')->where('id','>',0)->delete();
|
||||
Db::name('transfer')->where('id','>',0)->delete();
|
||||
Db::name('user')->where('id','>',0)->delete();
|
||||
Db::name('user_extend')->where('user_id','>',0)->delete();
|
||||
Db::name('user_team')->where('descendant_id|ancestor_id','>',0)->delete();
|
||||
Db::name('withdrawl')->where('id','>',0)->delete();
|
||||
Db::name('work_record')->where('id','>',0)->delete();
|
||||
}else{
|
||||
$list = \app\model\User::order('id','asc')->select();
|
||||
foreach($list as $k=>$user){
|
||||
Db::name('address')->where('user_id',$user->id)->delete();
|
||||
Db::name('transfer')->where('user_id',$user->id)->delete();
|
||||
|
||||
Db::name('recharge')->where('user_id',$user->id)->delete();
|
||||
Db::name('record')->where('user_id',$user->id)->delete();
|
||||
Db::name('withdrawl')->where('user_id',$user->id)->delete();
|
||||
Db::name('user_extend')->where('user_id',$user->id)->delete();
|
||||
Db::name('user_team')->where('descendant_id|ancestor_id','=',$user->id)->delete();
|
||||
Db::name('withdrawl')->where('user_id',$user->id)->delete();
|
||||
Db::name('work_record')->where('user_id',$user->id)->delete();
|
||||
Db::name('user')->where('id',$user->id)->delete();
|
||||
|
||||
}
|
||||
}
|
||||
$output->writeln('<info>Succeed!</info>');
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
protected function buildModelSchema(string $class): void
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Exception;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use support\think\Db;
|
||||
use app\model\User as UserModel;
|
||||
|
||||
|
||||
class Database extends Command
|
||||
{
|
||||
protected static $defaultName = 'Db';
|
||||
protected static $defaultDescription = 'Database 优化';
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addOption('action','a', InputArgument::OPTIONAL, '要做什么操作');
|
||||
$this->addOption('table','t', InputArgument::OPTIONAL, '表名');
|
||||
$this->addOption('domain','ym', InputArgument::OPTIONAL, 'domain');
|
||||
$this->addOption('robot_id','rid', InputArgument::OPTIONAL, 'robot_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$action = $input->getOption('action');
|
||||
if($action == 'prototype'){
|
||||
return $this->prototype($input, $output);
|
||||
}
|
||||
cp('操作不存在:'.$action);
|
||||
return 0;
|
||||
}
|
||||
function prototype(InputInterface $input, OutputInterface $output){
|
||||
$table = $input->getOption('table');
|
||||
// 获取表前缀并构建完整表名
|
||||
$prefix = config('thinkorm.connections.mysql.prefix', '');
|
||||
$fullTableName = '`' . $prefix . $table . '`';
|
||||
|
||||
// 查询表结构
|
||||
$res = Db::query('SHOW FULL COLUMNS FROM ' . $fullTableName);
|
||||
|
||||
if (empty($res)) {
|
||||
return "// 表 {$table} 不存在或没有字段";
|
||||
}
|
||||
|
||||
$annotations = [];
|
||||
$annotations[] = '/**';
|
||||
|
||||
foreach ($res as $row) {
|
||||
$field = $row['Field'];
|
||||
$type = $row['Type'];
|
||||
$comment = $row['Comment'] ?: '无注释';
|
||||
|
||||
// 处理字段类型映射
|
||||
$phpType = $this->mapMysqlTypeToPhp($type);
|
||||
|
||||
// 处理特殊字段
|
||||
if ($field === 'id') {
|
||||
$annotations[] = " * @property integer \${$field} 主键(ID) - {$comment}";
|
||||
} else {
|
||||
$annotations[] = " * @property {$phpType} \${$field} {$comment}";
|
||||
}
|
||||
}
|
||||
|
||||
$annotations[] = ' */';
|
||||
|
||||
cp( implode("\n", $annotations));
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将MySQL字段类型映射到PHP类型
|
||||
*
|
||||
* @param string $mysqlType MySQL字段类型
|
||||
* @return string PHP类型
|
||||
*/
|
||||
protected function mapMysqlTypeToPhp($mysqlType)
|
||||
{
|
||||
$mysqlType = strtolower($mysqlType);
|
||||
|
||||
// 整数类型
|
||||
if (preg_match('/^(tinyint|smallint|mediumint|int|bigint)/', $mysqlType)) {
|
||||
// 检查是否为无符号
|
||||
if (strpos($mysqlType, 'unsigned') !== false) {
|
||||
return 'integer'; // 无符号整数也返回integer
|
||||
}
|
||||
return 'integer';
|
||||
}
|
||||
|
||||
// 浮点类型
|
||||
if (preg_match('/^(float|double|decimal)/', $mysqlType)) {
|
||||
return 'float';
|
||||
}
|
||||
|
||||
// 字符串类型
|
||||
if (preg_match('/^(varchar|char|text|tinytext|mediumtext|longtext|enum|set)/', $mysqlType)) {
|
||||
return 'string';
|
||||
}
|
||||
|
||||
// 日期时间类型
|
||||
if (preg_match('/^(date|time|datetime|timestamp|year)/', $mysqlType)) {
|
||||
return 'string'; // 或者可以返回 '\\DateTime' 如果需要更精确的类型
|
||||
}
|
||||
|
||||
// 二进制类型
|
||||
if (preg_match('/^(blob|tinyblob|mediumblob|longblob|binary|varbinary)/', $mysqlType)) {
|
||||
return 'string'; // 或者根据需求返回其他类型
|
||||
}
|
||||
|
||||
// JSON类型
|
||||
if (strpos($mysqlType, 'json') !== false) {
|
||||
return 'array'; // 或者 'mixed'
|
||||
}
|
||||
|
||||
// 布尔类型(tinyint(1)通常用作布尔值)
|
||||
if ($mysqlType === 'tinyint(1)' || $mysqlType === 'boolean' || $mysqlType === 'bool') {
|
||||
return 'boolean';
|
||||
}
|
||||
|
||||
// 默认返回混合类型
|
||||
return 'mixed';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Exception;
|
||||
use plugin\admin\app\model\Config;
|
||||
use support\Request;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use support\think\Db;
|
||||
|
||||
|
||||
class Language extends Command
|
||||
{
|
||||
protected static $defaultName = 'Language:scan';
|
||||
protected static $defaultDescription = '自动完成多语言的文件提取';
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addOption('file','f', InputArgument::OPTIONAL, '只是针对那个文件');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$file = $input->getOption('file');
|
||||
$file = base_path()."/app/api/controller/ServerController.php";
|
||||
$dir = new \RecursiveDirectoryIterator(base_path().'/app');
|
||||
$iterator = new \RecursiveIteratorIterator($dir);
|
||||
$phpFiles = new \RegexIterator($iterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH);
|
||||
$fnlist = [];
|
||||
$result = [
|
||||
'common.php'=>""
|
||||
];
|
||||
foreach ($phpFiles as $_file) {
|
||||
$_file = $_file[0];
|
||||
$fnlist[] = $_file;
|
||||
$key = 'common.php';
|
||||
if(false !==strpos($_file, base_path().'/app/api/controller')){
|
||||
$key = 'api/'.pathinfo($_file,PATHINFO_BASENAME);
|
||||
}
|
||||
if(false !==strpos($_file, base_path().'/app/controller')){
|
||||
$key = pathinfo($_file,PATHINFO_BASENAME);
|
||||
}
|
||||
$key = strtolower(str_replace('Controller','',$key));
|
||||
//cp($key);
|
||||
$res = $this->parseOneFile($_file);
|
||||
$result[$key]=$res;
|
||||
}
|
||||
//$res = $this->parseOneFile($file);
|
||||
//cp($result);
|
||||
$this->write2file($result);
|
||||
return 0;
|
||||
}
|
||||
function write2file($data=[]){
|
||||
$langs = ['zh','en'];
|
||||
foreach($data as $fn=>$arr){
|
||||
foreach($langs as $lang){
|
||||
$lang_path = base_path().'/resource/translations/'.$lang.'/';
|
||||
$_common_arr = require($lang_path.'common.php');
|
||||
$_arr = [];
|
||||
if(file_exists($lang_path.$fn)){
|
||||
$_arr = require($lang_path.$fn);
|
||||
}
|
||||
foreach($arr as $ov){
|
||||
if(!isset($_common_arr[$ov]) && !isset($_arr[$ov])){
|
||||
$_arr[$ov]=$ov;
|
||||
}
|
||||
if(isset($_common_arr[$ov]) && isset($_arr[$ov])){
|
||||
unset($_arr[$ov]);
|
||||
}
|
||||
}
|
||||
file_put_contents($lang_path.$fn,'<?php'.PHP_EOL.'return '.var_export($_arr,true).';');
|
||||
//cp('写入文件:'.$lang_path.$fn);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
function parseOneFile($fn){
|
||||
cp('解析文件:',$fn);
|
||||
if(file_exists($fn)){
|
||||
$content = file_get_contents($fn);
|
||||
$matchs = [];
|
||||
preg_match_all('/__\(([\'"])(.*?)\1\s*(?:,\s*\[.*?\])?\)/',$content,$matchs);
|
||||
//cp($matchs[2]);
|
||||
return $matchs[2];
|
||||
}else{
|
||||
cp('文件不存在:'.$fn);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use support\think\Db;
|
||||
|
||||
|
||||
class Otop extends Command
|
||||
{
|
||||
protected static $defaultName = 'Otop';
|
||||
protected static $defaultDescription = '结算';
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addOption('user_id','uid', InputArgument::OPTIONAL, 'user_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$user_id = $input->getOption('user_id');
|
||||
if(!$user_id){
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* @var \plugin\admin\app\model\Admin $admin
|
||||
*/
|
||||
$admin = \plugin\admin\app\model\Admin::where('id',$user_id)->find();
|
||||
if(!$admin){
|
||||
return false;
|
||||
}
|
||||
$totp = \OTPHP\TOTP::create($admin->totp_secret);
|
||||
cp($totp->now());
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use support\think\Db;
|
||||
|
||||
|
||||
class Settlement extends Command
|
||||
{
|
||||
protected static $defaultName = 'Settlement';
|
||||
protected static $defaultDescription = '结算';
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addArgument('name', InputArgument::OPTIONAL, 'Name description');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
(new \support\Settlement())->autoSettlement();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Exception;
|
||||
use plugin\admin\app\model\Config;
|
||||
use app\model\User as UserModel;
|
||||
use support\Request;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use support\think\Db;
|
||||
use support\Mattermost;
|
||||
use app\model\User;
|
||||
|
||||
|
||||
class Tongji extends Command
|
||||
{
|
||||
protected static $defaultName = 'Tongji';
|
||||
protected static $defaultDescription = 'Tongji';
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addOption('action','a', InputArgument::OPTIONAL, '要做什么操作');
|
||||
$this->addOption('user_id','uid', InputArgument::OPTIONAL, 'user_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
$this->question($input,$output);
|
||||
//$this->role($input,$output);
|
||||
//$this->recharge($input,$output);
|
||||
//$this->withdrawl($input,$output);
|
||||
return self::SUCCESS;
|
||||
}
|
||||
/**
|
||||
* 修复充值统计
|
||||
*/
|
||||
function recharge(InputInterface $input, OutputInterface $output) {
|
||||
//购买金额统计
|
||||
$recharge = \app\model\Recharge::where('status',\app\enum\RechargeStatus::COMPLETE->value)->select();
|
||||
$recharge_result = [];
|
||||
$statistics_recharge_times_result = [];
|
||||
$user_recharge_total_result = [];
|
||||
$team_recharge_total_result = [];
|
||||
/**
|
||||
* @var \app\model\Recharge $vo
|
||||
*/
|
||||
foreach($recharge as $vo){
|
||||
$date = explode(' ',$vo->created_at)[0];
|
||||
$recharge_result[$date] += abs($vo->amount);
|
||||
$statistics_recharge_times_result[$date] += 1;
|
||||
$user_recharge_total_result[$vo->user_id.''] +=abs($vo->amount);
|
||||
$parent_id = get_parent_id($vo->user_id);
|
||||
if($parent_id){
|
||||
//团队提现统计
|
||||
$team_recharge_total_result[$parent_id.''] +=abs($vo->amount);
|
||||
}
|
||||
}
|
||||
foreach($recharge_result as $date => $value){
|
||||
cache('statistics_recharge_amount_'.$date,$value);
|
||||
}
|
||||
foreach($statistics_recharge_times_result as $date => $value){
|
||||
cache('statistics_recharge_times_'.$date,$value);
|
||||
}
|
||||
foreach($user_recharge_total_result as $user_id => $value){
|
||||
cache('user_recharge_total_'.$user_id,$value);
|
||||
}
|
||||
foreach($team_recharge_total_result as $user_id => $value){
|
||||
cache('team_recharge_total_'.$user_id,$value);
|
||||
}
|
||||
cp($recharge_result);
|
||||
}
|
||||
/**
|
||||
* 修复提现统计
|
||||
*/
|
||||
function withdrawl(InputInterface $input, OutputInterface $output) {
|
||||
//购买金额统计
|
||||
$withdrawl = \app\model\Withdrawl::where('status',\app\enum\WithdrawlStatus::COMPLETE->value)->select();
|
||||
$withdrawl_result = [];
|
||||
$statistics_withdrawl_times_result = [];
|
||||
$user_withdrawl_total_result = [];
|
||||
$team_withdrawl_total_result = [];
|
||||
/**
|
||||
* @var \app\model\Withdrawl $vo
|
||||
*/
|
||||
foreach($withdrawl as $vo){
|
||||
$date = explode(' ',$vo->created_at)[0];
|
||||
$withdrawl_result[$date] += abs($vo->recive_amount);
|
||||
$statistics_withdrawl_times_result[$date] += 1;
|
||||
$user_withdrawl_total_result[$vo->user_id.''] +=abs($vo->recive_amount);
|
||||
$parent_id = get_parent_id($vo->user_id);
|
||||
if($parent_id){
|
||||
//团队提现统计
|
||||
$team_withdrawl_total_result[$parent_id.''] +=abs($vo->recive_amount);
|
||||
}
|
||||
}
|
||||
foreach($withdrawl_result as $date => $value){
|
||||
cache('statistics_withdrawl_amount_'.$date,$value);
|
||||
}
|
||||
foreach($statistics_withdrawl_times_result as $date => $value){
|
||||
cache('statistics_withdrawl_times_'.$date,$value);
|
||||
}
|
||||
foreach($user_withdrawl_total_result as $user_id => $value){
|
||||
cache('user_withdrawl_total_'.$user_id,$value);
|
||||
}
|
||||
foreach($team_withdrawl_total_result as $user_id => $value){
|
||||
cache('team_withdrawl_total_'.$user_id,$value);
|
||||
}
|
||||
cp($withdrawl_result);
|
||||
}
|
||||
function question(InputInterface $input, OutputInterface $output) {
|
||||
$order_list = \app\model\ProductOrder::withJoin([
|
||||
'product'=>function($q){
|
||||
return $q->field('price,interest_rate');
|
||||
}
|
||||
])->where('quantity','>',0)->select();
|
||||
}
|
||||
/**
|
||||
* 修复所有角色购买统计
|
||||
*/
|
||||
function role(InputInterface $input, OutputInterface $output) {
|
||||
|
||||
}
|
||||
/**
|
||||
* 模拟用户注册
|
||||
*/
|
||||
function register(InputInterface $input, OutputInterface $output){
|
||||
$last_user_id = UserModel::order('id','desc')->limit(1)->value('id');
|
||||
for ($i=$last_user_id+1; $i <= $last_user_id+2; $i++) {
|
||||
$uids = UserModel::where("status",1)->column('id');
|
||||
$referrerId = $uids[array_rand($uids)];
|
||||
$email = 'test'.$i.'@msn.cn';
|
||||
$mobile = '';
|
||||
$password = '123456';
|
||||
$extends = [
|
||||
'role_id' => rand(1,3),
|
||||
'money' => 0,
|
||||
'parent_id' => $referrerId
|
||||
];
|
||||
$user = \support\Jwt::register($email, $password, $email, $mobile, $extends);
|
||||
cp($user['id']);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
function updateRechargeAddress(InputInterface $input, OutputInterface $output){
|
||||
$saveData = [];
|
||||
$res = post(Config('pay.server').'/RechargeAddress/create',['appid'=>Config('pay.appid')]);
|
||||
if($res){
|
||||
$res = json_decode($res,true);
|
||||
if($res['code'] === 0){
|
||||
$saveData['bep_recharge_address'] = $res['data']['BEP-20']['address'];
|
||||
$saveData['trc_recharge_address'] = $res['data']['TRC-20']['address'];
|
||||
$saveData['decimal_part'] = $res['data']['BEP-20']['decimal_part'];
|
||||
}
|
||||
}
|
||||
UserModel::where('id',123409)->update($saveData);
|
||||
return 0;
|
||||
}
|
||||
function otop(){
|
||||
$secret = 'EJGYB7OZR2W46XRX7VB3PXHSOY4LUAWCA5GTDAVTWKHXNDAAAIIP7AQ3JSO3XZJNX5J5OTIDEQVKLYFYIYNAXSCYF4GNZ2EMA4ORA3Y';
|
||||
$totp = \OTPHP\TOTP::create($secret);
|
||||
$secret = $totp->getSecret();
|
||||
$totp->setLabel('cansnow');
|
||||
$totp->setIssuer('DVPN');
|
||||
$qrCodeUri =$totp->getProvisioningUri();
|
||||
cp($secret);
|
||||
cp($qrCodeUri);
|
||||
cp('https://api.qrtool.cn/?text='.urlencode($qrCodeUri));
|
||||
cp($totp->at(time()));
|
||||
if ($totp->verify('535714')) {
|
||||
cp('验证成功');
|
||||
} else {
|
||||
cp('验证失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace app\command;
|
||||
|
||||
use Monolog\Formatter\MongoDBFormatter;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use support\think\Db;
|
||||
|
||||
|
||||
class createIndex extends Command
|
||||
{
|
||||
protected static $defaultName = 'createIndex';
|
||||
protected static $defaultDescription = 'createIndex';
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addArgument('name', InputArgument::OPTIONAL, 'Name description');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @return int
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
\app\model\BalanceLog::createindex();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is part of webman.
|
||||
*
|
||||
* Licensed under The MIT License
|
||||
* For full copyright and license information, please see the MIT-LICENSE.txt
|
||||
* Redistributions of files must retain the above copyright notice.
|
||||
*
|
||||
* @author walkor<walkor@workerman.net>
|
||||
* @copyright walkor<walkor@workerman.net>
|
||||
* @link http://www.workerman.net/
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||||
*/
|
||||
|
||||
namespace app\api\exception;
|
||||
|
||||
use Throwable;
|
||||
use Webman\Exception\ExceptionHandler;
|
||||
use Webman\Http\Request;
|
||||
use Webman\Http\Response;
|
||||
|
||||
/**
|
||||
* Class Handler
|
||||
* @package sapp\api\exception
|
||||
*/
|
||||
class Handler extends ExceptionHandler
|
||||
{
|
||||
public $dontReport = [
|
||||
\support\exception\BusinessException::class,
|
||||
];
|
||||
|
||||
public function report(Throwable $exception)
|
||||
{
|
||||
parent::report($exception);
|
||||
}
|
||||
|
||||
public function render(Request $request, Throwable $exception): Response
|
||||
{
|
||||
$code = $exception->getCode();
|
||||
$json = ['code' => $code ?: 500, 'msg' => $exception->getMessage()];
|
||||
return new Response(200, ['Content-Type' => 'application/json'],
|
||||
json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user