2 Commits
beta3.3 ... 1.1

844 changed files with 149698 additions and 113111 deletions

0
.htaccess Normal file
View File

View File

@@ -1,21 +1,34 @@
## PicHome beta3.3 更新说明
## PicHome Home1.1 更新说明
### 1.billfish数据支持兼容billfish2.5版本数据导入
### 1.去掉原库设置中缩略图转换开关,站点设置增加存储位置设置,存储位置目前支持本地(默认),腾讯云存储
### 2.eagle数据支持兼容新旧版本eagle数据导入
### 2.本地存储位置图片处理功能开启关闭将控制普通目录图片类文件缩略图和颜色信息获取支持GD和imagick两种设置其中imagick将支持特殊格式图片缩略图获取
包括并不限于ai、psd等格式具体支持格式可在设置界面内查看
### 3.优化普通目录文件缩略图生成逻辑,优化效率,以及缩略图转换数字显示等问题修复
### 4.修复普通目录由于文件名长度问题导致的文件缺失和部分服务器中存在因路径分割符不同导致文件导入累加式重复问题
### 3.本地存储位置视频处理功能开启关闭将控制普通目录音视频类文件缩略图和信息获取支持不能直接播放媒体文件转码目前使用ffmpeg作为支持具体支持格式可在设置界面内查看
### 5.库设置增加库名称修改选项
### 6.修复页面标签未分类数据显示错误问题,修复单一库时存在的筛选项不能正常显示问题
### 4.本地存储位置文档处理功能开启关闭,将控制普通目录文档类文件缩略图获取,支持文档在线预览(不限于普通目录目前使用onlyoffice作为支持具体支持格式可在设置界面内查看
### 7.页面增加按eagle和billfish内目录排序显示支持
### 8.优化库删除逻辑,删除时清理库冗余数据
### 5.腾讯云位置图片处理功能开启关闭,将控制腾讯云存储中普通目录图片类文件缩略图和颜色信息获取,具体支持格式可在设置界面内查看
### 9.文件访问地址修改为动态地址,增强文件私密性,为之后版本文件私密保护做准备
### 10.其他已知bug修复
### 6.腾讯云位置位置视频处理功能开启关闭,将控制腾讯云存储中普通目录音视频类文件缩略图和信息获取,支持不能直接播放媒体文件转码,具体支持格式可在设置界面内查看
### 7.腾讯云位置位置文档处理功能开启关闭,将控制腾讯云存储中普通目录文档类文件缩略图,支持文档在线预览(不限于普通目录),具体支持格式可在设置界面内查看
### 8.修复billfish库导入颜色权重未写入问题
### 9.修改缩略图处理结构优化缩略图处理逻辑并支持billfish中特殊格式详情页高清图
###10.库设置中增加腾讯云存储位置库添加
### 11.优化界面处理,修复已知界面问题
### 12.优化库删除逻辑
### 13.其他已知bug修复

View File

@@ -1,15 +1,15 @@
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
define('IN_ADMIN', TRUE);
define('NOROBOT', TRUE);
define('ADMINSCRIPT', basename(__FILE__));
define('BASESCRIPT', basename(__FILE__));
define('CURSCRIPT', 'admin');
define('APPTYPEID', 0);
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
define('IN_ADMIN', TRUE);
define('NOROBOT', TRUE);
define('ADMINSCRIPT', basename(__FILE__));
define('BASESCRIPT', basename(__FILE__));
define('CURSCRIPT', 'admin');
define('APPTYPEID', 0);
require __DIR__.'/core/adminstart.php';

View File

@@ -1,395 +1,395 @@
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
if(!defined('IN_OAOOA') || !defined('IN_ADMIN')) {
exit('Access Denied');
}
function runquery($sql) {
global $_G;
$tablepre = $_G['config']['db'][1]['tablepre'];
$dbcharset = $_G['config']['db'][1]['dbcharset'];
$sql = str_replace(array(' dzz_', ' `dzz_',' oaooa_', ' `oaooa_' ), array(' {tablepre}', ' `{tablepre}',' {tablepre}', ' `{tablepre}' ), $sql);
$sql = str_replace("\r", "\n", str_replace(array(' {tablepre}', ' `{tablepre}'), array(' '.$tablepre, ' `'.$tablepre), $sql));
$ret = array();
$num = 0;
foreach(explode(";\n", trim($sql)) as $query) {
$queries = explode("\n", trim($query));
foreach($queries as $query) {
$ret[$num] .= $query[0] == '#' || $query[0].$query[1] == '--' ? '' : $query;
}
$num++;
}
unset($sql);
foreach($ret as $query) {
$query = trim($query);
if($query) {
if(substr($query, 0, 12) == 'CREATE TABLE') {
$name = preg_replace("/CREATE TABLE ([a-z0-9_]+) .*/is", "\\1", $query);
DB::query(createtable($query, $dbcharset));
} else {
DB::query($query);
}
}
}
}
function createtable($sql, $dbcharset) {
$type = strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU", "\\2", $sql));
$type = in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM';
return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $sql).
( " ENGINE=$type DEFAULT CHARSET=$dbcharset");
}
function cron_create($app, $filename='', $name='', $weekday=-1, $day=-1, $hour=-1, $minute=-1) {
$pluginid = $app['identifier'];
$app_path = $app['app_path'];
if(!ispluginkey($pluginid)) {
return false;
}
$dir = DZZ_ROOT.'./'.$app_path.'/'.$pluginid.'/cron';
if(!file_exists($dir)) {
return false;
}
$crondir = dir($dir);
while($filename = $crondir->read()) {
if(!in_array($filename, array('.', '..')) && preg_match("/^cron\_[\w\.]+$/", $filename)) {
$content = file_get_contents($dir.'/'.$filename);
preg_match("/cronname\:(.+?)\n/", $content, $r);$name = trim($r[1]);
preg_match("/week\:(.+?)\n/", $content, $r);$weekday = trim($r[1]) ? intval($r[1]) : -1;
preg_match("/day\:(.+?)\n/", $content, $r);$day = trim($r[1]) ? intval($r[1]) : -1;
preg_match("/hour\:(.+?)\n/", $content, $r);$hour = trim($r[1]) ? intval($r[1]) : -1;
preg_match("/minute\:(.+?)\n/", $content, $r);$minute = trim($r[1]) ? trim($r[1]) : 0;
$minutenew = explode(',', $minute);
foreach($minutenew as $key => $val) {
$minutenew[$key] = $val = intval($val);
if($val < 0 || $var > 59) {
unset($minutenew[$key]);
}
}
$minutenew = array_slice(array_unique($minutenew), 0, 12);
$minutenew = implode("\t", $minutenew);
$filename = $app_path.':'.$pluginid.':'.$filename;
$cronid = C::t('cron')->get_cronid_by_filename($filename);
if(!$cronid) {
C::t('cron')->insert(array(
'available' => 1,
'type' => 'app',
'name' => $name,
'filename' => $filename,
'weekday' => $weekday,
'day' => $day,
'hour' => $hour,
'minute' => $minutenew,
), true);
} else {
C::t('cron')->update($cronid, array(
'name' => $name,
'weekday' => $weekday,
'day' => $day,
'hour' => $hour,
'minute' => $minutenew,
));
}
}
}
}
function cron_delete($app) {
$pluginid = $app['identifier'];
$app_path = $app['app_path'];
if(!ispluginkey($pluginid)) {
return false;
}
$dir = DZZ_ROOT.'./'.$app_path.'/'.$pluginid.'/cron';
if(!file_exists($dir)) {
return false;
}
$crondir = dir($dir);
$count = 0;
while($filename = $crondir->read()) {
if(!in_array($filename, array('.', '..')) && preg_match("/^cron\_[\w\.]+$/", $filename)) {
$filename = $app_path.':'.$pluginid.':'.$filename;
$cronid = C::t('cron')->get_cronid_by_filename($filename);
C::t('cron')->delete($cronid);
$count++;
}
}
return $count;
}
function isplugindir($dir) {
return preg_match("/^[a-z]+[a-z0-9_]*\/$/", $dir);
}
function ispluginkey($key) {
return preg_match("/^[a-z]+[a-z0-9_]*$/i", $key);
}
function dir_writeable($dir) {
if(!is_dir($dir)) {
@mkdir($dir, 0777);
}
if(is_dir($dir)) {
if($fp = @fopen("$dir/test.txt", 'w')) {
@fclose($fp);
@unlink("$dir/test.txt");
$writeable = 1;
} else {
$writeable = 0;
}
}
return $writeable;
}
function exportdata($name, $filename, $data) {
global $_G;
require_once libfile('class/xml');
$root = array(
'Title' => $name,
'Version' => $_G['setting']['version'],
'Time' => dgmdate(TIMESTAMP, 'Y-m-d H:i'),
'From' => $_G['setting']['bbname'].' ('.$_G['siteurl'].')',
'Data' => exportarray($data, 1)
);
$filename = strtolower(str_replace(array('!', ' '), array('', '_'), $name)).'_'.$filename.'.xml';
$plugin_export = array2xml($root, 1);
ob_end_clean();
dheader('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
dheader('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
dheader('Cache-Control: no-cache, must-revalidate');
dheader('Pragma: no-cache');
dheader('Content-Encoding: none');
dheader('Content-Length: '.strlen($plugin_export));
dheader('Content-Disposition: attachment; filename='.$filename);
dheader('Content-Type: text/xml');
echo $plugin_export;
define('FOOTERDISABLED' , 1);
exit();
}
function imagetobase64($file){
$type=getimagesize($file);//取得图片的大小,类型等
$fp=fopen($file,"r")or die("Can't open file");
$file_content=chunk_split(base64_encode(fread($fp,filesize($file))));//base64编码
switch($type[2]){//判读图片类型
case 1:$img_type="gif";break;
case 2:$img_type="jpg";break;
case 3:$img_type="png";break;
}
$img='data:image/'.$img_type.';base64,'.$file_content;//合成图片的base64编码
fclose($fp);
return $img;
}
function base64toimage($data,$dir='appimg',$target=''){
global $_G;
$dataarr=explode(',',$data);
$imgcontent=base64_decode($dataarr[1]);
$imgext=str_replace(array('data:image/',';base64'),'',$dataarr[0]);
if(!$target) {
$imageext=array('jpg','jpeg','png','gif');
if(!in_array($imgext,$imageext)) $ext='jpg';
$subdir = $subdir1 = $subdir2 = '';
$subdir1 = date('Ym');
$subdir2 = date('d');
$subdir = $subdir1.'/'.$subdir2.'/';
$target1=$_G['setting']['attachdir'].$dir.'/'.$subdir.''.date('His').''.strtolower(random(16)).'.'.$imgext;
$target=str_replace($_G['setting']['attachdir'],'',$target1);
}else{
$target1=$_G['setting']['attachdir'].$target;
}
$targetpath = dirname($target1);
dmkdir($targetpath);
if(file_put_contents($target1, $imgcontent)){
if(@filesize($target1)<200) {
@unlink($target1);
return false;
}
return $target;
}else return false;
}
function importByarray($arr,$force=0){
$app=$arr['app'];
//判断应用是否已经存在
$oapp=DB::fetch_first("select * from %t where identifier=%s and app_path=%s ",array('app_market', $app['identifier'],$app['app_path']));
if(!$force && $oapp){
showmessage('application_been');
}
//转化应用图标
if($app['appico']){
$app['appico']=base64toimage($app['appico'],'appico');
}
$app['extra']=serialize($app['extra']);
if($oapp){
$appid=$oapp['appid'];
C::t('app_market')->update($appid,$app);
}else{
$app['available']=0;
$appid=$app['appid']=C::t('app_market')->insert($app,1);
}
if($arr['hooks']){//初始化钩子
C::t('hooks')->insert_by_appid($appid,$arr['hooks'],$arr['_attributes']['hooks']);
}
if($appid){
C::t('app_open')->insert_by_exts($appid,($app['fileext']?explode(',',$app['fileext']):array()));
C::t('app_tag')->addtags(($app['tag']?explode(',',$app['tag']):array()),$appid);
}
return $app;
}
function upgradeinformation($status = 0) {
global $_G, $upgrade_step;
if(empty($upgrade_step)) {
return '';
}
if($status==1 && $upgrade_step['step']==2) return '';
$update = array();
$siteuniqueid = C::t('setting')->fetch('siteuniqueid');
$update['siteurl']=$_G['siteurl'];
$update['sitename']=$_G['setting']['sitename'];
$update['uniqueid'] = $siteuniqueid;
$update['curversion'] = $upgrade_step['curversion'];
$update['currelease'] = $upgrade_step['currelease'];
$update['upgradeversion'] = $upgrade_step['version'];
$update['upgraderelease'] = $upgrade_step['release'];
$update['step'] = $upgrade_step['step'] == 'dbupdate' ? 4 : $upgrade_step['step'];
$update['status'] = $status;
$update['version_level'] = CORE_VERSION_LEVEL;
$data = '';
foreach($update as $key => $value) {
$data .= $key.'='.rawurlencode($value).'&';
}
$upgradeurl = APP_CHECK_URL."market/system/upgrade/".rawurlencode(base64_encode($data))."/".TIMESTAMP;
dfsockopen($upgradeurl,0, '', '', FALSE, '',0.2);
return '';
//return '<img src="'.$upgradeurl.'" width="0" height="0" />';
}
function upgradeinformation_app($status = 0) {
global $_G, $appinfo;
if(empty($appinfo)) {
return '';
}else{
if( isset($appinfo['upgradeinfo']) ){
$lastversion=$appinfo['upgradeinfo']['version'];
$mid=$appinfo['upgradeinfo']['mid'];
}else{
$lastversion=$appinfo['version'];
$mid=$appinfo['mid'];
}
}
if($status==0) return '';
$update = array();
$siteuniqueid = C::t('setting')->fetch('siteuniqueid');
$update['siteurl']=$_G['siteurl'];
$update['sitename']=$_G['setting']['sitename'];
$update['uniqueid'] = $siteuniqueid;
$update['mid'] = $mid;
$update['curversion'] = $appinfo['version'];
$update['lastversion'] = $lastversion;
$update['identifier'] = $appinfo['identifier'];
$update['lastversion'] = $lastversion;
$update['status'] = $status;
$update['version_level'] = CORE_VERSION_LEVEL;
$data = '';
foreach($update as $key => $value) {
$data .= $key.'='.rawurlencode($value).'&';
}
$upgradeurl=APP_CHECK_URL."market/appinstall/".rawurlencode(base64_encode($data)); //APP_CHECK_URL."index.php?mod=dzzmarket&op=installinfo&data=".rawurlencode(base64_encode($data)).'&timestamp='.TIMESTAMP;
dfsockopen($upgradeurl,0, '', '', FALSE, '',0.2);
return '';
//return '<img src="'.$upgradeurl.'" width="0" height="0" />';
}
function getwheres($intkeys, $strkeys, $randkeys, $likekeys, $pre='') {
$wherearr = array();
$urls = array();
foreach ($intkeys as $var) {
$value = isset($_GET[$var])?$_GET[$var]:'';
if(strlen($value)) {
$urls[] = "$var=$value";
$var = addslashes($var);
$wherearr[] = "{$pre}{$var}='".intval($value)."'";
}
}
foreach ($strkeys as $var) {
$value = isset($_GET[$var])?trim($_GET[$var]):'';
if(strlen($value)) {
$urls[] = "$var=".rawurlencode($value);
$var = addslashes($var);
$value = addslashes($value);
$wherearr[] = "{$pre}{$var}='$value'";
}
}
foreach ($randkeys as $vars) {
$value1 = isset($_GET[$vars[1].'1'])?$vars[0]($_GET[$vars[1].'1']):'';
$value2 = isset($_GET[$vars[1].'2'])?$vars[0]($_GET[$vars[1].'2']):'';
if($value1) {
$urls[] = "{$vars[1]}1=".rawurlencode($_GET[$vars[1].'1']);
$vars[1] = addslashes($vars[1]);
$value1 = addslashes($value1);
$wherearr[] = "{$pre}{$vars[1]}>='$value1'";
}
if($value2) {
$wherearr[] = "{$pre}{$vars[1]}<='$value2'";
$vars[2] = addslashes($vars[2]);
$value2 = addslashes($value2);
$urls[] = "{$vars[1]}2=".rawurlencode($_GET[$vars[1].'2']);
}
}
foreach ($likekeys as $var) {
$value = isset($_GET[$var])?stripsearchkey($_GET[$var]):'';
if(strlen($value)>1) {
$urls[] = "$var=".rawurlencode($_GET[$var]);
$var = addslashes($var);
$value = addslashes($value);
$wherearr[] = "{$pre}{$var} LIKE BINARY '%$value%'";
}
}
return array('wherearr'=>$wherearr, 'urls'=>$urls);
}
function getorders($alloworders, $default, $pre='') {
$orders = array('sql'=>'', 'urls'=>array());
if(empty($_GET['orderby']) || !in_array($_GET['orderby'], $alloworders)) {
$_GET['orderby'] = $default;
if(empty($_GET['ordersc'])) $_GET['ordersc'] = 'desc';
}
$orders['sql'] = " ORDER BY {$pre}$_GET[orderby] ";
$orders['urls'][] = "orderby=$_GET[orderby]";
if(!empty($_GET['ordersc']) && $_GET['ordersc'] == 'desc') {
$orders['urls'][] = 'ordersc=desc';
$orders['sql'] .= ' DESC ';
} else {
$orders['urls'][] = 'ordersc=asc';
}
return $orders;
}
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
if(!defined('IN_OAOOA') || !defined('IN_ADMIN')) {
exit('Access Denied');
}
function runquery($sql) {
global $_G;
$tablepre = $_G['config']['db'][1]['tablepre'];
$dbcharset = $_G['config']['db'][1]['dbcharset'];
$sql = str_replace(array(' dzz_', ' `dzz_',' oaooa_', ' `oaooa_' ), array(' {tablepre}', ' `{tablepre}',' {tablepre}', ' `{tablepre}' ), $sql);
$sql = str_replace("\r", "\n", str_replace(array(' {tablepre}', ' `{tablepre}'), array(' '.$tablepre, ' `'.$tablepre), $sql));
$ret = array();
$num = 0;
foreach(explode(";\n", trim($sql)) as $query) {
$queries = explode("\n", trim($query));
foreach($queries as $query) {
$ret[$num] .= $query[0] == '#' || $query[0].$query[1] == '--' ? '' : $query;
}
$num++;
}
unset($sql);
foreach($ret as $query) {
$query = trim($query);
if($query) {
if(substr($query, 0, 12) == 'CREATE TABLE') {
$name = preg_replace("/CREATE TABLE ([a-z0-9_]+) .*/is", "\\1", $query);
DB::query(createtable($query, $dbcharset));
} else {
DB::query($query);
}
}
}
}
function createtable($sql, $dbcharset) {
$type = strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU", "\\2", $sql));
$type = in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM';
return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $sql).
( " ENGINE=$type DEFAULT CHARSET=$dbcharset");
}
function cron_create($app, $filename='', $name='', $weekday=-1, $day=-1, $hour=-1, $minute=-1) {
$pluginid = $app['identifier'];
$app_path = $app['app_path'];
if(!ispluginkey($pluginid)) {
return false;
}
$dir = DZZ_ROOT.'./'.$app_path.'/'.$pluginid.'/cron';
if(!file_exists($dir)) {
return false;
}
$crondir = dir($dir);
while($filename = $crondir->read()) {
if(!in_array($filename, array('.', '..')) && preg_match("/^cron\_[\w\.]+$/", $filename)) {
$content = file_get_contents($dir.'/'.$filename);
preg_match("/cronname\:(.+?)\n/", $content, $r);$name = trim($r[1]);
preg_match("/week\:(.+?)\n/", $content, $r);$weekday = trim($r[1]) ? intval($r[1]) : -1;
preg_match("/day\:(.+?)\n/", $content, $r);$day = trim($r[1]) ? intval($r[1]) : -1;
preg_match("/hour\:(.+?)\n/", $content, $r);$hour = trim($r[1]) ? intval($r[1]) : -1;
preg_match("/minute\:(.+?)\n/", $content, $r);$minute = trim($r[1]) ? trim($r[1]) : 0;
$minutenew = explode(',', $minute);
foreach($minutenew as $key => $val) {
$minutenew[$key] = $val = intval($val);
if($val < 0 || $var > 59) {
unset($minutenew[$key]);
}
}
$minutenew = array_slice(array_unique($minutenew), 0, 12);
$minutenew = implode("\t", $minutenew);
$filename = $app_path.':'.$pluginid.':'.$filename;
$cronid = C::t('cron')->get_cronid_by_filename($filename);
if(!$cronid) {
C::t('cron')->insert(array(
'available' => 1,
'type' => 'app',
'name' => $name,
'filename' => $filename,
'weekday' => $weekday,
'day' => $day,
'hour' => $hour,
'minute' => $minutenew,
), true);
} else {
C::t('cron')->update($cronid, array(
'name' => $name,
'weekday' => $weekday,
'day' => $day,
'hour' => $hour,
'minute' => $minutenew,
));
}
}
}
}
function cron_delete($app) {
$pluginid = $app['identifier'];
$app_path = $app['app_path'];
if(!ispluginkey($pluginid)) {
return false;
}
$dir = DZZ_ROOT.'./'.$app_path.'/'.$pluginid.'/cron';
if(!file_exists($dir)) {
return false;
}
$crondir = dir($dir);
$count = 0;
while($filename = $crondir->read()) {
if(!in_array($filename, array('.', '..')) && preg_match("/^cron\_[\w\.]+$/", $filename)) {
$filename = $app_path.':'.$pluginid.':'.$filename;
$cronid = C::t('cron')->get_cronid_by_filename($filename);
C::t('cron')->delete($cronid);
$count++;
}
}
return $count;
}
function isplugindir($dir) {
return preg_match("/^[a-z]+[a-z0-9_]*\/$/", $dir);
}
function ispluginkey($key) {
return preg_match("/^[a-z]+[a-z0-9_]*$/i", $key);
}
function dir_writeable($dir) {
if(!is_dir($dir)) {
@mkdir($dir, 0777);
}
if(is_dir($dir)) {
if($fp = @fopen("$dir/test.txt", 'w')) {
@fclose($fp);
@unlink("$dir/test.txt");
$writeable = 1;
} else {
$writeable = 0;
}
}
return $writeable;
}
function exportdata($name, $filename, $data) {
global $_G;
require_once libfile('class/xml');
$root = array(
'Title' => $name,
'Version' => $_G['setting']['version'],
'Time' => dgmdate(TIMESTAMP, 'Y-m-d H:i'),
'From' => $_G['setting']['bbname'].' ('.$_G['siteurl'].')',
'Data' => exportarray($data, 1)
);
$filename = strtolower(str_replace(array('!', ' '), array('', '_'), $name)).'_'.$filename.'.xml';
$plugin_export = array2xml($root, 1);
ob_end_clean();
dheader('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
dheader('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
dheader('Cache-Control: no-cache, must-revalidate');
dheader('Pragma: no-cache');
dheader('Content-Encoding: none');
dheader('Content-Length: '.strlen($plugin_export));
dheader('Content-Disposition: attachment; filename='.$filename);
dheader('Content-Type: text/xml');
echo $plugin_export;
define('FOOTERDISABLED' , 1);
exit();
}
function imagetobase64($file){
$type=getimagesize($file);//取得图片的大小,类型等
$fp=fopen($file,"r")or die("Can't open file");
$file_content=chunk_split(base64_encode(fread($fp,filesize($file))));//base64编码
switch($type[2]){//判读图片类型
case 1:$img_type="gif";break;
case 2:$img_type="jpg";break;
case 3:$img_type="png";break;
}
$img='data:image/'.$img_type.';base64,'.$file_content;//合成图片的base64编码
fclose($fp);
return $img;
}
function base64toimage($data,$dir='appimg',$target=''){
global $_G;
$dataarr=explode(',',$data);
$imgcontent=base64_decode($dataarr[1]);
$imgext=str_replace(array('data:image/',';base64'),'',$dataarr[0]);
if(!$target) {
$imageext=array('jpg','jpeg','png','gif');
if(!in_array($imgext,$imageext)) $ext='jpg';
$subdir = $subdir1 = $subdir2 = '';
$subdir1 = date('Ym');
$subdir2 = date('d');
$subdir = $subdir1.'/'.$subdir2.'/';
$target1=$_G['setting']['attachdir'].$dir.'/'.$subdir.''.date('His').''.strtolower(random(16)).'.'.$imgext;
$target=str_replace($_G['setting']['attachdir'],'',$target1);
}else{
$target1=$_G['setting']['attachdir'].$target;
}
$targetpath = dirname($target1);
dmkdir($targetpath);
if(file_put_contents($target1, $imgcontent)){
if(@filesize($target1)<200) {
@unlink($target1);
return false;
}
return $target;
}else return false;
}
function importByarray($arr,$force=0){
$app=$arr['app'];
//判断应用是否已经存在
$oapp=DB::fetch_first("select * from %t where identifier=%s and app_path=%s ",array('app_market', $app['identifier'],$app['app_path']));
if(!$force && $oapp){
showmessage('application_been');
}
//转化应用图标
if($app['appico']){
$app['appico']=base64toimage($app['appico'],'appico');
}
$app['extra']=serialize($app['extra']);
if($oapp){
$appid=$oapp['appid'];
C::t('app_market')->update($appid,$app);
}else{
$app['available']=0;
$appid=$app['appid']=C::t('app_market')->insert($app,1);
}
if($arr['hooks']){//初始化钩子
C::t('hooks')->insert_by_appid($appid,$arr['hooks'],$arr['_attributes']['hooks']);
}
if($appid){
C::t('app_open')->insert_by_exts($appid,($app['fileext']?explode(',',$app['fileext']):array()));
C::t('app_tag')->addtags(($app['tag']?explode(',',$app['tag']):array()),$appid);
}
return $app;
}
function upgradeinformation($status = 0) {
global $_G, $upgrade_step;
if(empty($upgrade_step)) {
return '';
}
if($status==1 && $upgrade_step['step']==2) return '';
$update = array();
$mcode = C::t('setting')->fetch('machinecode');
$update['siteurl']=$_G['siteurl'];
$update['sitename']=$_G['setting']['sitename'];
$update['mcode'] = $mcode;
$update['curversion'] = $upgrade_step['curversion'];
$update['currelease'] = $upgrade_step['currelease'];
$update['upgradeversion'] = $upgrade_step['version'];
$update['upgraderelease'] = $upgrade_step['release'];
$update['step'] = $upgrade_step['step'] == 'dbupdate' ? 4 : $upgrade_step['step'];
$update['status'] = $status;
$update['version_level'] = CORE_VERSION_LEVEL;
$data = '';
foreach($update as $key => $value) {
$data .= $key.'='.rawurlencode($value).'&';
}
$upgradeurl = APP_CHECK_URL."authlicense/count//upgrade/".rawurlencode(base64_encode($data))."/".TIMESTAMP;
dfsockopen($upgradeurl,0, '', '', FALSE, '',0.2);
return '';
//return '<img src="'.$upgradeurl.'" width="0" height="0" />';
}
function upgradeinformation_app($status = 0) {
global $_G, $appinfo;
if(empty($appinfo)) {
return '';
}else{
if( isset($appinfo['upgradeinfo']) ){
$lastversion=$appinfo['upgradeinfo']['version'];
$mid=$appinfo['upgradeinfo']['mid'];
}else{
$lastversion=$appinfo['version'];
$mid=$appinfo['mid'];
}
}
if($status==0) return '';
$update = array();
$siteuniqueid = C::t('setting')->fetch('siteuniqueid');
$update['siteurl']=$_G['siteurl'];
$update['sitename']=$_G['setting']['sitename'];
$update['uniqueid'] = $siteuniqueid;
$update['mid'] = $mid;
$update['curversion'] = $appinfo['version'];
$update['lastversion'] = $lastversion;
$update['identifier'] = $appinfo['identifier'];
$update['lastversion'] = $lastversion;
$update['status'] = $status;
$update['version_level'] = CORE_VERSION_LEVEL;
$data = '';
foreach($update as $key => $value) {
$data .= $key.'='.rawurlencode($value).'&';
}
$upgradeurl=APP_CHECK_URL."market/appinstall/".rawurlencode(base64_encode($data)); //APP_CHECK_URL."index.php?mod=dzzmarket&op=installinfo&data=".rawurlencode(base64_encode($data)).'&timestamp='.TIMESTAMP;
dfsockopen($upgradeurl,0, '', '', FALSE, '',0.2);
return '';
//return '<img src="'.$upgradeurl.'" width="0" height="0" />';
}
function getwheres($intkeys, $strkeys, $randkeys, $likekeys, $pre='') {
$wherearr = array();
$urls = array();
foreach ($intkeys as $var) {
$value = isset($_GET[$var])?$_GET[$var]:'';
if(strlen($value)) {
$urls[] = "$var=$value";
$var = addslashes($var);
$wherearr[] = "{$pre}{$var}='".intval($value)."'";
}
}
foreach ($strkeys as $var) {
$value = isset($_GET[$var])?trim($_GET[$var]):'';
if(strlen($value)) {
$urls[] = "$var=".rawurlencode($value);
$var = addslashes($var);
$value = addslashes($value);
$wherearr[] = "{$pre}{$var}='$value'";
}
}
foreach ($randkeys as $vars) {
$value1 = isset($_GET[$vars[1].'1'])?$vars[0]($_GET[$vars[1].'1']):'';
$value2 = isset($_GET[$vars[1].'2'])?$vars[0]($_GET[$vars[1].'2']):'';
if($value1) {
$urls[] = "{$vars[1]}1=".rawurlencode($_GET[$vars[1].'1']);
$vars[1] = addslashes($vars[1]);
$value1 = addslashes($value1);
$wherearr[] = "{$pre}{$vars[1]}>='$value1'";
}
if($value2) {
$wherearr[] = "{$pre}{$vars[1]}<='$value2'";
$vars[2] = addslashes($vars[2]);
$value2 = addslashes($value2);
$urls[] = "{$vars[1]}2=".rawurlencode($_GET[$vars[1].'2']);
}
}
foreach ($likekeys as $var) {
$value = isset($_GET[$var])?stripsearchkey($_GET[$var]):'';
if(strlen($value)>1) {
$urls[] = "$var=".rawurlencode($_GET[$var]);
$var = addslashes($var);
$value = addslashes($value);
$wherearr[] = "{$pre}{$var} LIKE BINARY '%$value%'";
}
}
return array('wherearr'=>$wherearr, 'urls'=>$urls);
}
function getorders($alloworders, $default, $pre='') {
$orders = array('sql'=>'', 'urls'=>array());
if(empty($_GET['orderby']) || !in_array($_GET['orderby'], $alloworders)) {
$_GET['orderby'] = $default;
if(empty($_GET['ordersc'])) $_GET['ordersc'] = 'desc';
}
$orders['sql'] = " ORDER BY {$pre}$_GET[orderby] ";
$orders['urls'][] = "orderby=$_GET[orderby]";
if(!empty($_GET['ordersc']) && $_GET['ordersc'] == 'desc') {
$orders['urls'][] = 'ordersc=desc';
$orders['sql'] .= ' DESC ';
} else {
$orders['urls'][] = 'ordersc=asc';
}
return $orders;
}
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,15 @@
<?php
namespace admin\login\classes;
use \core as C;
class Adminlogin{
public function run(){
$dzz = C::app();
$dzz->init();
$admincp = new \dzz_admincp();
$admincp->core = $dzz;
$return = $admincp->init();
if(defined('IS_API') && IS_API && $return === 0){
exit(json_encode(array('loginstatus'=>0,'hash'=>FORMHASH)));
}
}
<?php
namespace admin\login\classes;
use \core as C;
class Adminlogin{
public function run(){
$dzz = C::app();
$dzz->init();
$admincp = new \dzz_admincp();
$admincp->core = $dzz;
$return = $admincp->init();
if(defined('IS_API') && IS_API && $return === 0){
exit(json_encode(array('loginstatus'=>0,'hash'=>FORMHASH)));
}
}
}

View File

@@ -1,130 +1,130 @@
input:-webkit-autofill {
box-shadow: 0 0 0px 1000px white inset !important;
}
.mainContainer {
position: absolute;
height: 100%;
width: 100%;
z-index: 10;
}
.loginContainer {
height: 100%;
width: 100%
}
.logintips {
color: red;
line-height: 30px;
padding: 20px;
width: 350px;
background: #FFF;
border-radius: 5px;
border: 1px solid #e3e3e3;
-webkit-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
-moz-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
box-shadow: 0 5px 15px RGBA(0,0,0,.3);
}
#loginform {
width: 350px;
margin: 0;
text-align: center;
}
.login h4 {
height: 35px;
margin-bottom: 10px;
}
.avatarContainer {
margin-bottom: 50px;
margin-top: 20px;
overflow: hidden;
text-align: center;
}
.avatarContainer img {
max-width: 128px;
max-height: 128px;
}
.avatarContainer .maintitle{
font-size:20px;
font-weight: 600;
padding-top:10px;
}
#admin_password_Container {
padding: 30px 0 30px 0;
}
#admin_password_Container .input-black {
margin-bottom: 10px;
}
.loginformContainer {
padding: 30px;
text-align: center;
background-color: #FFF;
border-radius: 5px;
border: 1px solid #e3e3e3;
-webkit-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
-moz-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
box-shadow: 0 5px 15px RGBA(0,0,0,.3);
}
.loginformContainer .username {
font-size: 16px;
font-weight: bold;
text-align: center;
margin: 10px 0 0;
min-height: 1em;
}
.loginformContainer .email {
color: #404040;
line-height: 2;
margin-bottom: 0;
font-size: 14px;
}
input[type="password"], input[type="text"] {
height: 40px;
width: 100%;
direction: ltr;
font-size: 14px;
outline: none;
width: 286px\0;
*width:286px;
}
input[type="submit"] {
width: 100%;
height: 40px;
font-size: 16px;
font-weight: 700;
width: 286px\0;
*width:286px;
}
input[type="password"]:focus, input[type="text"]:focus {
box-shadow: none;
outline: none;
}
.footer .copyright {
border: medium none;
font-size: 12px;
position: static;
text-align: center;
}
.copyright {
color: #899;
font-family: "微软雅黑";
font-size: 12px;
left: 5px;
line-height: 150%;
padding-top: 20px;
text-align: center;
z-index: 10;
}
.copyright a {
color: #899;
}
.wrapper-placeholder {
text-align: left
}
.Topcarousel {
display: inline-block;
width: 100px;
height: 100px;
border-radius: 50%;
line-height: 100px;
font-size: 45px;
color: #fff;
}
input:-webkit-autofill {
box-shadow: 0 0 0px 1000px white inset !important;
}
.mainContainer {
position: absolute;
height: 100%;
width: 100%;
z-index: 10;
}
.loginContainer {
height: 100%;
width: 100%
}
.logintips {
color: red;
line-height: 30px;
padding: 20px;
width: 350px;
background: #FFF;
border-radius: 5px;
border: 1px solid #e3e3e3;
-webkit-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
-moz-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
box-shadow: 0 5px 15px RGBA(0,0,0,.3);
}
#loginform {
width: 350px;
margin: 0;
text-align: center;
}
.login h4 {
height: 35px;
margin-bottom: 10px;
}
.avatarContainer {
margin-bottom: 50px;
margin-top: 20px;
overflow: hidden;
text-align: center;
}
.avatarContainer img {
max-width: 128px;
max-height: 128px;
}
.avatarContainer .maintitle{
font-size:20px;
font-weight: 600;
padding-top:10px;
}
#admin_password_Container {
padding: 30px 0 30px 0;
}
#admin_password_Container .input-black {
margin-bottom: 10px;
}
.loginformContainer {
padding: 30px;
text-align: center;
background-color: #FFF;
border-radius: 5px;
border: 1px solid #e3e3e3;
-webkit-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
-moz-box-shadow: 0 5px 15px RGBA(0,0,0,.3);
box-shadow: 0 5px 15px RGBA(0,0,0,.3);
}
.loginformContainer .username {
font-size: 16px;
font-weight: bold;
text-align: center;
margin: 10px 0 0;
min-height: 1em;
}
.loginformContainer .email {
color: #404040;
line-height: 2;
margin-bottom: 0;
font-size: 14px;
}
input[type="password"], input[type="text"] {
height: 40px;
width: 100%;
direction: ltr;
font-size: 14px;
outline: none;
width: 286px\0;
*width:286px;
}
input[type="submit"] {
width: 100%;
height: 40px;
font-size: 16px;
font-weight: 700;
width: 286px\0;
*width:286px;
}
input[type="password"]:focus, input[type="text"]:focus {
box-shadow: none;
outline: none;
}
.footer .copyright {
border: medium none;
font-size: 12px;
position: static;
text-align: center;
}
.copyright {
color: #899;
font-family: "微软雅黑";
font-size: 12px;
left: 5px;
line-height: 150%;
padding-top: 20px;
text-align: center;
z-index: 10;
}
.copyright a {
color: #899;
}
.wrapper-placeholder {
text-align: left
}
.Topcarousel {
display: inline-block;
width: 100px;
height: 100px;
border-radius: 50%;
line-height: 100px;
font-size: 45px;
color: #fff;
}

View File

@@ -1,9 +1,9 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/9/7
* Time: 16:24
*/
$return = updatesession();
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/9/7
* Time: 16:24
*/
$return = updatesession();
exit(json_encode(array('status'=>$return)));

File diff suppressed because it is too large Load Diff

View File

@@ -1,49 +1,49 @@
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
function checkAll(type, form, value, checkall, changestyle) {
var checkall = checkall ? checkall : 'chkall';
for(var i = 0; i < form.elements.length; i++) {
var e = form.elements[i];
if(type == 'option' && e.type == 'radio' && e.value == value && e.disabled != true) {
e.checked = true;
} else if(type == 'value' && e.type == 'checkbox' && e.getAttribute('chkvalue') == value) {
e.checked = form.elements[checkall].checked;
if(changestyle) {
multiupdate(e);
}
} else if(type == 'prefix' && e.name && e.name != checkall && (!value || (value && e.name.match(value)))) {
e.checked = form.elements[checkall].checked;
if(changestyle) {
if(e.parentNode && e.parentNode.tagName.toLowerCase() == 'li') {
e.parentNode.className = e.checked ? 'checked' : '';
}
if(e.parentNode.parentNode && e.parentNode.parentNode.tagName.toLowerCase() == 'div') {
e.parentNode.parentNode.className = e.checked ? 'item checked' : 'item';
}
}
}
}
}
function fixTree_organization(el){
el.find('.tree-heng1').each(function(){
var tr=jQuery(this).parent().parent().parent();
var dep=jQuery(this).parent().find('.tree-su').length;
tr.nextAll().each(function(){
var child_org=jQuery(this).find('.child-org');
var dep1=child_org.find('.tree-su').length;
if(dep1<=dep) return false;
else{
child_org.find('.tree-su').eq(dep).removeClass('tree-su');
}
});
});
}
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
function checkAll(type, form, value, checkall, changestyle) {
var checkall = checkall ? checkall : 'chkall';
for(var i = 0; i < form.elements.length; i++) {
var e = form.elements[i];
if(type == 'option' && e.type == 'radio' && e.value == value && e.disabled != true) {
e.checked = true;
} else if(type == 'value' && e.type == 'checkbox' && e.getAttribute('chkvalue') == value) {
e.checked = form.elements[checkall].checked;
if(changestyle) {
multiupdate(e);
}
} else if(type == 'prefix' && e.name && e.name != checkall && (!value || (value && e.name.match(value)))) {
e.checked = form.elements[checkall].checked;
if(changestyle) {
if(e.parentNode && e.parentNode.tagName.toLowerCase() == 'li') {
e.parentNode.className = e.checked ? 'checked' : '';
}
if(e.parentNode.parentNode && e.parentNode.parentNode.tagName.toLowerCase() == 'div') {
e.parentNode.parentNode.className = e.checked ? 'item checked' : 'item';
}
}
}
}
}
function fixTree_organization(el){
el.find('.tree-heng1').each(function(){
var tr=jQuery(this).parent().parent().parent();
var dep=jQuery(this).parent().find('.tree-su').length;
tr.nextAll().each(function(){
var child_org=jQuery(this).find('.child-org');
var dep1=child_org.find('.tree-su').length;
if(dep1<=dep) return false;
else{
child_org.find('.tree-su').eq(dep).removeClass('tree-su');
}
});
});
}

View File

@@ -1 +0,0 @@
.max-width[data-v-6168216d]{width:360px}

View File

@@ -1 +0,0 @@
.wait-files[data-v-00939ee2]{line-height:25px;border:1px solid #dcdfe6;margin-bottom:10px;padding:5px;font-size:14px}

View File

@@ -1 +1 @@
.el-avatar[data-v-6f47bc15]{float:left;cursor:pointer}.el-divider--horizontal.el-divider[data-v-6f47bc15]{margin:8px 0}.aboutPichome{padding:0;width:478px}.aboutPichome .el-message-box__btns,.aboutPichome .el-message-box__header{display:none}.aboutPichome .aboutlogo{text-align:center;line-height:0;padding-top:40px}.aboutPichome .aboutmessage{padding:65px 40px;font-size:19px;padding-bottom:15px}.aboutPichome .aboutmessage .aboutlist{margin-bottom:20px;overflow:hidden}.aboutPichome a{text-decoration:none}.aboutPichome .aboutmessage .aboutlist .title{float:left;width:95px}.aboutPichome .aboutmessage .aboutlist .mes{float:left;width:calc(100% - 95px)}.aboutPichome .aboutmessage .aboutlist .update{font-size:12px}
.el-avatar[data-v-1aac96c1]{float:left;cursor:pointer}.el-divider--horizontal.el-divider[data-v-1aac96c1]{margin:8px 0}.aboutPichome{padding:0;width:478px}.aboutPichome .el-message-box__btns,.aboutPichome .el-message-box__header{display:none}.aboutPichome .aboutlogo{text-align:center;line-height:0;padding-top:40px}.aboutPichome .aboutmessage{padding:65px 40px;font-size:19px;padding-bottom:15px}.aboutPichome .aboutmessage .aboutlist{margin-bottom:20px;overflow:hidden}.aboutPichome a{text-decoration:none}.aboutPichome .aboutmessage .aboutlist .title{float:left;width:95px}.aboutPichome .aboutmessage .aboutlist .mes{float:left;width:calc(100% - 95px)}.aboutPichome .aboutmessage .aboutlist .update{font-size:12px}

View File

@@ -1 +0,0 @@
.el-avatar[data-v-663b95fa]{float:left;cursor:pointer}.el-divider--horizontal.el-divider[data-v-663b95fa]{margin:8px 0}.aboutPichome{padding:0;width:478px}.aboutPichome .el-message-box__btns,.aboutPichome .el-message-box__header{display:none}.aboutPichome .aboutlogo{text-align:center;line-height:0;padding-top:40px}.aboutPichome .aboutmessage{padding:65px 40px;font-size:19px;padding-bottom:15px}.aboutPichome .aboutmessage .aboutlist{margin-bottom:20px;overflow:hidden}.aboutPichome a{text-decoration:none}.aboutPichome .aboutmessage .aboutlist .title{float:left;width:95px}.aboutPichome .aboutmessage .aboutlist .mes{float:left;width:calc(100% - 95px)}.aboutPichome .aboutmessage .aboutlist .update{font-size:12px}

View File

@@ -1 +1 @@
.el-container[data-v-6b6f1ca9],.el-main[data-v-6b6f1ca9]{height:100%}.el-main[data-v-6b6f1ca9]{padding:0}.top-title .el-steps[data-v-31baf320]{background:transparent;padding:0 25px}.top-title .el-steps[data-v-31baf320] .el-step__icon{vertical-align:middle}.el-progress[data-v-31baf320]{width:400px;display:inline-block}.content[data-v-31baf320]{padding:20px 25px}.help-inline li[data-v-31baf320]{margin-bottom:5px}.top-title .main-title[data-v-da54ce54]{font-size:14px;color:#909399;cursor:pointer;margin-right:20px;vertical-align:bottom}.top-title .main-title.is-active[data-v-da54ce54]{color:#369}.content[data-v-da54ce54]{padding:20px 25px}.systemExportNotify{width:auto}.help-inline li[data-v-174d5b16]{margin-bottom:5px;padding:0}.max-width[data-v-174d5b16]{width:260px}.custom-single[data-v-174d5b16]{height:40px;margin-bottom:5px}.custom-single .el-checkbox[data-v-174d5b16]{overflow:hidden}.custom-single .el-checkbox[data-v-174d5b16] .el-checkbox__input{vertical-align:text-top}.custom-single .el-checkbox[data-v-174d5b16] .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-checkbox[data-v-174d5b16],.el-radio[data-v-174d5b16]{margin-bottom:5px;margin-left:0!important}.el-radio[data-v-174d5b16]{min-width:260px}.max-width[data-v-71031654]{width:50%}.content[data-v-24008314]{padding:20px 25px}.help-inline li[data-v-24008314]{margin-bottom:5px;padding:0}.help-inline[data-v-5e61246c]{display:block}.help-inline li[data-v-5e61246c]{margin-bottom:5px;padding:0}.max-width[data-v-5e61246c]{width:360px}
.el-container[data-v-51d41a2c],.el-main[data-v-51d41a2c]{height:100%}.el-main[data-v-51d41a2c]{padding:0}.top-title .el-steps[data-v-31baf320]{background:transparent;padding:0 25px}.top-title .el-steps[data-v-31baf320] .el-step__icon{vertical-align:middle}.el-progress[data-v-31baf320]{width:400px;display:inline-block}.content[data-v-31baf320]{padding:20px 25px}.help-inline li[data-v-31baf320]{margin-bottom:5px}.top-title .main-title[data-v-da54ce54]{font-size:14px;color:#909399;cursor:pointer;margin-right:20px;vertical-align:bottom}.top-title .main-title.is-active[data-v-da54ce54]{color:#369}.content[data-v-da54ce54]{padding:20px 25px}.systemExportNotify{width:auto}.help-inline li[data-v-174d5b16]{margin-bottom:5px;padding:0}.max-width[data-v-174d5b16]{width:260px}.custom-single[data-v-174d5b16]{height:40px;margin-bottom:5px}.custom-single .el-checkbox[data-v-174d5b16]{overflow:hidden}.custom-single .el-checkbox[data-v-174d5b16] .el-checkbox__input{vertical-align:text-top}.custom-single .el-checkbox[data-v-174d5b16] .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-checkbox[data-v-174d5b16],.el-radio[data-v-174d5b16]{margin-bottom:5px;margin-left:0!important}.el-radio[data-v-174d5b16]{min-width:260px}.max-width[data-v-71031654]{width:50%}.content[data-v-24008314]{padding:20px 25px}.help-inline li[data-v-24008314]{margin-bottom:5px;padding:0}.help-inline[data-v-5e61246c]{display:block}.help-inline li[data-v-5e61246c]{margin-bottom:5px;padding:0}.max-width[data-v-5e61246c]{width:360px}

View File

@@ -1 +1 @@
<!DOCTYPE html><html lang=zh><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon.ico><title></title><link href=admin/system/dist/css/chunk-2b4f90f7.519dec70.css rel=prefetch><link href=admin/system/dist/css/chunk-494f643e.7502109f.css rel=prefetch><link href=admin/system/dist/css/chunk-5ae5cc35.d763cbce.css rel=prefetch><link href=admin/system/dist/css/chunk-74c32c70.4b7d665e.css rel=prefetch><link href=admin/system/dist/css/chunk-76f23146.6fc79cd8.css rel=prefetch><link href=admin/system/dist/css/chunk-7828662a.c81657ef.css rel=prefetch><link href=admin/system/dist/css/chunk-801d4da6.a47ba236.css rel=prefetch><link href=admin/system/dist/css/chunk-9f9c2568.5356ad7d.css rel=prefetch><link href=admin/system/dist/css/chunk-af3b1b98.b822363f.css rel=prefetch><link href=admin/system/dist/css/chunk-e730cc06.987283b7.css rel=prefetch><link href=admin/system/dist/css/system_temp.a56510eb.css rel=prefetch><link href=admin/system/dist/js/chunk-2b4f90f7.8dd0185d.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0a3327.ad2684c9.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0bdbc6.4ec7bc5e.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0dd46d.e13ddeba.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0efd3c.44a093d1.js rel=prefetch><link href=admin/system/dist/js/chunk-2d20fcd9.50f81306.js rel=prefetch><link href=admin/system/dist/js/chunk-2d21ddf7.9f7b329e.js rel=prefetch><link href=admin/system/dist/js/chunk-494f643e.77a11d42.js rel=prefetch><link href=admin/system/dist/js/chunk-5ae5cc35.25761a21.js rel=prefetch><link href=admin/system/dist/js/chunk-74c32c70.1f5e9382.js rel=prefetch><link href=admin/system/dist/js/chunk-76f23146.0d2957ed.js rel=prefetch><link href=admin/system/dist/js/chunk-7828662a.e587f025.js rel=prefetch><link href=admin/system/dist/js/chunk-801d4da6.0f74a3ea.js rel=prefetch><link href=admin/system/dist/js/chunk-9f9c2568.538835dd.js rel=prefetch><link href=admin/system/dist/js/chunk-af3b1b98.850ec152.js rel=prefetch><link href=admin/system/dist/js/chunk-e730cc06.3ce9a994.js rel=prefetch><link href=admin/system/dist/js/system_temp.c7e32270.js rel=prefetch><link href=admin/system/dist/css/chunk-vendors.4d5d56a8.css rel=preload as=style><link href=admin/system/dist/css/index.7d0ec6bf.css rel=preload as=style><link href=admin/system/dist/js/chunk-vendors.3b95dfe3.js rel=preload as=script><link href=admin/system/dist/js/index.5892fe49.js rel=preload as=script><link href=admin/system/dist/css/chunk-vendors.4d5d56a8.css rel=stylesheet><link href=admin/system/dist/css/index.7d0ec6bf.css rel=stylesheet></head><body><div id=app></div><script src=admin/system/dist/js/chunk-vendors.3b95dfe3.js></script><script src=admin/system/dist/js/index.5892fe49.js></script></body></html>
<!DOCTYPE html><html lang=zh><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon.ico><title></title><link href=admin/system/dist/css/chunk-2b4f90f7.519dec70.css rel=prefetch><link href=admin/system/dist/css/chunk-494f643e.7502109f.css rel=prefetch><link href=admin/system/dist/css/chunk-5ae5cc35.d763cbce.css rel=prefetch><link href=admin/system/dist/css/chunk-74c32c70.4b7d665e.css rel=prefetch><link href=admin/system/dist/css/chunk-76f23146.6fc79cd8.css rel=prefetch><link href=admin/system/dist/css/chunk-7828662a.c81657ef.css rel=prefetch><link href=admin/system/dist/css/chunk-7aef2525.9e97ae28.css rel=prefetch><link href=admin/system/dist/css/chunk-9f9c2568.5356ad7d.css rel=prefetch><link href=admin/system/dist/css/chunk-af3b1b98.b822363f.css rel=prefetch><link href=admin/system/dist/css/chunk-e730cc06.987283b7.css rel=prefetch><link href=admin/system/dist/css/system_temp.abc9b69c.css rel=prefetch><link href=admin/system/dist/js/chunk-2b4f90f7.45b9151d.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0a3327.ad2684c9.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0bdbc6.4ec7bc5e.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0dd46d.e13ddeba.js rel=prefetch><link href=admin/system/dist/js/chunk-2d0efd3c.44a093d1.js rel=prefetch><link href=admin/system/dist/js/chunk-2d20fcd9.50f81306.js rel=prefetch><link href=admin/system/dist/js/chunk-2d21ddf7.9f7b329e.js rel=prefetch><link href=admin/system/dist/js/chunk-494f643e.77a11d42.js rel=prefetch><link href=admin/system/dist/js/chunk-5ae5cc35.25761a21.js rel=prefetch><link href=admin/system/dist/js/chunk-74c32c70.1f5e9382.js rel=prefetch><link href=admin/system/dist/js/chunk-76f23146.0d2957ed.js rel=prefetch><link href=admin/system/dist/js/chunk-7828662a.e587f025.js rel=prefetch><link href=admin/system/dist/js/chunk-7aef2525.35b8efb8.js rel=prefetch><link href=admin/system/dist/js/chunk-9f9c2568.538835dd.js rel=prefetch><link href=admin/system/dist/js/chunk-af3b1b98.850ec152.js rel=prefetch><link href=admin/system/dist/js/chunk-e730cc06.3ce9a994.js rel=prefetch><link href=admin/system/dist/js/system_temp.b94f1119.js rel=prefetch><link href=admin/system/dist/css/chunk-vendors.4d5d56a8.css rel=preload as=style><link href=admin/system/dist/css/index.7d0ec6bf.css rel=preload as=style><link href=admin/system/dist/js/chunk-vendors.3b95dfe3.js rel=preload as=script><link href=admin/system/dist/js/index.b9edc49b.js rel=preload as=script><link href=admin/system/dist/css/chunk-vendors.4d5d56a8.css rel=stylesheet><link href=admin/system/dist/css/index.7d0ec6bf.css rel=stylesheet></head><body><div id=app></div><script src=admin/system/dist/js/chunk-vendors.3b95dfe3.js></script><script src=admin/system/dist/js/index.b9edc49b.js></script></body></html>

View File

@@ -1 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2b4f90f7"],{3685:function(t,e,a){},ec9e:function(t,e,a){"use strict";var n=a("3685"),i=a.n(n);i.a},fcc8f:function(t,e,a){"use strict";a.r(e);var n=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"resNav"},[a("div",{staticClass:"resNav-item resNav-left"},[a("a",{staticClass:"h-left",attrs:{href:"javascript:;"},on:{click:function(e){return t.goBack()}}},[a("el-image",{attrs:{src:"data/attachment/sitelogo/sitelogo.png",fit:"contain"}}),a("span",{staticClass:"text"},[t._v(t._s(t.navTitle))])],1)]),a("div",{staticClass:"resNav-item resNav-center"}),a("div",{staticClass:"resNav-item resNav-right"},[a("Mavatar")],1)])},i=[],c=(a("d3b7"),a("5530")),s=a("2f62"),r={props:["hideContent","apptype","hideBack"],data:function(){return{}},computed:Object(c["a"])(Object(c["a"])({},Object(s["c"])(["headerName","navTitle","IfuserAgent"])),Object(s["b"])(["GetNavMenu"])),methods:{handleClick:function(t){var e=this.GetNavMenu;for(var a in e)if(e[a].index==t){"admin"==e[a].type?window.location.href="admin.php?mod="+t:window.location.href="index.php?mod="+t;break}},goBack:function(){window.location.href="/"}},components:{Mavatar:function(){return a.e("chunk-801d4da6").then(a.bind(null,"6254"))}}},o=r,d=(a("ec9e"),a("2877")),l=Object(d["a"])(o,n,i,!1,null,"b9d2b62e",null);e["default"]=l.exports}}]);
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2b4f90f7"],{3685:function(t,e,a){},ec9e:function(t,e,a){"use strict";var n=a("3685"),i=a.n(n);i.a},fcc8f:function(t,e,a){"use strict";a.r(e);var n=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"resNav"},[a("div",{staticClass:"resNav-item resNav-left"},[a("a",{staticClass:"h-left",attrs:{href:"javascript:;"},on:{click:function(e){return t.goBack()}}},[a("el-image",{attrs:{src:"data/attachment/sitelogo/sitelogo.png",fit:"contain"}}),a("span",{staticClass:"text"},[t._v(t._s(t.navTitle))])],1)]),a("div",{staticClass:"resNav-item resNav-center"}),a("div",{staticClass:"resNav-item resNav-right"},[a("Mavatar")],1)])},i=[],c=(a("d3b7"),a("5530")),s=a("2f62"),r={props:["hideContent","apptype","hideBack"],data:function(){return{}},computed:Object(c["a"])(Object(c["a"])({},Object(s["c"])(["headerName","navTitle","IfuserAgent"])),Object(s["b"])(["GetNavMenu"])),methods:{handleClick:function(t){var e=this.GetNavMenu;for(var a in e)if(e[a].index==t){"admin"==e[a].type?window.location.href="admin.php?mod="+t:window.location.href="index.php?mod="+t;break}},goBack:function(){window.location.href="/"}},components:{Mavatar:function(){return a.e("chunk-7aef2525").then(a.bind(null,"6254"))}}},o=r,l=(a("ec9e"),a("2877")),d=Object(l["a"])(o,n,i,!1,null,"b9d2b62e",null);e["default"]=d.exports}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2b4f90f7"],{3685:function(t,e,a){},ec9e:function(t,e,a){"use strict";var n=a("3685"),i=a.n(n);i.a},fcc8f:function(t,e,a){"use strict";a.r(e);var n=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"resNav"},[a("div",{staticClass:"resNav-item resNav-left"},[a("a",{staticClass:"h-left",attrs:{href:"javascript:;"},on:{click:function(e){return t.goBack()}}},[a("el-image",{attrs:{src:"data/attachment/sitelogo/sitelogo.png",fit:"contain"}}),a("span",{staticClass:"text"},[t._v(t._s(t.navTitle))])],1)]),a("div",{staticClass:"resNav-item resNav-center"}),a("div",{staticClass:"resNav-item resNav-right"},[a("Mavatar")],1)])},i=[],c=(a("d3b7"),a("5530")),s=a("2f62"),r={props:["hideContent","apptype","hideBack"],data:function(){return{}},computed:Object(c["a"])(Object(c["a"])({},Object(s["c"])(["headerName","navTitle","IfuserAgent"])),Object(s["b"])(["GetNavMenu"])),methods:{handleClick:function(t){var e=this.GetNavMenu;for(var a in e)if(e[a].index==t){"admin"==e[a].type?window.location.href="admin.php?mod="+t:window.location.href="index.php?mod="+t;break}},goBack:function(){window.location.href="/"}},components:{Mavatar:function(){return a.e("chunk-5cdcd199").then(a.bind(null,"6254"))}}},o=r,d=(a("ec9e"),a("2877")),l=Object(d["a"])(o,n,i,!1,null,"b9d2b62e",null);e["default"]=l.exports}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0bdbc6"],{"2ced":function(t,n,e){"use strict";e.r(n);var c=function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)","text-align":"center"},attrs:{shadow:"hover"}},[e("p",[t._v(t._s(t.$t("upgrade_none")))])])},a=[],o={data:function(){return{}},created:function(){},methods:{},components:{},mounted:function(){}},r=o,s=e("2877"),u=Object(s["a"])(r,c,a,!1,null,null,null);n["default"]=u.exports}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0dd46d"],{8164:function(e,t,a){"use strict";a.r(t);var s=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}]},[a("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)","text-align":"center"},attrs:{shadow:"hover"}},[a("p",{staticStyle:{"margin-bottom":"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful1")))])],1),a("p",{staticStyle:{margin:"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful2",{msg:e.$route.params.version})))])],1),a("p",{staticStyle:{"margin-bottom":"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful3",{dir:e.dir})))])],1),a("p",{staticStyle:{margin:"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful4",{backdir:e.backdir})))])],1)])],1)},n=[],r=(a("96cf"),a("1da1")),i={data:function(){return{loading:!1,dir:"",backdir:""}},created:function(){this.getData()},methods:{getData:function(){var e=this;return Object(r["a"])(regeneratorRuntime.mark((function t(){var a,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.next=3,e.axios.post("admin.php?mod=system&op=intsystemupgrade&operation=patch&step=5",{version:e.$route.params.version});case 3:a=t.sent,s=a.data,e.dir=s.dir,e.backdir=s.backdir,e.loading=!1;case 8:case"end":return t.stop()}}),t)})))()}},components:{},mounted:function(){}},c=i,d=a("2877"),u=Object(d["a"])(c,s,n,!1,null,"f4790950",null);t["default"]=u.exports}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0dd46d"],{8164:function(e,t,a){"use strict";a.r(t);var s=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}]},[a("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)","text-align":"center"},attrs:{shadow:"hover"}},[a("p",{staticStyle:{"margin-bottom":"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful1")))])],1),a("p",{staticStyle:{margin:"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful2",{msg:e.$route.params.version})))])],1),a("p",{staticStyle:{"margin-bottom":"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful3",{dir:e.dir})))])],1),a("p",{staticStyle:{margin:"0"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("upgrade_successful4",{backdir:e.backdir})))])],1)])],1)},n=[],r=(a("96cf"),a("1da1")),i={data:function(){return{loading:!1,dir:"",backdir:""}},created:function(){this.getData()},methods:{getData:function(){var e=this;return Object(r["a"])(regeneratorRuntime.mark((function t(){var a,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.next=3,e.axios.post("admin.php?mod=system&op=intsystemupgrade&operation=patch&step=5",{version:e.$route.params.version});case 3:a=t.sent,s=a.data,e.dir=s.dir,e.backdir=s.backdir,e.loading=!1;case 8:case"end":return t.stop()}}),t)})))()}},components:{},mounted:function(){}},c=i,d=a("2877"),u=Object(d["a"])(c,s,n,!1,null,"306dae10",null);t["default"]=u.exports}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0efd3c"],{"9a86":function(e,t,a){"use strict";a.r(t);var r=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}]},[e.floading?a("div",[e.tableData.length?[a("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)","margin-bottom":"25px"},attrs:{shadow:"hover"}},[a("ul",{staticClass:"help-inline",domProps:{innerHTML:e._s(e.$t("founder_upgrade_diff_show",{version:e.returnData.version,oldversion:e.oldversion}))}})]),a("el-table",{staticStyle:{width:"100%"},attrs:{data:e.tableData,border:""}},[a("el-table-column",{attrs:{prop:"name",label:"文件名"}}),a("el-table-column",{attrs:{align:"center",prop:"status",label:"状态",width:"120"},scopedSlots:e._u([{key:"default",fn:function(t){return[1==t.row.status?[a("el-link",{attrs:{underline:!1,type:"danger"}},[e._v(e._s(e.$t("founder_upgrade_diff")))])]:2==t.row.status?[a("el-link",{attrs:{underline:!1,type:"info"}},[e._v(e._s(e.$t("founder_upgrade_normal")))])]:3==t.row.status?[a("el-link",{attrs:{underline:!1,type:"primary"}},[e._v(e._s(e.$t("founder_upgrade_new")))])]:e._e()]}}],null,!1,3979069617)})],1),a("div",{staticStyle:{"margin-top":"10px"}},[a("el-button",{attrs:{size:"small",type:"primary"},on:{click:e.handleupdate}},[e._v(e._s(e.button))])],1)]:[a("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)"},attrs:{shadow:"hover"}},[a("el-link",{attrs:{type:"success",underline:!1}},[e._v(e._s(e.$t("filecheck_nofound_md5file")))])],1)]],2):e._e()])},n=[],o=(a("96cf"),a("1da1")),s={props:["returnData"],data:function(){return{loading:!1,floading:!1,tableData:[],button:"",oldversion:""}},created:function(){this.getData()},methods:{getData:function(){var e=this;return Object(o["a"])(regeneratorRuntime.mark((function t(){var a,r,n,o,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,a={version:e.returnData.version?e.returnData.version:"",locale:e.returnData.locale?e.returnData.locale:"",charset:e.returnData.charset?e.returnData.charset:""},t.next=4,e.axios.post("admin.php?mod=system&op=intsystemupgrade&operation=patch&step=3",a);case 4:if(r=t.sent,n=r.data,!n.upgradeNone){t.next=12;break}return o={upgradeNone:!0},e.$emit("handleStep",o),t.abrupt("return",!1);case 12:if(!n.upgradeError){t.next=18;break}return o={upgradeError:!0},e.$emit("handleStep",o),t.abrupt("return",!1);case 18:if(!n.bbclosed){t.next=22;break}return s={template:"bbclosed"},e.$emit("handleStep",s),t.abrupt("return",!1);case 22:e.tableData=n.tableData,e.button=n.button,e.oldversion=n.oldversion,e.loading=!1,e.floading=!0;case 27:case"end":return t.stop()}}),t)})))()},handleupdate:function(){var e={template:4};return this.$emit("handleStep",e),!1}},components:{},mounted:function(){}},l=s,i=a("2877"),u=Object(i["a"])(l,r,n,!1,null,null,null);t["default"]=u.exports}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d21ddf7"],{d2c6:function(t,e,a){"use strict";a.r(e);var r=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[3==t.downloadstatus?[a("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)","text-align":"center"},attrs:{shadow:"hover"}},[a("p",[t._v(t._s(t.$t("upgrade_redownload",{file:t.data.file})))]),a("el-button",{attrs:{type:"primary",size:"medium"},on:{click:t.handleretry}},[t._v(t._s(t.$t("retry")))])],1)]:[a("el-card",{staticClass:"box-card",staticStyle:{width:"600px",margin:"0 auto","margin-top":"50px"}},[a("div",{staticClass:"clearfix",staticStyle:{"text-align":"center"},attrs:{slot:"header"},slot:"header"},[a("span",[t._v(t._s(t.$t("upgrade_downloading_file")))])]),a("p",{staticStyle:{width:"100%",overflow:"hidden","white-space":"nowrap","text-overflow":"ellipsis","font-size":"14px"}},[4==t.downloadstatus?[t._v(t._s(t.$t("upgrade_download_complete_to_compare")))]:[t._v(t._s(t.data.file))]],2),a("el-progress",{staticStyle:{"margin-bottom":"20px"},attrs:{"text-inside":!0,"stroke-width":26,percentage:t.data.percent}})],1)]],2)},n=[],s=(a("96cf"),a("1da1")),o={props:["returnData"],data:function(){return{stepstatus:!0,downloadstatus:0,data:{file:"",fileseq:1,percent:0}}},created:function(){this.getData()},methods:{getData:function(){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function e(){var a,r,n,s,o,d;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(t.stepstatus){e.next=2;break}return e.abrupt("return",!1);case 2:return a={version:t.returnData.version?t.returnData.version:"",locale:t.returnData.locale?t.returnData.locale:"",charset:t.returnData.charset?t.returnData.charset:"",fileseq:t.data.fileseq},e.next=5,t.axios.post("admin.php?mod=system&op=intsystemupgrade&operation=patch&step=2",a);case 5:if(r=e.sent,n=r.data,!n.upgradeNone){e.next=13;break}return s={upgradeNone:!0},t.$emit("handleStep",s),e.abrupt("return",!1);case 13:if(!n.upgradeError){e.next=19;break}return s={upgradeError:!0},t.$emit("handleStep",s),e.abrupt("return",!1);case 19:if(!n.bbclosed){e.next=23;break}return o={template:"bbclosed"},t.$emit("handleStep",o),e.abrupt("return",!1);case 23:return t.downloadstatus=n.downloadstatus,3==n.downloadstatus?t.data.file=n.data.file:4==n.downloadstatus?(t.data.percent=100,d={template:3},setTimeout((function(){t.$emit("handleStep",d)}),1e3)):(n.data.percent=parseInt(n.data.percent),t.data=n.data,t.getData()),e.abrupt("return",!1);case 26:case"end":return e.stop()}}),e)})))()},handleretry:function(){window.location.reload()}},components:{},mounted:function(){},destroyed:function(){this.stepstatus=!1}},d=o,i=a("2877"),u=Object(i["a"])(d,r,n,!1,null,null,null);e["default"]=u.exports}}]);

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-5cdcd199"],{6254:function(t,a,e){"use strict";e.r(a);var o=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticStyle:{"margin-left":"10px",display:"inherit"}},[e("el-dropdown",{staticStyle:{width:"35px",height:"35px"},attrs:{trigger:"click","hide-on-click":!1},on:{command:t.handleAvatar}},[t.GetUserData.icon?[e("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:t.GetUserData.username,placement:"left"}},[e("el-avatar",{attrs:{size:35,src:t.GetUserData.icon}})],1)]:[e("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:t.GetUserData.username,placement:"left"}},[e("el-avatar",{style:{background:t.GetUserData.headerColor},attrs:{size:35}},[t._v(t._s(t.GetUserData.firstword))])],1)],e("el-dropdown-menu",{staticClass:"avatar-dropdown",attrs:{slot:"dropdown"},slot:"dropdown"},[e("el-dropdown-item",{attrs:{command:"personal"}},[t._v("个人设置")]),e("el-dropdown-item",{attrs:{command:"help"}},[t._v("帮助文档")]),e("el-dropdown-item",{attrs:{command:"problem"}},[t._v("问题反馈")]),e("el-divider"),e("el-dropdown-item",{attrs:{command:"setting"}},[t._v("站点设置")]),e("el-dropdown-item",{attrs:{command:"library"}},[t._v("库设置")]),e("el-dropdown-item",{attrs:{command:"system"}},[e("span",{staticStyle:{position:"relative"}},[t._v(" 系统工具 "),t.GetUserData.upgrade?e("div",{staticClass:"tip",staticStyle:{width:"7px",height:"7px","border-radius":"50%",background:"red",position:"absolute",left:"-13px",top:"0",bottom:"0",margin:"auto"}}):t._e()])]),e("el-divider"),e("el-dropdown-item",{attrs:{command:"about"}},[t._v("关于PicHome")]),e("el-dropdown-item",{attrs:{command:"OutLogin"}},[t._v("退出站点")])],1)],2)],1)},s=[],n=(e("96cf"),e("1da1")),i=e("5530"),r=e("2f62"),c={data:function(){return{}},computed:Object(i["a"])({},Object(r["b"])(["GetUserData","GetFormHash","GetLanguage"])),methods:{handleAvatar:function(t){switch(t){case"personal":window.location.href="index.php?mod=pichome&op=user&do=personal";break;case"help":window.open("https://www.yuque.com/pichome");break;case"problem":window.open("https://support.qq.com/products/340252");break;case"setting":window.location.href="index.php?mod=pichome&op=admin&do=basic";break;case"library":window.location.href="index.php?mod=pichome&op=library";break;case"about":this.$alert('<div class="aboutlogo">\n \t\t\t<img src="dzz/pichome/image/phlogo.png" alt="">\n \t\t</div>\n \t\t<div class="aboutmessage">\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">软件名称:</span><span class="mes">欧奥PicHome</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">版本信息:</span><span class="mes">'+this.GetUserData.version+'</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">版权信息:</span><span class="mes">Powered By oaooa PicHome © 2020-2021 欧奥图文</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">网站地址:</span><span class="mes"><a class="address" href="https://oaooa.com/" target="_blank">oaooa.com</a></span>\n \t\t\t</div>\n \t\t</div>',"",{customClass:"aboutPichome",showClose:!1,showConfirmButton:!1,dangerouslyUseHTMLString:!0,closeOnClickModal:!0});break;case"OutLogin":this.outLogin();break;case"system":window.open("admin.php?mod=system");break}return!1},outLogin:function(){var t=this;return Object(n["a"])(regeneratorRuntime.mark((function a(){var e;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,t.axios.post(t.AxiosApi+"user.php?mod=login&op=logging&action=logout&formhash="+t.GetFormHash+"&t="+(new Date).getTime());case 2:e=a.sent,e.data,window.location.reload();case 5:case"end":return a.stop()}}),a)})))()}}},d=c,l=(e("d2ba"),e("9c24"),e("2877")),p=Object(l["a"])(d,o,s,!1,null,"6f47bc15",null);a["default"]=p.exports},"864f":function(t,a,e){},"9c24":function(t,a,e){"use strict";var o=e("864f"),s=e.n(o);s.a},ae63:function(t,a,e){},d2ba:function(t,a,e){"use strict";var o=e("ae63"),s=e.n(o);s.a}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-77c8d08e"],{"1f5d":function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}]},[a("el-card",{staticClass:"box-card",staticStyle:{background:"rgb(240, 249, 235)","margin-bottom":"25px"},attrs:{shadow:"hover"}},[a("ul",{staticClass:"help-inline",domProps:{innerHTML:e._s(e.$t("founder_upgrade_store_directory",{msg:e.returnData.version}))}})]),e._l(e.files,(function(t){return a("div",{staticClass:"wait-files"},[a("i",{staticClass:"el-icon-document"}),e._v(" "+e._s(t)+" ")])})),a("el-button",{attrs:{type:"primary",size:"medium"},on:{click:e.handleupdate}},[e._v(e._s(e.$t("founder_upgrade_download")))])],2)},r=[],o=(a("96cf"),a("1da1")),i={props:["returnData"],data:function(){return{files:[],loading:!1}},created:function(){this.getData()},methods:{getData:function(){var e=this;return Object(o["a"])(regeneratorRuntime.mark((function t(){var a,n,r,o,i;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,a={version:e.returnData.version?e.returnData.version:"",locale:e.returnData.locale?e.returnData.locale:"",charset:e.returnData.charset?e.returnData.charset:""},t.next=4,e.axios.post("admin.php?mod=system&op=intsystemupgrade&operation=patch&step=1",a);case 4:return n=t.sent,r=n.data,r.upgradeNone?(o={upgradeNone:!0},e.$emit("handleStep",o)):r.upgradeError?(o={upgradeError:!0},e.$emit("handleStep",o)):r.bbclosed?(i={bbclosed:!0},e.$emit("handleStep",i)):(e.files=r.data,e.loading=!1),t.abrupt("return",!1);case 8:case"end":return t.stop()}}),t)})))()},handleupdate:function(){var e={template:2};this.$emit("handleStep",e)}},components:{},mounted:function(){}},s=i,u=(a("7949"),a("2877")),d=Object(u["a"])(s,n,r,!1,null,"00939ee2",null);t["default"]=d.exports},7949:function(e,t,a){"use strict";var n=a("93b8"),r=a.n(n);r.a},"93b8":function(e,t,a){}}]);

View File

@@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-7aef2525"],{"3e42":function(t,e,a){},6254:function(t,e,a){"use strict";a.r(e);var o=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticStyle:{"margin-left":"10px",display:"inherit"}},[a("el-dropdown",{staticStyle:{width:"35px",height:"35px"},attrs:{trigger:"click","hide-on-click":!1},on:{command:t.handleAvatar}},[t.GetUserData.icon?[a("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:t.GetUserData.username,placement:"left"}},[a("el-avatar",{attrs:{size:35,src:t.GetUserData.icon}})],1)]:[a("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:t.GetUserData.username,placement:"left"}},[a("el-avatar",{style:{background:t.GetUserData.headerColor},attrs:{size:35}},[t._v(t._s(t.GetUserData.firstword))])],1)],a("el-dropdown-menu",{staticClass:"avatar-dropdown",attrs:{slot:"dropdown"},slot:"dropdown"},[a("el-dropdown-item",{attrs:{command:"personal"}},[t._v("个人设置")]),a("el-dropdown-item",{attrs:{command:"help"}},[t._v("帮助文档")]),a("el-dropdown-item",{attrs:{command:"problem"}},[t._v("问题反馈")]),a("el-divider"),a("el-dropdown-item",{attrs:{command:"setting"}},[t._v("站点设置")]),a("el-dropdown-item",{attrs:{command:"library"}},[t._v("库设置")]),a("el-dropdown-item",{attrs:{command:"system"}},[a("span",{staticStyle:{position:"relative"}},[t._v(" 系统工具 "),t.GetUserData.upgrade?a("div",{staticClass:"tip",staticStyle:{width:"7px",height:"7px","border-radius":"50%",background:"red",position:"absolute",left:"-13px",top:"0",bottom:"0",margin:"auto"}}):t._e()])]),a("el-divider"),a("el-dropdown-item",{attrs:{command:"about"}},[t._v("关于PicHome")]),a("el-dropdown-item",{attrs:{command:"OutLogin"}},[t._v("退出站点")])],1)],2)],1)},s=[],n=(a("96cf"),a("1da1")),i=a("5530"),r=a("2f62"),c={data:function(){return{}},computed:Object(i["a"])({},Object(r["b"])(["GetUserData","GetFormHash","GetLanguage"])),methods:{handleAvatar:function(t){switch(t){case"collection":window.location.href="index.php?mod=collection";break;case"personal":window.location.href="index.php?mod=pichome&op=user&do=personal";break;case"help":window.open("https://www.yuque.com/pichome");break;case"problem":window.open("https://support.qq.com/products/340252");break;case"setting":window.location.href="index.php?mod=pichome&op=admin&do=authorize";break;case"library":window.location.href="index.php?mod=pichome&op=library";break;case"about":this.$alert('<div class="aboutlogo">\n \t\t\t<img src="dzz/pichome/image/phlogo.png" alt="">\n \t\t</div>\n \t\t<div class="aboutmessage">\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">软件名称:</span><span class="mes">欧奥PicHome</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">版本信息:</span><span class="mes">'+this.GetUserData.version+'</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">版权信息:</span><span class="mes">Powered By oaooa PicHome © 2020-2022 欧奥图文</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">网站地址:</span><span class="mes"><a class="address" href="https://oaooa.com/" target="_blank">oaooa.com</a></span>\n \t\t\t</div>\n \t\t</div>',"",{customClass:"aboutPichome",showClose:!1,showConfirmButton:!1,dangerouslyUseHTMLString:!0,closeOnClickModal:!0});break;case"OutLogin":this.outLogin();break;case"system":window.open("admin.php?mod=system");break;case"orguser":window.open("admin.php?mod=orguser");break}return!1},outLogin:function(){var t=this;return Object(n["a"])(regeneratorRuntime.mark((function e(){var a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,t.axios.post(t.AxiosApi+"user.php?mod=login&op=logging&action=logout&formhash="+t.GetFormHash+"&t="+(new Date).getTime());case 2:a=e.sent,a.data,window.location.reload();case 5:case"end":return e.stop()}}),e)})))()}}},d=c,l=(a("74bc"),a("9c24"),a("2877")),p=Object(l["a"])(d,o,s,!1,null,"1aac96c1",null);e["default"]=p.exports},"74bc":function(t,e,a){"use strict";var o=a("3e42"),s=a.n(o);s.a},"864f":function(t,e,a){},"9c24":function(t,e,a){"use strict";var o=a("864f"),s=a.n(o);s.a}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-801d4da6"],{"04d2":function(t,e,a){},6254:function(t,e,a){"use strict";a.r(e);var o=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticStyle:{"margin-left":"10px",display:"inherit"}},[a("el-dropdown",{staticStyle:{width:"35px",height:"35px"},attrs:{trigger:"click","hide-on-click":!1},on:{command:t.handleAvatar}},[t.GetUserData.icon?[a("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:t.GetUserData.username,placement:"left"}},[a("el-avatar",{attrs:{size:35,src:t.GetUserData.icon}})],1)]:[a("el-tooltip",{staticClass:"item",attrs:{effect:"dark",content:t.GetUserData.username,placement:"left"}},[a("el-avatar",{style:{background:t.GetUserData.headerColor},attrs:{size:35}},[t._v(t._s(t.GetUserData.firstword))])],1)],a("el-dropdown-menu",{staticClass:"avatar-dropdown",attrs:{slot:"dropdown"},slot:"dropdown"},[a("el-dropdown-item",{attrs:{command:"personal"}},[t._v("个人设置")]),a("el-dropdown-item",{attrs:{command:"help"}},[t._v("帮助文档")]),a("el-dropdown-item",{attrs:{command:"problem"}},[t._v("问题反馈")]),a("el-divider"),a("el-dropdown-item",{attrs:{command:"setting"}},[t._v("站点设置")]),a("el-dropdown-item",{attrs:{command:"library"}},[t._v("库设置")]),a("el-dropdown-item",{attrs:{command:"orguser"}},[t._v("用户管理")]),a("el-dropdown-item",{attrs:{command:"system"}},[a("span",{staticStyle:{position:"relative"}},[t._v(" 系统工具 "),t.GetUserData.upgrade?a("div",{staticClass:"tip",staticStyle:{width:"7px",height:"7px","border-radius":"50%",background:"red",position:"absolute",left:"-13px",top:"0",bottom:"0",margin:"auto"}}):t._e()])]),a("el-divider"),a("el-dropdown-item",{attrs:{command:"about"}},[t._v("关于PicHome")]),a("el-dropdown-item",{attrs:{command:"OutLogin"}},[t._v("退出站点")])],1)],2)],1)},s=[],n=(a("96cf"),a("1da1")),i=a("5530"),r=a("2f62"),c={data:function(){return{}},computed:Object(i["a"])({},Object(r["b"])(["GetUserData","GetFormHash","GetLanguage"])),methods:{handleAvatar:function(t){switch(t){case"collection":window.location.href="index.php?mod=collection";break;case"personal":window.location.href="index.php?mod=pichome&op=user&do=personal";break;case"help":window.open("https://www.yuque.com/pichome");break;case"problem":window.open("https://support.qq.com/products/340252");break;case"setting":window.location.href="index.php?mod=pichome&op=admin&do=basic";break;case"library":window.location.href="index.php?mod=pichome&op=library";break;case"about":this.$alert('<div class="aboutlogo">\n \t\t\t<img src="dzz/pichome/image/phlogo.png" alt="">\n \t\t</div>\n \t\t<div class="aboutmessage">\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">软件名称:</span><span class="mes">欧奥PicHome</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">版本信息:</span><span class="mes">'+this.GetUserData.version+'</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">版权信息:</span><span class="mes">Powered By oaooa PicHome © 2020-2022 欧奥图文</span>\n \t\t\t</div>\n \t\t\t<div class="aboutlist">\n \t\t\t\t<span class="title">网站地址:</span><span class="mes"><a class="address" href="https://oaooa.com/" target="_blank">oaooa.com</a></span>\n \t\t\t</div>\n \t\t</div>',"",{customClass:"aboutPichome",showClose:!1,showConfirmButton:!1,dangerouslyUseHTMLString:!0,closeOnClickModal:!0});break;case"OutLogin":this.outLogin();break;case"system":window.open("admin.php?mod=system");break;case"orguser":window.open("admin.php?mod=orguser");break}return!1},outLogin:function(){var t=this;return Object(n["a"])(regeneratorRuntime.mark((function e(){var a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,t.axios.post(t.AxiosApi+"user.php?mod=login&op=logging&action=logout&formhash="+t.GetFormHash+"&t="+(new Date).getTime());case 2:a=e.sent,a.data,window.location.reload();case 5:case"end":return e.stop()}}),e)})))()}}},d=c,l=(a("a16b"),a("9c24"),a("2877")),p=Object(l["a"])(d,o,s,!1,null,"663b95fa",null);e["default"]=p.exports},"864f":function(t,e,a){},"9c24":function(t,e,a){"use strict";var o=a("864f"),s=a.n(o);s.a},a16b:function(t,e,a){"use strict";var o=a("04d2"),s=a.n(o);s.a}}]);

View File

@@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-9f9c2568"],{"01e3":function(e,t,n){"use strict";n.r(t);var s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"page-content"},[n("div",{staticClass:"top-title color-border",staticStyle:{display:"flex"}},[n("span",[e._v(e._s(e.$t("upgrade"))),e.elstep>0?n("span",{staticClass:"line"}):e._e()]),e.elstep>0?n("el-steps",{staticStyle:{flex:"1"},attrs:{active:e.elstep,"finish-status":"success",simple:""}},[n("el-step",{attrs:{title:e.$t("founder_upgrade_updatelist")}}),n("el-step",{attrs:{title:e.$t("founder_upgrade_download")}}),n("el-step",{attrs:{title:e.$t("founder_upgrade_compare")}}),n("el-step",{attrs:{title:e.$t("founder_upgrade_upgrading")}}),n("el-step",{attrs:{title:e.$t("founder_upgrade_complete")}})],1):e._e()],1),n("el-scrollbar",{staticClass:"page-component__scroll"},[n("div",{staticClass:"content",staticStyle:{padding:"25px"}},[n(e.template,{tag:"component",attrs:{returnData:e.returnData},on:{handleStep:e.handleStep}})],1)])],1)},a=[],r=(n("d3b7"),{props:["returnData"],data:function(){return{elstep:"",template:""}},watch:{elstep:{handler:function(e){this.handleTemplate()}},$route:{handler:function(e){e.params&&e.params.version&&(this.elstep=5)},deep:!0}},created:function(){this.returnData.iframes?this.elstep=4:(this.elstep=this.returnData.step?this.returnData.step:1,this.handleTemplate())},methods:{handleStep:function(e){e.upgradeNone?(this.template="upgradeNone",this.elstep=0):e.upgradeError?(this.template="upgradeError",this.elstep=0):e.bbclosed?(this.template="bbclosed",this.elstep=0):this.elstep=e.template},handleTemplate:function(){switch(this.elstep){case 1:this.template="step1";break;case 2:this.template="step2";break;case 3:this.template="step3";break;case 4:this.template="step4";break;case 5:this.template="step5";break}}},components:{upgradeError:function(){return n.e("chunk-2d20fcd9").then(n.bind(null,"b4d5"))},upgradeNone:function(){return n.e("chunk-2d0bdbc6").then(n.bind(null,"2ced"))},bbclosed:function(){return n.e("chunk-2d0a3327").then(n.bind(null,"00c4"))},step1:function(){return n.e("chunk-77c8d08e").then(n.bind(null,"1f5d"))},step2:function(){return n.e("chunk-2d21ddf7").then(n.bind(null,"d2c6"))},step3:function(){return n.e("chunk-2d0efd3c").then(n.bind(null,"9a86"))},step4:function(){return n.e("chunk-36bedb7f").then(n.bind(null,"4e68"))},step5:function(){return n.e("chunk-2d0dd46d").then(n.bind(null,"8164"))}},destroyed:function(){}}),l=r,p=(n("8dc4"),n("2877")),i=Object(p["a"])(l,s,a,!1,null,"0dbad62e",null);t["default"]=i.exports},"1a21":function(e,t,n){},"8dc4":function(e,t,n){"use strict";var s=n("1a21"),a=n.n(s);a.a}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,8 @@ $steplang = array('', lang('founder_upgrade_updatelist'), lang('founder_upgrade_
if ($operation == 'patch' || $operation == 'cross') {
if (!$_G['setting']['bbclosed']) {
exit(json_encode(array('bbclosed'=>true)));
C::t('setting')->update('bbclosed', 1);
updatecache('setting');
}
$msg = '';

View File

@@ -1,51 +1,51 @@
<?php
//error_reporting(E_ALL);
if(!defined('IN_OAOOA')) {
exit('Access Denied');
}
define('NOROBOT', TRUE);
$returntype = isset($_GET['returnType']) ? $_GET['returnType']: 'json';//返回值方式
$checkLanguage = $_G['language'];
if(file_exists (DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php')){
include DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php';
$_G['lang']['template']=array_merge($_G['lang']['template'],$lang);
}
//判断管理员登录
//Hook::listen('adminlogin');
//后台管理页面
if(submitcheck('settingsubmit')){
if ($_G['adminid'] != 1){
showmessage( lang('no_privilege') ,$returntype);
}
$settingnew=$_GET["settingnew"];
$data=array();
foreach($settingnew["mark"] as $k=>$v){
if( isset($data[$v]) ){
showmessage( lang('Logtag').$v.lang('repeat') ,$returntype);
}
$data[$v]=array(
"title" => $settingnew["title"][$k],
"is_open" => intval($settingnew["is_open"][$k]),
"issystem" => $settingnew["issystem"][$k]
);
}
$settingnew = serialize($data);
$update=array(
"systemlog_open" =>$_GET["systemlog_open"],
"systemlog_setting" =>$settingnew,
);
$result = C::t('setting') ->update_batch($update);
if( $result ){
include_once libfile('function/cache');
updatecache('setting');
}
writelog('otherlog', lang('Update_setting'));
showmessage('do_success', dreferer());
}
else{
$systemlog_setting = ($_G["setting"]["systemlog_setting"]);
$navtitle=lang('systemlog_setting').' - '.lang('appname');
include template("admin");
<?php
//error_reporting(E_ALL);
if(!defined('IN_OAOOA')) {
exit('Access Denied');
}
define('NOROBOT', TRUE);
$returntype = isset($_GET['returnType']) ? $_GET['returnType']: 'json';//返回值方式
$checkLanguage = $_G['language'];
if(file_exists (DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php')){
include DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php';
$_G['lang']['template']=array_merge($_G['lang']['template'],$lang);
}
//判断管理员登录
//Hook::listen('adminlogin');
//后台管理页面
if(submitcheck('settingsubmit')){
if ($_G['adminid'] != 1){
showmessage( lang('no_privilege') ,$returntype);
}
$settingnew=$_GET["settingnew"];
$data=array();
foreach($settingnew["mark"] as $k=>$v){
if( isset($data[$v]) ){
showmessage( lang('Logtag').$v.lang('repeat') ,$returntype);
}
$data[$v]=array(
"title" => $settingnew["title"][$k],
"is_open" => intval($settingnew["is_open"][$k]),
"issystem" => $settingnew["issystem"][$k]
);
}
$settingnew = serialize($data);
$update=array(
"systemlog_open" =>$_GET["systemlog_open"],
"systemlog_setting" =>$settingnew,
);
$result = C::t('setting') ->update_batch($update);
if( $result ){
include_once libfile('function/cache');
updatecache('setting');
}
writelog('otherlog', lang('Update_setting'));
showmessage('do_success', dreferer());
}
else{
$systemlog_setting = ($_G["setting"]["systemlog_setting"]);
$navtitle=lang('systemlog_setting').' - '.lang('appname');
include template("admin");
}

View File

@@ -1,63 +1,63 @@
<?php
namespace admin\systemlog\classes;
class Systemlog{
//$arr 必须传入 level,content
public function run( $arr=array() ){
global $_G;
if( $_G['setting']['systemlog_open'] > 0 ){
$systemlog_setting = ($_G['setting']['systemlog_setting']);
//判断是否开启该类型日志
if(!isset($arr["mark"]) || (isset($systemlog_setting[$arr["mark"]]) && $systemlog_setting[$arr["mark"]]["is_open"]!=1) ){
return;
}
$file=$arr["mark"];//$arr["level"];//级别
$log=$arr["content"];
$yearmonth = "dzz";//dgmdate(TIMESTAMP, 'Ym', $_G['setting']['timeoffset']);
$logdir = DZZ_ROOT.'./data/log/';
$logfile = $logdir.$yearmonth.'_'.$file.'.php';
//检查并返回当前log文件行数
$i=0;
if( file_exists($logfile)){
$fp=fopen($logfile, "r");
while(!feof($fp)) {
//每次最多读取1M
if($data=fread($fp,1024*1024*1)){
//计算读取到的行数
$num=substr_count($data,"\n");
$i+=$num;
}
}
fclose($fp);
}
//每4000行重新生成日志文件
if($i>=4000) {
$dir = opendir($logdir);
$length = strlen($file);
$maxid = $id = 0;
while($entry = readdir($dir)) {
if(strpos($entry, $yearmonth.'_'.$file) !== false) {
$id = intval(substr($entry, $length + 8, -4));
$id > $maxid && $maxid = $id;
}
}
closedir($dir);
$logfilebak = $logdir.$yearmonth.'_'.$file.'_'.($maxid + 1).'.php';
@rename($logfile, $logfilebak);
}
if($fp = @fopen($logfile, 'a')) {
@flock($fp, 2);
if(!is_array($log)) {
$log = array($log);
}
$cur_url = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$from_url = $_SERVER['HTTP_REFERER'];
foreach($log as $tmp) {
$tmp=implode("\t", clearlogstring(array($_G['timestamp'], $_G['username'], $_G['groupid'], $_G['clientip'],$tmp,$cur_url,$from_url))) ;
fwrite($fp, "<?PHP exit;?>\t".str_replace(array('<?', '?>'), '', $tmp)."\n");
}
fclose($fp);
}
}
}
<?php
namespace admin\systemlog\classes;
class Systemlog{
//$arr 必须传入 level,content
public function run( $arr=array() ){
global $_G;
if( $_G['setting']['systemlog_open'] > 0 ){
$systemlog_setting = ($_G['setting']['systemlog_setting']);
//判断是否开启该类型日志
if(!isset($arr["mark"]) || (isset($systemlog_setting[$arr["mark"]]) && $systemlog_setting[$arr["mark"]]["is_open"]!=1) ){
return;
}
$file=$arr["mark"];//$arr["level"];//级别
$log=$arr["content"];
$yearmonth = "dzz";//dgmdate(TIMESTAMP, 'Ym', $_G['setting']['timeoffset']);
$logdir = DZZ_ROOT.'./data/log/';
$logfile = $logdir.$yearmonth.'_'.$file.'.php';
//检查并返回当前log文件行数
$i=0;
if( file_exists($logfile)){
$fp=fopen($logfile, "r");
while(!feof($fp)) {
//每次最多读取1M
if($data=fread($fp,1024*1024*1)){
//计算读取到的行数
$num=substr_count($data,"\n");
$i+=$num;
}
}
fclose($fp);
}
//每4000行重新生成日志文件
if($i>=4000) {
$dir = opendir($logdir);
$length = strlen($file);
$maxid = $id = 0;
while($entry = readdir($dir)) {
if(strpos($entry, $yearmonth.'_'.$file) !== false) {
$id = intval(substr($entry, $length + 8, -4));
$id > $maxid && $maxid = $id;
}
}
closedir($dir);
$logfilebak = $logdir.$yearmonth.'_'.$file.'_'.($maxid + 1).'.php';
@rename($logfile, $logfilebak);
}
if($fp = @fopen($logfile, 'a')) {
@flock($fp, 2);
if(!is_array($log)) {
$log = array($log);
}
$cur_url = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$from_url = $_SERVER['HTTP_REFERER'];
foreach($log as $tmp) {
$tmp=implode("\t", clearlogstring(array($_G['timestamp'], $_G['username'], $_G['groupid'], $_G['clientip'],$tmp,$cur_url,$from_url))) ;
fwrite($fp, "<?PHP exit;?>\t".str_replace(array('<?', '?>'), '', $tmp)."\n");
}
fclose($fp);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,177 +1,177 @@
<?php
//error_reporting(E_ALL);
if(!defined('IN_OAOOA')) {
exit('Access Denied');
}
define('NOROBOT', TRUE);
$returntype = isset($_GET['returnType']) ? $_GET['returnType']: 'json';//返回值方式
$type=$_GET['type'];
if(!in_array($type, array('list'))) {
$type='list';
}
$checkLanguage = $_G['language'];
if(file_exists (DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php')){
include DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php';
$_G['lang']['template']=array_merge($_G['lang']['template'],$lang);
}
if($type=="list"){
//Hook::listen('adminlogin');
!isset($_GET['page']) && $_GET['page']=1;
$page=max(1,intval($_GET['page']));
$lpp = empty($_GET['lpp']) ? 15 : $_GET['lpp'];
$checklpp = array();
$checklpp[$lpp] = 'selected="selected"';
$extrainput = '';
$systemlog_setting = is_serialized($_G["setting"]["systemlog_setting"])?unserialize($_G["setting"]["systemlog_setting"]):$_G["setting"]["systemlog_setting"];
$operationarr = array_keys($systemlog_setting);
$operation = in_array($_GET['operation'], $operationarr) ? $_GET['operation'] : "cplog";
$navtitle=$systemlog_setting[$operation]["title"].' - '.lang('appname');//lang('nav_logs_'.$operation).' - '.lang('admin_navtitle');
$logdir = DZZ_ROOT.'./data/log/';
$logfiles = get_log_files($logdir, $operation);
if($logfiles) $logfiles=array_reverse($logfiles);
//error_reporting(E_ALL);
$firstlogs = file( $logdir.$logfiles[0] ) ;
$firstlogsnum = count($firstlogs);
$countlogfile=count($logfiles);
$count = ($countlogfile-1)*4000+$firstlogsnum;
$multipage = multi($count, $lpp, $page, MOD_URL."&type=list&operation=$operation&lpp=$lpp",'pull-right' );
$logs = array();
$jishu=4000;//每个日志文件最多行数
$start = ($page - 1) * $lpp;
$lastlog=$last_secondlog="";
$newdata=array();
foreach($logfiles as $k=>$v){
$nowfilemaxnum=($jishu*($k+1))-($jishu-$firstlogsnum);
$startnum=($nowfilemaxnum-$jishu)<=0?0:($nowfilemaxnum-$jishu+1);
$newdata[]=array("file"=>$v,"start"=>$startnum,"end"=>$nowfilemaxnum);
}
//print_R($newdata);
//查询当前分页数据位于哪个日志文件
$lastlog=$last_secondlog="";
foreach($newdata as $k=>$v){
if( $start<=$v["end"]){
$lastlog=$v;
if( ($start+$lpp)<$v["end"]){
}else{
if( isset($newdata[$k+1])){
$last_secondlog=$newdata[$k+1];
}
}
break;
}
}
$j=0;
for($i=$lastlog["start"];$i<$lastlog["end"];$i++){
if( $start<=($lastlog["start"]+$j) ){
break;
}
$j++;
}
//获取数据开始
$logs = file( $logdir.$lastlog["file"] );
$logs = array_reverse($logs);
if( $lastlog["file"]!=$logfiles[0] ){
$j++;
}
$logs = array_slice($logs, $j, $lpp);
$onecountget = count($logs);
$jj=0;
if( $last_secondlog ){
for($i=$last_secondlog["start"];$i<$last_secondlog["end"];$i++){
if( ($jj)>= ($lpp-$onecountget) ){//$last_secondlog["start"] ){
break;
}
$jj++;
}
}
if($last_secondlog){
$logs2 = file( $logdir.$last_secondlog["file"] );
$logs2 = array_reverse($logs2);
$end=$lpp-count($logs);
$logs2 = array_slice( $logs2, 0, $jj);
$logs=array_merge($logs,$logs2);
}
//获取数据结束
$usergroup = array();
foreach(C::t('usergroup')->range() as $group) {
$usergroup[$group['groupid']] = $group['grouptitle'];
}
$list=array();
foreach($logs as $k => $logrow) {
$log = explode("\t", $logrow);
if(empty($log[1])) {
continue;
}
$log[1] = dgmdate($log[1], 'y-n-j H:i');
$log[2] = $log[2];
$log[2] = ($log[2] != $_G['member']['username'] ? "<b>$log[2]</b>" : $log[2]);
$log[3] = $usergroup[$log[3]];
$list[$k]=$log;
}
include template('list');
}
function getactionarray() {
$isfounder = true;
unset($topmenu['index'], $menu['index']);
$actioncat = $actionarray = array();
$actioncat[] = 'setting';
$actioncat = array_merge($actioncat, array_keys($topmenu));
foreach($menu as $tkey => $items) {
foreach($items as $item) {
$actionarray[$tkey][] = $item;
}
}
return array('actions' => $actionarray, 'cats' => $actioncat);
}
function get_log_files($logdir = '', $action = 'action') {
$dir = opendir($logdir);
$files = array();
while($entry = readdir($dir)) {
$files[] = $entry;
}
closedir($dir);
if($files) {
sort($files);
$logfile = $action;
$logfiles = array();
$ym = '';
foreach($files as $file) {
if(strpos($file, $logfile) !== FALSE) {
if(substr($file, 0, 6) != $ym) {
$ym = substr($file, 0, 6);
}
$logfiles[$ym][] = $file;
}
}
if($logfiles) {
$lfs = array();
foreach($logfiles as $ym => $lf) {
$lastlogfile = $lf[0];
unset($lf[0]);
$lf[] = $lastlogfile;
$lfs = array_merge($lfs, $lf);
}
return $lfs;
}
return array();
}
return array();
<?php
//error_reporting(E_ALL);
if(!defined('IN_OAOOA')) {
exit('Access Denied');
}
define('NOROBOT', TRUE);
$returntype = isset($_GET['returnType']) ? $_GET['returnType']: 'json';//返回值方式
$type=$_GET['type'];
if(!in_array($type, array('list'))) {
$type='list';
}
$checkLanguage = $_G['language'];
if(file_exists (DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php')){
include DZZ_ROOT.'./admin/language/'.$checkLanguage.'/'.'lang.php';
$_G['lang']['template']=array_merge($_G['lang']['template'],$lang);
}
if($type=="list"){
//Hook::listen('adminlogin');
!isset($_GET['page']) && $_GET['page']=1;
$page=max(1,intval($_GET['page']));
$lpp = empty($_GET['lpp']) ? 15 : $_GET['lpp'];
$checklpp = array();
$checklpp[$lpp] = 'selected="selected"';
$extrainput = '';
$systemlog_setting = is_serialized($_G["setting"]["systemlog_setting"])?unserialize($_G["setting"]["systemlog_setting"]):$_G["setting"]["systemlog_setting"];
$operationarr = array_keys($systemlog_setting);
$operation = in_array($_GET['operation'], $operationarr) ? $_GET['operation'] : "cplog";
$navtitle=$systemlog_setting[$operation]["title"].' - '.lang('appname');//lang('nav_logs_'.$operation).' - '.lang('admin_navtitle');
$logdir = DZZ_ROOT.'./data/log/';
$logfiles = get_log_files($logdir, $operation);
if($logfiles) $logfiles=array_reverse($logfiles);
//error_reporting(E_ALL);
$firstlogs = file( $logdir.$logfiles[0] ) ;
$firstlogsnum = count($firstlogs);
$countlogfile=count($logfiles);
$count = ($countlogfile-1)*4000+$firstlogsnum;
$multipage = multi($count, $lpp, $page, MOD_URL."&type=list&operation=$operation&lpp=$lpp",'pull-right' );
$logs = array();
$jishu=4000;//每个日志文件最多行数
$start = ($page - 1) * $lpp;
$lastlog=$last_secondlog="";
$newdata=array();
foreach($logfiles as $k=>$v){
$nowfilemaxnum=($jishu*($k+1))-($jishu-$firstlogsnum);
$startnum=($nowfilemaxnum-$jishu)<=0?0:($nowfilemaxnum-$jishu+1);
$newdata[]=array("file"=>$v,"start"=>$startnum,"end"=>$nowfilemaxnum);
}
//print_R($newdata);
//查询当前分页数据位于哪个日志文件
$lastlog=$last_secondlog="";
foreach($newdata as $k=>$v){
if( $start<=$v["end"]){
$lastlog=$v;
if( ($start+$lpp)<$v["end"]){
}else{
if( isset($newdata[$k+1])){
$last_secondlog=$newdata[$k+1];
}
}
break;
}
}
$j=0;
for($i=$lastlog["start"];$i<$lastlog["end"];$i++){
if( $start<=($lastlog["start"]+$j) ){
break;
}
$j++;
}
//获取数据开始
$logs = file( $logdir.$lastlog["file"] );
$logs = array_reverse($logs);
if( $lastlog["file"]!=$logfiles[0] ){
$j++;
}
$logs = array_slice($logs, $j, $lpp);
$onecountget = count($logs);
$jj=0;
if( $last_secondlog ){
for($i=$last_secondlog["start"];$i<$last_secondlog["end"];$i++){
if( ($jj)>= ($lpp-$onecountget) ){//$last_secondlog["start"] ){
break;
}
$jj++;
}
}
if($last_secondlog){
$logs2 = file( $logdir.$last_secondlog["file"] );
$logs2 = array_reverse($logs2);
$end=$lpp-count($logs);
$logs2 = array_slice( $logs2, 0, $jj);
$logs=array_merge($logs,$logs2);
}
//获取数据结束
$usergroup = array();
foreach(C::t('usergroup')->range() as $group) {
$usergroup[$group['groupid']] = $group['grouptitle'];
}
$list=array();
foreach($logs as $k => $logrow) {
$log = explode("\t", $logrow);
if(empty($log[1])) {
continue;
}
$log[1] = dgmdate($log[1], 'y-n-j H:i');
$log[2] = $log[2];
$log[2] = ($log[2] != $_G['member']['username'] ? "<b>$log[2]</b>" : $log[2]);
$log[3] = $usergroup[$log[3]];
$list[$k]=$log;
}
include template('list');
}
function getactionarray() {
$isfounder = true;
unset($topmenu['index'], $menu['index']);
$actioncat = $actionarray = array();
$actioncat[] = 'setting';
$actioncat = array_merge($actioncat, array_keys($topmenu));
foreach($menu as $tkey => $items) {
foreach($items as $item) {
$actionarray[$tkey][] = $item;
}
}
return array('actions' => $actionarray, 'cats' => $actioncat);
}
function get_log_files($logdir = '', $action = 'action') {
$dir = opendir($logdir);
$files = array();
while($entry = readdir($dir)) {
$files[] = $entry;
}
closedir($dir);
if($files) {
sort($files);
$logfile = $action;
$logfiles = array();
$ym = '';
foreach($files as $file) {
if(strpos($file, $logfile) !== FALSE) {
if(substr($file, 0, 6) != $ym) {
$ym = substr($file, 0, 6);
}
$logfiles[$ym][] = $file;
}
}
if($logfiles) {
$lfs = array();
foreach($logfiles as $ym => $lf) {
$lastlogfile = $lf[0];
unset($lf[0]);
$lf[] = $lastlogfile;
$lfs = array_merge($lfs, $lf);
}
return $lfs;
}
return array();
}
return array();
}

View File

@@ -1,33 +1,33 @@
<?php
/*
* 应用安装文件;
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author qchlian
*/
if(!defined('IN_OAOOA') || !defined('IN_ADMIN')) {
exit('Access Denied');
}
/*以下配置初始化时已存入数据库配置表
*$systemlog_setting = array(
* 级别 名称 标记 是否开启
"errorlog"=>array("title"=>"系统错误","is_open"=>1,"issystem"=>1),
"cplog"=>array("title"=>"后台访问","is_open"=>1,"issystem"=>1),
"deletelog"=>array("title"=>"数据删除","is_open"=>1,"issystem"=>1),
"updatelog"=>array("title"=>"数据更新","is_open"=>1,"issystem"=>1),
"loginlog"=>array("title"=>"用户登录","is_open"=>1,"issystem"=>1),
"sendmail"=>array("title"=>"邮件发送","is_open"=>1,"issystem"=>1),
"otherlog"=>array("title"=>"其他信息","is_open"=>1,"issystem"=>1),
);
*/
$sql = <<<EOF
DELETE FROM `dzz_setting` WHERE `skey` = 'systemlog_open';
INSERT INTO `dzz_setting` (`skey`,`svalue`) VALUES ('systemlog_open', '1');
DELETE FROM `dzz_setting` WHERE `skey` = 'systemlog_setting';
INSERT INTO `dzz_setting` (`skey`,`svalue`) VALUES ('systemlog_setting','a:7:{s:8:"errorlog";a:3:{s:5:"title";s:12:"系统错误";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:5:"cplog";a:3:{s:5:"title";s:12:"后台访问";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:9:"deletelog";a:3:{s:5:"title";s:12:"数据删除";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:9:"updatelog";a:3:{s:5:"title";s:12:"数据更新";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:8:"loginlog";a:3:{s:5:"title";s:12:"用户登录";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:8:"sendmail";a:3:{s:5:"title";s:12:"邮件发送";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:8:"otherlog";a:3:{s:5:"title";s:12:"其他信息";s:7:"is_open";i:1;s:8:"issystem";i:1;}}');
EOF;
runquery($sql);
<?php
/*
* 应用安装文件;
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author qchlian
*/
if(!defined('IN_OAOOA') || !defined('IN_ADMIN')) {
exit('Access Denied');
}
/*以下配置初始化时已存入数据库配置表
*$systemlog_setting = array(
* 级别 名称 标记 是否开启
"errorlog"=>array("title"=>"系统错误","is_open"=>1,"issystem"=>1),
"cplog"=>array("title"=>"后台访问","is_open"=>1,"issystem"=>1),
"deletelog"=>array("title"=>"数据删除","is_open"=>1,"issystem"=>1),
"updatelog"=>array("title"=>"数据更新","is_open"=>1,"issystem"=>1),
"loginlog"=>array("title"=>"用户登录","is_open"=>1,"issystem"=>1),
"sendmail"=>array("title"=>"邮件发送","is_open"=>1,"issystem"=>1),
"otherlog"=>array("title"=>"其他信息","is_open"=>1,"issystem"=>1),
);
*/
$sql = <<<EOF
DELETE FROM `dzz_setting` WHERE `skey` = 'systemlog_open';
INSERT INTO `dzz_setting` (`skey`,`svalue`) VALUES ('systemlog_open', '1');
DELETE FROM `dzz_setting` WHERE `skey` = 'systemlog_setting';
INSERT INTO `dzz_setting` (`skey`,`svalue`) VALUES ('systemlog_setting','a:7:{s:8:"errorlog";a:3:{s:5:"title";s:12:"系统错误";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:5:"cplog";a:3:{s:5:"title";s:12:"后台访问";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:9:"deletelog";a:3:{s:5:"title";s:12:"数据删除";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:9:"updatelog";a:3:{s:5:"title";s:12:"数据更新";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:8:"loginlog";a:3:{s:5:"title";s:12:"用户登录";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:8:"sendmail";a:3:{s:5:"title";s:12:"邮件发送";s:7:"is_open";i:1;s:8:"issystem";i:1;}s:8:"otherlog";a:3:{s:5:"title";s:12:"其他信息";s:7:"is_open";i:1;s:8:"issystem";i:1;}}');
EOF;
runquery($sql);
$finish = true; //结束时必须加入此句,告诉应用安装程序已经完成自定义的安装流程

View File

@@ -1,21 +1,21 @@
<?php
$lang = array (
'appname'=>'系统日志',
'logs' => '运行记录',
'systemlog_setting'=>'设置',
'systemlog_list'=>'日志列表',
'info'=>'信息',
'loginfo'=>'日志信息',
'visit'=>'访问页面',
'from'=>'来源页面',
'logswitch'=>'日志开关',
'logtype'=>'日志类型',
'logtypename'=>'日志类型名称',
'logtype'=>'日志类型',
'logflag'=>'日志标识',
'Logtag'=>'日志标记',
'repeat'=>'重复',
'Update_setting'=>'更新日志设置'
);
<?php
$lang = array (
'appname'=>'系统日志',
'logs' => '运行记录',
'systemlog_setting'=>'设置',
'systemlog_list'=>'日志列表',
'info'=>'信息',
'loginfo'=>'日志信息',
'visit'=>'访问页面',
'from'=>'来源页面',
'logswitch'=>'日志开关',
'logtype'=>'日志类型',
'logtypename'=>'日志类型名称',
'logtype'=>'日志类型',
'logflag'=>'日志标识',
'Logtag'=>'日志标记',
'repeat'=>'重复',
'Update_setting'=>'更新日志设置'
);
?>

View File

@@ -1,160 +1,160 @@
<!--{template common/header_simple_start}-->
<link href="static/css/common.css?{VERHASH}" rel="stylesheet" media="all">
<link href="static/icheck/skins/minimal/blue.css?{VERHASH}" rel="stylesheet" media="all">
<link rel="stylesheet" href="static/css/checkbox.css">
<script type="text/javascript" src="static/js/jquery.leftDrager.js?{VERHASH}"></script>
<style>
html, body {
overflow: hidden;
background: #FFF;
color: #4B4B4B;
}
.form-horizontal-left .radio-inline {
padding: 5px 20px;
margin: 0;
}
.loginset-template{
width: 100px;
height: 100px;
overflow: hidden;
float: left;
margin-right: 10px;
display: block;
position: relative;
}
.loginset-template .loginset-template-icon{
width: 20px;
height: 20px;
border: 1px solid #AAB479;
position: absolute;
right: 1px;
top: 1px;
color: #DD4B39;
font-size: 15px;
display: none;
}
.loginset-template:hover .loginset-template-icon{
display: block;
}
.loginset-template:hover .loginset-template-icon>span{
display: none;
}
.loginset-template .loginset-template-icon1{
display: block!important;
}
.loginset-template .loginset-template-icon1>span{
display: block!important;
}
#cpform{
margin-top: 15px;
}
</style>
<!--{template common/header_simple_end}-->
<!--{template common/commer_header}-->
<div class="bs-container clearfix">
<div class="bs-left-container clearfix">
<!--{template left}-->
</div>
<div class="left-drager">
<div class="left-drager-op">
<div class="left-drager-sub"></div>
</div>
</div>
<div class="bs-main-container clearfix">
<div class="main-title clearfix">
</div>
<div class="main-content">
<form id="cpform" action="{MOD_URL}&op=admin" class="form-horizontal-left" method="post" name="cpform">
<input type="hidden" value="{FORMHASH}" name="formhash">
<input type="hidden" value="basic" name="operation">
<dl>
<dt>{lang logswitch}:</dt>
<dd class="clearfix">
<label class="radio-inline "><input type="radio" name="systemlog_open" value="1"<!--{if $_G[setting][systemlog_open]==1}-->checked<!--{/if}--> onclick="document.getElementById('hidden1').style.display='block';">{lang enable}</label>
<label class="radio radio-inline"><input type="radio" name="systemlog_open" value="0"<!--{if $_G[setting][systemlog_open]==0}-->checked<!--{/if}--> onclick="document.getElementById('hidden1').style.display='none';">{lang forbidden}</label>
</dd>
</dl>
<dl id="hidden1">
<dt>{lang logtype}:</dt>
<dd class="clearfix">
<table id="systemlogtable" class="table text-center" style="width: auto;margin-bottom:0; <!--{if $_G[setting][systemlog_open]==0}-->display:none<!--{/if}-->">
<thead>
<tr>
<th>{lang logtypename}</th>
<th>{lang logflag}</th>
<th>{lang logswitch}</th>
<th>&nbsp;</th>
</tr>
</thead>
{eval $i=0;}
<!--{loop $systemlog_setting $mark $info}-->
<tr>
<td>
<input type="hidden" name="settingnew[issystem][$i]" value="$info[issystem]" />
<input class="form-control" style="width:120px;" <!--{if $info[issystem]==1}-->readonly="readonly"<!--{/if}--> type="text" name="settingnew[title][$i]" value="$info[title]" />
</td>
<td><input class="form-control" style="width:100px;" <!--{if $info[issystem]==1}-->readonly="readonly"<!--{/if}--> type="text" name="settingnew[mark][$i]" value="$mark" /></td>
<td><input type="checkbox" name="settingnew[is_open][$i]" value="1" <!--{if $info[is_open]==1}-->checked<!--{/if}--> /></td>
<td>
<!--{if $info[issystem]!=1}-->
<a href="javascript:;" class="col-xs-2 img_delete" onclick="deletesystem(this);"><span class="dzz dzz-delete" style="font-size:22px;"></span></a>
<!--{/if}-->
</td>
</tr>
{eval $i++;}
<!--{/loop}-->
<tr>
<td colspan="4" align="left"><a href="javascript:;" onclick="addsystemtype(this);"><i class="glyphicon glyphicon-plus"></i>{lang add}</a></td>
</tr>
</table>
</dd>
</dl>
<dl>
<dd>
<input class="btn btn-primary" id="submit_editsubmit" name="settingsubmit" value="{lang save_changes}" type="submit">
</dd>
</dl>
</form>
</div>
</div>
</div>
<script type="text/javascript">
jQuery('.left-drager').leftDrager_layout();
jQuery(document).ready(function(e) {
jQuery('input').iCheck({
checkboxClass: 'icheckbox_minimal-blue',
radioClass: 'iradio_minimal-blue',
});
jQuery('input').on('ifChecked', function(e) {
jQuery(this).trigger('click');
});
jQuery('input[required]').on('blur', function() {
if(this.value == '') { jQuery(this).addClass('input-error') } else { jQuery(this).removeClass('input-error'); }
});
});
function addsystemtype( obj ){
var num=jQuery("#systemlogtable").find("tr").length-1;
var html='<tr><td><input type="hidden" name="settingnew[issystem]['+num+']" value="0" /><input class="form-control" style="width:120px;" type="text" name="settingnew[title]['+num+']" value="" /></td><td><input class="form-control" style="width:100px;" type="text" name="settingnew[mark]['+num+']" value="" /></td><td><input type="checkbox" name="settingnew[is_open]['+num+']" value="1" checked /></td><td><a class="col-xs-2 img_delete" onclick="deletesystem(this);" href="javascript:;"><span class="dzz dzz-delete" style="font-size:22px;"></span></a></td></tr>';
jQuery(obj).parents("tr").before(html);
jQuery("#systemlogtable").iCheck({
checkboxClass: 'icheckbox_minimal-blue',
radioClass: 'iradio_minimal-blue',
});
return false;
}
function deletesystem( obj ){
jQuery(obj).parents("tr").remove();
return false;
}
</script>
<script src="static/bootstrap/js/bootstrap.min.js?{VERHASH}"></script>
<script type="text/javascript" src="static/icheck/icheck.min.js?{VERHASH}"></script>
<!--{template common/header_simple_start}-->
<link href="static/css/common.css?{VERHASH}" rel="stylesheet" media="all">
<link href="static/icheck/skins/minimal/blue.css?{VERHASH}" rel="stylesheet" media="all">
<link rel="stylesheet" href="static/css/checkbox.css">
<script type="text/javascript" src="static/js/jquery.leftDrager.js?{VERHASH}"></script>
<style>
html, body {
overflow: hidden;
background: #FFF;
color: #4B4B4B;
}
.form-horizontal-left .radio-inline {
padding: 5px 20px;
margin: 0;
}
.loginset-template{
width: 100px;
height: 100px;
overflow: hidden;
float: left;
margin-right: 10px;
display: block;
position: relative;
}
.loginset-template .loginset-template-icon{
width: 20px;
height: 20px;
border: 1px solid #AAB479;
position: absolute;
right: 1px;
top: 1px;
color: #DD4B39;
font-size: 15px;
display: none;
}
.loginset-template:hover .loginset-template-icon{
display: block;
}
.loginset-template:hover .loginset-template-icon>span{
display: none;
}
.loginset-template .loginset-template-icon1{
display: block!important;
}
.loginset-template .loginset-template-icon1>span{
display: block!important;
}
#cpform{
margin-top: 15px;
}
</style>
<!--{template common/header_simple_end}-->
<!--{template common/commer_header}-->
<div class="bs-container clearfix">
<div class="bs-left-container clearfix">
<!--{template left}-->
</div>
<div class="left-drager">
<div class="left-drager-op">
<div class="left-drager-sub"></div>
</div>
</div>
<div class="bs-main-container clearfix">
<div class="main-title clearfix">
</div>
<div class="main-content">
<form id="cpform" action="{MOD_URL}&op=admin" class="form-horizontal-left" method="post" name="cpform">
<input type="hidden" value="{FORMHASH}" name="formhash">
<input type="hidden" value="basic" name="operation">
<dl>
<dt>{lang logswitch}:</dt>
<dd class="clearfix">
<label class="radio-inline "><input type="radio" name="systemlog_open" value="1"<!--{if $_G[setting][systemlog_open]==1}-->checked<!--{/if}--> onclick="document.getElementById('hidden1').style.display='block';">{lang enable}</label>
<label class="radio radio-inline"><input type="radio" name="systemlog_open" value="0"<!--{if $_G[setting][systemlog_open]==0}-->checked<!--{/if}--> onclick="document.getElementById('hidden1').style.display='none';">{lang forbidden}</label>
</dd>
</dl>
<dl id="hidden1">
<dt>{lang logtype}:</dt>
<dd class="clearfix">
<table id="systemlogtable" class="table text-center" style="width: auto;margin-bottom:0; <!--{if $_G[setting][systemlog_open]==0}-->display:none<!--{/if}-->">
<thead>
<tr>
<th>{lang logtypename}</th>
<th>{lang logflag}</th>
<th>{lang logswitch}</th>
<th>&nbsp;</th>
</tr>
</thead>
{eval $i=0;}
<!--{loop $systemlog_setting $mark $info}-->
<tr>
<td>
<input type="hidden" name="settingnew[issystem][$i]" value="$info[issystem]" />
<input class="form-control" style="width:120px;" <!--{if $info[issystem]==1}-->readonly="readonly"<!--{/if}--> type="text" name="settingnew[title][$i]" value="$info[title]" />
</td>
<td><input class="form-control" style="width:100px;" <!--{if $info[issystem]==1}-->readonly="readonly"<!--{/if}--> type="text" name="settingnew[mark][$i]" value="$mark" /></td>
<td><input type="checkbox" name="settingnew[is_open][$i]" value="1" <!--{if $info[is_open]==1}-->checked<!--{/if}--> /></td>
<td>
<!--{if $info[issystem]!=1}-->
<a href="javascript:;" class="col-xs-2 img_delete" onclick="deletesystem(this);"><span class="dzz dzz-delete" style="font-size:22px;"></span></a>
<!--{/if}-->
</td>
</tr>
{eval $i++;}
<!--{/loop}-->
<tr>
<td colspan="4" align="left"><a href="javascript:;" onclick="addsystemtype(this);"><i class="glyphicon glyphicon-plus"></i>{lang add}</a></td>
</tr>
</table>
</dd>
</dl>
<dl>
<dd>
<input class="btn btn-primary" id="submit_editsubmit" name="settingsubmit" value="{lang save_changes}" type="submit">
</dd>
</dl>
</form>
</div>
</div>
</div>
<script type="text/javascript">
jQuery('.left-drager').leftDrager_layout();
jQuery(document).ready(function(e) {
jQuery('input').iCheck({
checkboxClass: 'icheckbox_minimal-blue',
radioClass: 'iradio_minimal-blue',
});
jQuery('input').on('ifChecked', function(e) {
jQuery(this).trigger('click');
});
jQuery('input[required]').on('blur', function() {
if(this.value == '') { jQuery(this).addClass('input-error') } else { jQuery(this).removeClass('input-error'); }
});
});
function addsystemtype( obj ){
var num=jQuery("#systemlogtable").find("tr").length-1;
var html='<tr><td><input type="hidden" name="settingnew[issystem]['+num+']" value="0" /><input class="form-control" style="width:120px;" type="text" name="settingnew[title]['+num+']" value="" /></td><td><input class="form-control" style="width:100px;" type="text" name="settingnew[mark]['+num+']" value="" /></td><td><input type="checkbox" name="settingnew[is_open]['+num+']" value="1" checked /></td><td><a class="col-xs-2 img_delete" onclick="deletesystem(this);" href="javascript:;"><span class="dzz dzz-delete" style="font-size:22px;"></span></a></td></tr>';
jQuery(obj).parents("tr").before(html);
jQuery("#systemlogtable").iCheck({
checkboxClass: 'icheckbox_minimal-blue',
radioClass: 'iradio_minimal-blue',
});
return false;
}
function deletesystem( obj ){
jQuery(obj).parents("tr").remove();
return false;
}
</script>
<script src="static/bootstrap/js/bootstrap.min.js?{VERHASH}"></script>
<script type="text/javascript" src="static/icheck/icheck.min.js?{VERHASH}"></script>
<!--{template common/footer_simple}-->

View File

@@ -1,4 +1,4 @@
<ul class="nav-stacked">
<li <!--{if $_GET[op]!="admin" }--> class="active" <!--{/if}-->><a hidefocus="true" href="{MOD_URL}">{lang systemlog_list}</a></li>
<li <!--{if $_GET[op]=="admin" }--> class="active" <!--{/if}-->><a hidefocus="true" href="{MOD_URL}&op=admin">{lang systemlog_setting}</a></li>
<ul class="nav-stacked">
<li <!--{if $_GET[op]!="admin" }--> class="active" <!--{/if}-->><a hidefocus="true" href="{MOD_URL}">{lang systemlog_list}</a></li>
<li <!--{if $_GET[op]=="admin" }--> class="active" <!--{/if}-->><a hidefocus="true" href="{MOD_URL}&op=admin">{lang systemlog_setting}</a></li>
</ul>

View File

@@ -1,110 +1,110 @@
<!--{template common/header_simple_start}-->
<link href="static/css/common.css?{VERHASH}" rel="stylesheet" media="all">
<link href="static/select2/select2.css?{VERHASH}" rel="stylesheet" media="all">
<link href="static/select2/select2-bootstrap.css?{VERHASH}" rel="stylesheet" media="all">
<script type="text/javascript" src="static/js/jquery.leftDrager.js?{VERHASH}"></script>
<style>
input[type="text"] {
margin: 0;
}
</style>
<!--{template common/header_simple_end}-->
<!--{template common/commer_header}-->
<div class="bs-container clearfix">
<div class="bs-left-container clearfix">
<!--{template left}-->
</div>
<div class="left-drager">
</div>
<div class="bs-main-container clearfix">
<div class="main-header clearfix" style="border-bottom:1px solid #e1e1e1;padding-top: 15px;">
<ul class="nav nav-pills nav-pills-bottomguide">
<!--{loop $systemlog_setting $mark $info}-->
<!--{if $info[is_open]==1 }-->
<li <!--{if $operation==$mark }-->class="active"<!--{/if}-->>
<a hidefocus="true" href="{BASESCRIPT}?mod=systemlog&type=list&operation=$mark">{$info['title']}</a>
</li>
<!--{/if}-->
<!--{/loop}-->
</ul>
</div>
<div class="main-content" style="border-top:1px solid #FFF">
<form id="cpform" action="{BASESCRIPT}?mod=systemlog&type=list&operation=$operation" class="form-horizontal form-horizontal-left" method="post" name="cpform">
<input type="hidden" value="{FORMHASH}" name="formhash">
<input type="hidden" name="lpp" value="20">
<table class="table">
<thead>
<th width="80">{lang operator}</th>
<th width="80">{lang usergroup}</th>
<th width="120">{lang ip}</th>
<th width="120">{lang time}</th>
<th>{lang info}</th>
</thead>
<!--{if $list}-->
<!--{loop $list $key $log}-->
<tr>
<td>$log[2]</td>
<td>$log[3]</td>
<td>$log[4]</td>
<td>$log[1]</td>
<td>
<a href="javascript:;" onclick="togglecplog('{$key}')">{eval echo cutstr($log[5], 200)}</a>
</td>
</tr>
<thead id="cplog_{$key}" style="display:none">
<td colspan="10">
{lang loginfo}: $log[5]
<br/>{lang visit}: $log[6]
<br/>{lang from}: $log[7]</td>
</thead>
<!--{/loop}-->
<tr>
<td colspan="15">
<div class="pull-left input-group" style="width:100px;">
<span class="input-group-addon">{lang logs_lpp}</span>
<select class="input-sm form-control" style="margin:0;width:60px;" onchange="if(this.options[this.selectedIndex].value != '') {this.form.lpp.value = this.options[this.selectedIndex].value;this.form.submit(); }">
<option value="20" $checklpp[20]> 20 </option>
<option value="40" $checklpp[40]> 40 </option>
<option value="80" $checklpp[80]> 80 </option>
</select>
</div>
<div class="pull-left input-group" style="width:128px;">
<input type="text" class="input-sm form-control" style="width:90px;border-left:0" name="keyword" value="$_GET[keyword]">
<a href="javascript:;" class="input-group-addon" onclick="document.getElementById('cpform').submit();return false"><i class="glyphicon glyphicon-search"></i></a>
</div>
$multipage
</td>
</tr>
<!--{else}-->
<tr>
<td colspan="5">{lang there_no_such_results}</td>
</tr>
<!--{/if}-->
</table>
</form>
<script type="text/javascript">
function togglecplog(k) {
var cplogobj = document.getElementById('cplog_' + k);
if(cplogobj.style.display == 'none') {
cplogobj.style.display = '';
} else {
cplogobj.style.display = 'none';
}
}
</script>
</div>
</div>
</div>
<script type="text/javascript">
jQuery('.left-drager').leftDrager_layout();
</script>
<script src="static/bootstrap/js/bootstrap.min.js?{VERHASH}"></script>
<!--{template common/header_simple_start}-->
<link href="static/css/common.css?{VERHASH}" rel="stylesheet" media="all">
<link href="static/select2/select2.css?{VERHASH}" rel="stylesheet" media="all">
<link href="static/select2/select2-bootstrap.css?{VERHASH}" rel="stylesheet" media="all">
<script type="text/javascript" src="static/js/jquery.leftDrager.js?{VERHASH}"></script>
<style>
input[type="text"] {
margin: 0;
}
</style>
<!--{template common/header_simple_end}-->
<!--{template common/commer_header}-->
<div class="bs-container clearfix">
<div class="bs-left-container clearfix">
<!--{template left}-->
</div>
<div class="left-drager">
</div>
<div class="bs-main-container clearfix">
<div class="main-header clearfix" style="border-bottom:1px solid #e1e1e1;padding-top: 15px;">
<ul class="nav nav-pills nav-pills-bottomguide">
<!--{loop $systemlog_setting $mark $info}-->
<!--{if $info[is_open]==1 }-->
<li <!--{if $operation==$mark }-->class="active"<!--{/if}-->>
<a hidefocus="true" href="{BASESCRIPT}?mod=systemlog&type=list&operation=$mark">{$info['title']}</a>
</li>
<!--{/if}-->
<!--{/loop}-->
</ul>
</div>
<div class="main-content" style="border-top:1px solid #FFF">
<form id="cpform" action="{BASESCRIPT}?mod=systemlog&type=list&operation=$operation" class="form-horizontal form-horizontal-left" method="post" name="cpform">
<input type="hidden" value="{FORMHASH}" name="formhash">
<input type="hidden" name="lpp" value="20">
<table class="table">
<thead>
<th width="80">{lang operator}</th>
<th width="80">{lang usergroup}</th>
<th width="120">{lang ip}</th>
<th width="120">{lang time}</th>
<th>{lang info}</th>
</thead>
<!--{if $list}-->
<!--{loop $list $key $log}-->
<tr>
<td>$log[2]</td>
<td>$log[3]</td>
<td>$log[4]</td>
<td>$log[1]</td>
<td>
<a href="javascript:;" onclick="togglecplog('{$key}')">{eval echo cutstr($log[5], 200)}</a>
</td>
</tr>
<thead id="cplog_{$key}" style="display:none">
<td colspan="10">
{lang loginfo}: $log[5]
<br/>{lang visit}: $log[6]
<br/>{lang from}: $log[7]</td>
</thead>
<!--{/loop}-->
<tr>
<td colspan="15">
<div class="pull-left input-group" style="width:100px;">
<span class="input-group-addon">{lang logs_lpp}</span>
<select class="input-sm form-control" style="margin:0;width:60px;" onchange="if(this.options[this.selectedIndex].value != '') {this.form.lpp.value = this.options[this.selectedIndex].value;this.form.submit(); }">
<option value="20" $checklpp[20]> 20 </option>
<option value="40" $checklpp[40]> 40 </option>
<option value="80" $checklpp[80]> 80 </option>
</select>
</div>
<div class="pull-left input-group" style="width:128px;">
<input type="text" class="input-sm form-control" style="width:90px;border-left:0" name="keyword" value="$_GET[keyword]">
<a href="javascript:;" class="input-group-addon" onclick="document.getElementById('cpform').submit();return false"><i class="glyphicon glyphicon-search"></i></a>
</div>
$multipage
</td>
</tr>
<!--{else}-->
<tr>
<td colspan="5">{lang there_no_such_results}</td>
</tr>
<!--{/if}-->
</table>
</form>
<script type="text/javascript">
function togglecplog(k) {
var cplogobj = document.getElementById('cplog_' + k);
if(cplogobj.style.display == 'none') {
cplogobj.style.display = '';
} else {
cplogobj.style.display = 'none';
}
}
</script>
</div>
</div>
</div>
<script type="text/javascript">
jQuery('.left-drager').leftDrager_layout();
</script>
<script src="static/bootstrap/js/bootstrap.min.js?{VERHASH}"></script>
<!--{template common/footer_simple}-->

View File

@@ -1,18 +1,18 @@
<?php
/*
* 应用卸载文件;
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author qchlian
*/
if(!defined('IN_OAOOA') || !defined('IN_ADMIN')) {
exit('Access Denied');
}
$sql = <<<EOF
DELETE FROM `dzz_setting` WHERE `dzz_setting`.`skey` = 'systemlog_setting';
DELETE FROM `dzz_setting` WHERE `dzz_setting`.`skey` = 'systemlog_open';
EOF;
runquery($sql);
$finish = true;
<?php
/*
* 应用卸载文件;
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author qchlian
*/
if(!defined('IN_OAOOA') || !defined('IN_ADMIN')) {
exit('Access Denied');
}
$sql = <<<EOF
DELETE FROM `dzz_setting` WHERE `dzz_setting`.`skey` = 'systemlog_setting';
DELETE FROM `dzz_setting` WHERE `dzz_setting`.`skey` = 'systemlog_open';
EOF;
runquery($sql);
$finish = true;

View File

@@ -1,8 +1,8 @@
<ul class="nav navbar-nav navbar-nav-left" style="min-width:168px">
<li>
<a class="leftTopmenu" href="index.php?mod=appmanagement" style="padding:8px"><div class="gb_fc"><span class="dzz dzz-chevron-left" style="display:block"></span></div></a>
</li>
<li>
<a href="{MOD_URL}">{lang appname}</a>
</li>
<ul class="nav navbar-nav navbar-nav-left" style="min-width:168px">
<li>
<a class="leftTopmenu" href="index.php?mod=appmanagement" style="padding:8px"><div class="gb_fc"><span class="dzz dzz-chevron-left" style="display:block"></span></div></a>
</li>
<li>
<a href="{MOD_URL}">{lang appname}</a>
</li>
</ul>

View File

@@ -1,55 +1,55 @@
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
error_reporting(0);
define('SITEURL', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
$uid = isset($_GET['uid']) ? $_GET['uid'] : 0;
$size = isset($_GET['size']) ? $_GET['size'] : '';
$random = isset($_GET['random']) ? $_GET['random'] : '';
$type = isset($_GET['type']) ? $_GET['type'] : '';
$check = isset($_GET['check_file_exists']) ? $_GET['check_file_exists'] : '';
$avatar = './data/avatar/'.get_avatar($uid, $size, $type);
if(file_exists(dirname(__FILE__).'/'.$avatar)) {
if($check) {
echo 1;
exit;
}
$random = !empty($random) ? rand(1000, 9999) : '';
$avatar_url = empty($random) ? $avatar : $avatar.'?random='.$random;
} else {
if($check) {
echo 0;
exit;
}
$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
$avatar_url = 'data/avatar/noavatar_'.$size.'.gif';
}
if(empty($random)) {
header("HTTP/1.1 301 Moved Permanently");
header("Last-Modified:".date('r'));
header("Expires: ".date('r', time() + 86400));
}
header('Location: '.SITEURL.'/'.$avatar_url);
exit;
function get_avatar($uid, $size = 'middle', $type = '') {
$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
$uid = abs(intval($uid));
$uid = sprintf("%09d", $uid);
$dir1 = substr($uid, 0, 3);
$dir2 = substr($uid, 3, 2);
$dir3 = substr($uid, 5, 2);
$typeadd = $type == 'real' ? '_real' : '';
return $dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).$typeadd."_avatar_$size.jpg";
}
?>
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
error_reporting(0);
define('SITEURL', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
$uid = isset($_GET['uid']) ? $_GET['uid'] : 0;
$size = isset($_GET['size']) ? $_GET['size'] : '';
$random = isset($_GET['random']) ? $_GET['random'] : '';
$type = isset($_GET['type']) ? $_GET['type'] : '';
$check = isset($_GET['check_file_exists']) ? $_GET['check_file_exists'] : '';
$avatar = './data/avatar/'.get_avatar($uid, $size, $type);
if(file_exists(dirname(__FILE__).'/'.$avatar)) {
if($check) {
echo 1;
exit;
}
$random = !empty($random) ? rand(1000, 9999) : '';
$avatar_url = empty($random) ? $avatar : $avatar.'?random='.$random;
} else {
if($check) {
echo 0;
exit;
}
$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
$avatar_url = 'data/avatar/noavatar_'.$size.'.gif';
}
if(empty($random)) {
header("HTTP/1.1 301 Moved Permanently");
header("Last-Modified:".date('r'));
header("Expires: ".date('r', time() + 86400));
}
header('Location: '.SITEURL.'/'.$avatar_url);
exit;
function get_avatar($uid, $size = 'middle', $type = '') {
$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
$uid = abs(intval($uid));
$uid = sprintf("%09d", $uid);
$dir1 = substr($uid, 0, 3);
$dir2 = substr($uid, 3, 2);
$dir3 = substr($uid, 5, 2);
$typeadd = $type == 'real' ? '_real' : '';
return $dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).$typeadd."_avatar_$size.jpg";
}
?>

12
ceshi.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
$video='*.m4v,*.mp4,*.webm,*.mpg,*.mov,*.avi,*.rmvb,*.mkv,*.mpg,*.mpeg,*.flv,*.m4v';
$audio='*.aac,*.flac,*.m4a,*.mp3,*.ogg,*.wav';
$document='*.txt,*.*.pdf,*.potx,*.ppt,*.pptx,*.xls,*.xlsx,*.doc,*.docx';
$images='*.ai,*.*.cdr,*.psd*.,bmp,*.eps,*.gif,*.heic,*.icns,*.ico,*.jpeg,*.jpg,*.png,*.svg,*.tif,*.tiff,*.ttf,*.webp,*.base64,3fr,*.arw,*.cr2,*.cr3,*.crw,*.dng,*.erf,*.mrw,*.nef,*.nrw,*.orf,*.otf,*.pef,*.raf,*.raw,*.rw2,*.sr2,*.srw,*.x3f';
$defaultextstr = '';
$defaultextstr .= $images;
$defaultextstr .= ','.$document;
$defaultextstr .= ','.$audio;
$defaultextstr .= ','.$video;
echo $defaultextstr;

View File

@@ -140,7 +140,7 @@ $_config['output']['staticurl'] = 'static/'; // 站点静态文件路径,“
$_config['output']['ajaxvalidate'] = 0; // 是否严格验证 Ajax 页面的真实性 0=关闭1=打开
$_config['output']['iecompatible'] = 0; // 页面 IE 兼容模式
// COOKIE 设置
$_config['cookie']['cookiepre'] = 'oaooa_'; // COOKIE前缀
$_config['cookie']['cookiedomain'] = ''; // COOKIE作用域
$_config['cookie']['cookiepath'] = '/'; // COOKIE作用路径
@@ -158,29 +158,91 @@ $_config['security']['querysafe']['dlikehex'] = 1;
$_config['security']['querysafe']['afullnote'] = 0;
$_config['admincp']['founder'] = '1'; // 站点创始人:拥有站点管理后台的最高权限,每个站点可以设置 1名或多名创始人
// 可以使用uid也可以使用用户名多个创始人之间请使用逗号“,”分开;
// 可以使用uid也可以使用用户名多个创始人之间请使用逗号“,”分开;
$_config['admincp']['checkip'] = 1; // 后台管理操作是否验证管理员的 IP, 1=是[安全], 0=否。仅在管理员无法登录后台时设置 0。
$_config['admincp']['runquery'] = 0; // 是否允许后台运行 SQL 语句 1=是 0=否[安全]
$_config['admincp']['dbimport'] = 0; // 是否允许后台恢复网站数据 1=是 0=否[安全]
$_config['userlogin']['checkip'] = 1; //用户登录错误验证ip对于同一ip同时使用时建议设置为0,否则当有一位用户登录错误次数超过5次该ip被锁定15分钟导致其他的同IP用户无法登录;
//$_config['system_os'] = 'linux'; //windows,linux,mac,系统会自动判断
//$_config['system_charset']='utf-8'; //操作系统编码不设置系统将根据操作系统类型来判断linux:utf-8;windows:gbk;
//pichome宽高
$_config['pichomethumbwidth']= 900;
$_config['pichomethumbheight']= 900;
//pichome缩略图颜色允许后缀
$_config['getcolorextlimit'] = ['jpg','png','jpeg','gif','webp','pdf'];
//ffmpeg位置
// -------------------------- CONFIG PICHOME -------------------------- //
$_config['pichomecloseshare'] = 0; //关闭分享
$_config['pichomeclosecollect'] = 0; //关闭收藏
$_config['pichomeclosedownload'] = 0; //关闭下载
//缩略图默认设置
$_config['pichomethumsmallwidth']= 360;
$_config['pichomethumsmallheight']= 360;
$_config['pichomethumlargwidth'] = 1920;
$_config['pichomethumlargheight'] = 1080;
$_config['gdgetcolorextlimit'] = 'jpg,png,jpeg,gif'; //gd颜色后缀
$_config['imageickallowextlimit'] = 'aai,art,arw,avs,bpg,bmp,bmp2,bmp3,brf,cals,cals,cgm,cin,cip,cmyk,cmyka,cr2,crw,cube,cur,cut,dcm,dcr,dcx,dds,dib,djvu,dng,dot,dpx,emf,epdf,epi,eps,eps2,eps3,epsf,epsi,ept,exr,fax,fig,fits,fpx,gplt,gray,graya,hdr,heic,hpgl,hrz,ico,info,isobrl,isobrl6,jbig,jng,jp2,jpt,j2c,j2k,jxr,json,man,mat,miff,mono,mng,m2v,mpc,mpr,mrwmmsl,mtv,mvg,nef,orf,otb,p7,palm,pam,clipboard,pbm,pcd,pcds,pcl,pcx,pdb,pef,pes,pfa,pfb,pfm,pgm,picon,pict,pix,png8,png00,png24,png32,png48,png64,pnm,ppm,ps,ps2,ps3,psb,psd,ptif,pwp,rad,raf,rgb,rgb565,rgba,rgf,rla,rle,sfw,sgi,shtml,sid,mrsid,sum,svg,text,tga,tif,tiff,tim,ttf,ubrl,ubrl6,uil,uyvy,vicar,viff,wbmp,wpg,webp,wmf,wpg,x,xbm,xcf,xpm,xwd,x3f,YCbCr,YCbCrA,yuv,sr2,srf,srw,rw2,nrw,mrw,kdc,erf,canvas,caption,clip,clipboard,fractal,gradient,hald,histogram,inline,map,mask,matte,null,pango,plasma,preview,print,scan,radial_gradient,scanx,screenshot,stegano,tile,unique,vid,win,xc,granite,logo,netscpe,rose,wizard,bricks,checkerboard,circles,crosshatch,crosshatch30,crosshatch45,fishscales,gray0,gray5,gray10,gray15,gray20,gray25,gray30,gray35,gray40,gray45,gray50,gray55,gray60,gray65,gray70,gray75,gray80,gray85,gray90,gray95,gray100,hexagons,horizontal,horizontal2,horizontal3,horizontalsaw,hs_bdiagonal,hs_cross,hs_diagcross,hs_fdiagonal,hs_vertical,left30,left45,leftshingle,octagons,right30,right45,rightshingle,smallfishcales,vertical,vertical2,vertical3,verticalfishingle,vericalrightshingle,verticalleftshingle,verticalsaw,fff,3fr,ai,iiq,cdr'; //gd颜色后缀
$_config['pichomespecialimgext'] = 'aai,art,arw,avs,bpg,bmp,bmp2,bmp3,brf,cals,cals,cgm,cin,cip,cmyk,cmyka,cr2,crw,cube,cur,cut,dcm,dcr,dcx,dds,dib,djvu,dng,dot,dpx,emf,epdf,epi,eps,eps2,eps3,epsf,epsi,ept,exr,fax,fig,fits,fpx,gplt,gray,graya,hdr,heic,hpgl,hrz,ico,info,isobrl,isobrl6,jbig,jng,jp2,jpt,j2c,j2k,jxr,json,man,mat,miff,mono,mng,m2v,mpc,mpr,mrwmmsl,mtv,mvg,nef,orf,otb,p7,palm,pam,clipboard,pbm,pcd,pcds,pcl,pcx,pdb,pef,pes,pfa,pfb,pfm,pgm,picon,pict,pix,png8,png00,png24,png32,png48,png64,pnm,ppm,ps,ps2,ps3,psb,psd,ptif,pwp,rad,raf,rgb,rgb565,rgba,rgf,rla,rle,sfw,sgi,shtml,sid,mrsid,sum,text,tga,tif,tiff,tim,ttf,ubrl,ubrl6,uil,uyvy,vicar,viff,wbmp,wpg,wmf,wpg,x,xbm,xcf,xpm,xwd,x3f,YCbCr,YCbCrA,yuv,sr2,srf,srw,rw2,nrw,mrw,kdc,erf,canvas,caption,clip,clipboard,fractal,gradient,hald,histogram,inline,map,mask,matte,null,pango,plasma,preview,print,scan,radial_gradient,scanx,screenshot,stegano,tile,unique,vid,win,xc,granite,logo,netscpe,rose,wizard,bricks,checkerboard,circles,crosshatch,crosshatch30,crosshatch45,fishscales,gray0,gray5,gray10,gray15,gray20,gray25,gray30,gray35,gray40,gray45,gray50,gray55,gray60,gray65,gray70,gray75,gray80,gray85,gray90,gray95,gray100,hexagons,horizontal,horizontal2,horizontal3,horizontalsaw,hs_bdiagonal,hs_cross,hs_diagcross,hs_fdiagonal,hs_vertical,left30,left45,leftshingle,octagons,right30,right45,rightshingle,smallfishcales,vertical,vertical2,vertical3,verticalfishingle,vericalrightshingle,verticalleftshingle,verticalsaw,fff,3fr,ai,iiq,cdr'; //gd颜色后缀
$_config['pichomecommimageext'] = 'jpg,png,jpeg,gif,svg,webp';//pichome直接预览图片后缀
//本地文档支持格式
$_config['onlyofficeviewextlimit'] = 'pdf,doc,docx,rtf,odt,htm,html,mht,txt,ppt,pptx,pps,ppsx,odp,xls,xlsx,ods,csv';
//腾讯云格式支持
$_config['qcosmedia']='3gp,avi,flv,mp4,m3u8,mpg,asf,wmv,mkv,mov,ts,webm,mxf';
$_config['qcosoffice']='pptx,ppt,pot,potx,pps,ppsx,dps,dpt,pptm,potm,ppsm,doc,dot,wps,wpt,docx,dotx,docm,dotm,xls,xlt,et,ett,xlsx,xltx,csv,xlsb,xlsm,xltm,ets,pdf,lrc,c,cpp,h,asm,s,java,asp,bat,bas,prg,cmd,rtf,txt,log,xml,htm,html';
$_config['qcosimage']='jpg,bmp,gif,png,webp';
//ffmpeg默认设置
$_config['pichomeffmpegposition'] = '';
$_config['pichomeffprobposition'] = '';
$_config['pichomeffmpeggetvieoinfoext']= 'avi,rm,rmvb,mkv,mov,wmv,asf,mpg,mpe,mpeg,mp4,m4v,mpeg,f4v,vob,ogv,mts,m2ts,3gp,webm,flv,wav,mp3,ogg,midi,wma,vqf,ra,aac,flac,ape,amr,aiff,au,m4a'; //ffmpeg支持获取音视频信息的后缀
$_config['pichomeffmpeggetthumbext']= 'avi,rm,rmvb,mkv,mov,wmv,asf,mpg,mpe,mpeg,mp4,m4v,mpeg,f4v,vob,ogv,mts,m2ts,3gp,webm,flv,wav,mp3,ogg,midi,wma,vqf,ra,aac,flac,ape,amr,aiff,au,m4a'; //ffmpeg支持获取音视频缩略图后缀
$_config['pichomeffmpegconvertext']= 'avi,rm,rmvb,mkv,mov,wmv,asf,mpg,mpe,mpeg,mp4,m4v,mpeg,f4v,vob,ogv,mts,m2ts,3gp,webm,flv,wav,mp3,ogg,midi,wma,vqf,ra,aac,flac,ape,amr,aiff,au,m4a'; //ffmpeg支持转码后缀
//支持获取音视频信息的后缀
$_config['pichomeffmpeggetvieoinoext']= [ 'avi', 'rm', 'rmvb', 'mkv', 'mov', 'wmv', 'asf', 'mpg', 'mpe', 'mpeg', 'mp4', 'm4v', 'mpeg', 'f4v', 'vob', 'ogv', 'mts', 'm2ts',
'3gp', 'webm', 'flv', 'wav', 'mp3', 'ogg', 'midi', 'wma', 'vqf', 'ra', 'aac', 'flac', 'ape', 'amr', 'aiff', 'au', 'm4a'];
//支持获取音视频缩略图后缀
$_config['pichomeffmpeggetthumbext']= [ 'avi', 'rm', 'rmvb', 'mkv', 'mov', 'wmv', 'asf', 'mpg', 'mpe', 'mpeg', 'mp4', 'm4v', 'mpeg', 'f4v', 'vob', 'ogv', 'mts', 'm2ts',
'3gp', 'webm', 'flv', 'wav', 'mp3', 'ogg', 'midi', 'wma', 'vqf', 'ra', 'aac', 'flac', 'ape', 'amr', 'aiff', 'au', 'm4a'];
//支持转码后缀
$_config['pichomeplayermediaext'] = 'mp3,mp4,webm,ogv,ogg,wav,m3u8,hls,mpg,mpeg';
$_config['pichomeconvertext'] = 'webm,ogv,ogg,wav,m3u8,hls,mpg,3gp,avi,flv,mp4,asf,wmv,mkv,mov,ts,mxf';
$_config['pichomexgplayer'] = 'mp3,mp4,flv,webm,ogv,ogg,wav,m3u8,hls,mpg,avi,rm,rmvb,mkv,mov,wmv,asf,mpg,mpeg,f4v,vob,ogv,mts,m2ts,mpe,ogg,3gp,flv,midi,wma,vqf,ra,aac,flac,ape,amr,aiff,au,m4a,m4v';
//转码质量参数
$_config['videoquality'][0]['name'] = '流畅';
$_config['videoquality'][0]['width'] = 640;
$_config['videoquality'][0]['height'] = 360;
$_config['videoquality'][0]['bitrate'] = 400;
$_config['videoquality'][1]['name'] = '标清';
$_config['videoquality'][1]['width'] = 960;
$_config['videoquality'][1]['height'] = 510;
$_config['videoquality'][1]['bitrate'] = 900;
$_config['videoquality'][2]['name'] = '高清';
$_config['videoquality'][2]['width'] = 1280;
$_config['videoquality'][2]['height'] = 720;
$_config['videoquality'][2]['bitrate'] = 1500;
$_config['videoquality'][3]['name'] = '超清';
$_config['videoquality'][3]['width'] = 1920;
$_config['videoquality'][3]['height'] = 1080;
$_config['videoquality'][3]['bitrate'] = 3000;
$_config['videoquality'][4]['name'] = '2k';
$_config['videoquality'][4]['width'] = 3500;
$_config['videoquality'][4]['height'] = 2560;
$_config['videoquality'][4]['bitrate'] = 1440;
$_config['videoquality'][5]['name'] = '4k';
$_config['videoquality'][5]['width'] = 3840;
$_config['videoquality'][5]['height'] = 2160;
$_config['videoquality'][5]['bitrate'] = 6000;
$_config['defaultvideoquality'] = 1;
//转换缩略图进程数
$_config['thumbprocessnum'] = 1;
//获取信息进程数
$_config['infoprocessnum'] = 1;
//转换缩略图进程数
$_config['convertprocessnum'] = 1;
return $_config;

View File

@@ -1,37 +1,37 @@
<?php
$_config = array();
$_config['namespacelist'] = array(
'root' =>DZZ_ROOT,
'coreroot' => DZZ_ROOT.'core',
'admin' => DZZ_ROOT.'admin',
'core' => CORE_PATH,
'dzz' => DZZ_ROOT.APP_DIRNAME,
'user' => DZZ_ROOT.'user',
'misc' => DZZ_ROOT.'misc'
);
$_config['default_mod'] = 'index';
$_config['default_op'] = 'index';
$_config['default_action'] = 'index';
/**
* 其它配置
*/
$_config['allow_robot'] = false;
$_config['allow_view'] = 0;//(0=>所有人,1=>用户,2=>管理员,3=>创始人)
$_config['libfile'] = '';
$_config['language'] = '';
$_config['mod_view_perm'] = '';
$_config['action_name'] = 'do';
$_config['do_name'] = 'action';
$_config['profile']['privacy'] = array(
'-1'=>'私密',
'0'=>'公开',
'1'=>'本部门可见',
'2'=>'本机构可见',
);
<?php
$_config = array();
$_config['namespacelist'] = array(
'root' =>DZZ_ROOT,
'coreroot' => DZZ_ROOT.'core',
'admin' => DZZ_ROOT.'admin',
'core' => CORE_PATH,
'dzz' => DZZ_ROOT.APP_DIRNAME,
'user' => DZZ_ROOT.'user',
'misc' => DZZ_ROOT.'misc'
);
$_config['default_mod'] = 'index';
$_config['default_op'] = 'index';
$_config['default_action'] = 'index';
/**
* 其它配置
*/
$_config['allow_robot'] = false;
$_config['allow_view'] = 0;//(0=>所有人,1=>用户,2=>管理员,3=>创始人)
$_config['libfile'] = '';
$_config['language'] = '';
$_config['mod_view_perm'] = '';
$_config['action_name'] = 'do';
$_config['do_name'] = 'action';
$_config['profile']['privacy'] = array(
'-1'=>'私密',
'0'=>'公开',
'1'=>'本部门可见',
'2'=>'本机构可见',
);
return $_config;

View File

@@ -1,22 +1,22 @@
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
require __DIR__.'/coreBase.php';
$dzz = C::app();
Hook::listen('dzz_initbefore');//初始化前钩子
$dzz->init();
$admincp = new dzz_admincp();
$admincp->core = $dzz;
$admincp->init();
Hook::listen('dzz_initafter');//初始化后钩子
$files = Hook::listen('dzz_route',$_GET);//路由钩子,返回文件路径
foreach($files as $v){
require $v;//包含文件
}
<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
require __DIR__.'/coreBase.php';
$dzz = C::app();
Hook::listen('dzz_initbefore');//初始化前钩子
$dzz->init();
$admincp = new dzz_admincp();
$admincp->core = $dzz;
$admincp->init();
Hook::listen('dzz_initafter');//初始化后钩子
$files = Hook::listen('dzz_route',$_GET);//路由钩子,返回文件路径
foreach($files as $v){
require $v;//包含文件
}

2
core/api/Qcos/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.vscode/
.idea/

17
core/api/Qcos/.travis.yml Normal file
View File

@@ -0,0 +1,17 @@
language: php
php:
- 5.6
notifications:
email:
recipients:
- wjielai@tencent.com
- fysntian@tencent.com
before_script:
- composer install --prefer-dist --dev --no-interaction
script:
- phpunit -v --coverage-clover=coverage.xml
after_success:
- bash <(curl -s https://codecov.io/bash)

21
core/api/Qcos/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 腾讯云
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

302
core/api/Qcos/README.md Normal file
View File

@@ -0,0 +1,302 @@
# COS-PHP-SDK-V5
腾讯云 COS-PHP-SDK-V5[XML API](https://cloud.tencent.com/document/product/436/7751)
[![Latest Stable Version](https://poser.pugx.org/qcloud/cos-sdk-v5/v/stable)](https://packagist.org/packages/qcloud/cos-sdk-v5)
[![Total Downloads](https://img.shields.io/packagist/dt/qcloud/cos-sdk-v5.svg?style=flat)](https://packagist.org/packages/qcloud/cos-sdk-v5)
[![Build Status](https://travis-ci.org/tencentyun/cos-php-sdk-v5.svg?branch=master)](https://travis-ci.org/tencentyun/cos-php-sdk-v5)
[![codecov](https://codecov.io/gh/tencentyun/cos-php-sdk-v5/branch/master/graph/badge.svg)](https://codecov.io/gh/tencentyun/cos-php-sdk-v5)
## 环境准备
- PHP 5.6+ 您可以通过`php -v`命令查看当前的 PHP 版本。
> - 如果您的 php 版本 `>=5.3` 且 `<5.6` , 请使用 [v1.3](https://github.com/tencentyun/cos-php-sdk-v5/tree/1.3) 版本
- cURL 扩展 您可以通过`php -m`命令查看 cURL 扩展是否已经安装好。
> - Ubuntu 系统中,您可以使用 apt-get 包管理器安装 PHP 的 cURL 扩展,安装命令如下。
```
sudo apt-get install php-curl
```
> - CentOS 系统中,您可以使用 yum 包管理器安装 PHP 的 cURL 扩展。
```
sudo yum install php-curl
```
## SDK 安装
SDK 安装有三种方式:
- Composer 方式
- Phar 方式
- 源码方式
### Composer 方式
推荐使用 Composer 安装 cos-php-sdk-v5Composer 是 PHP 的依赖管理工具,允许您声明项目所需的依赖,然后自动将它们安装到您的项目中。
> 您可以在 [Composer 官网](https://getcomposer.org/) 上找到更多关于如何安装 Composer配置自动加载以及用于定义依赖项的其他最佳实践等相关信息。
#### 安装步骤:
1. 打开终端。
2. 下载 Composer执行以下命令。
```
curl -sS https://getcomposer.org/installer | php
```
3. 创建一个名为`composer.json`的文件,内容如下。
```json
{
"require": {
"qcloud/cos-sdk-v5": "2.*"
}
}
```
4. 使用 Composer 安装,执行以下命令。
```
php composer.phar install
```
使用该命令后会在当前目录中创建一个 vendor 文件夹,里面包含 SDK 的依赖库和一个 autoload.php 脚本,方便在项目中调用。
5. 通过 autoload.php 脚本调用 cos-php-sdk-v5。
```php
require '/path/to/vendor/autoload.php';
```
现在您的项目已经可以使用 COS 的 V5 版本 SDK 了。
### Phar 方式
Phar 方式安装 SDK 的步骤如下:
1. 在 [GitHub 发布页面](https://github.com/tencentyun/cos-php-sdk-v5/releases) 下载相应的 phar 文件。
2. 在代码中引入 phar 文件:
```php
require '/path/to/cos-sdk-v5.phar';
```
### 源码方式
源码方式安装 SDK 的步骤如下:
1. 在 [GitHub 发布页面](https://github.com/tencentyun/cos-php-sdk-v5/releases) 下载相应的 cos-sdk-v5.tar.gz 文件。
2. 解压后通过 autoload.php 脚本加载 SDK
```php
require '/path/to/cos-php-sdk-v5/vendor/autoload.php';
```
## 快速入门
可参照 Demo 程序,详见 [sample 目录](https://github.com/tencentyun/cos-php-sdk-v5/tree/master/sample)。
## 接口文档
PHP SDK 接口文档,详见 [https://cloud.tencent.com/document/product/436/12267](https://cloud.tencent.com/document/product/436/12267)
### 配置文件
```php
$cosClient = new Qcloud\Cos\Client(array(
'region' => '<Region>',
'credentials' => array(
'secretId' => '<SecretId>',
'secretKey' => '<SecretKey>'
)
));
```
若您使用 [临时密钥](https://cloud.tencent.com/document/product/436/14048) 初始化,请用下面方式创建实例。
```php
$cosClient = new Qcloud\Cos\Client(array(
'region' => '<Region>',
'credentials' => array(
'secretId' => '<SecretId>',
'secretKey' => '<SecretKey>',
'token' => '<XCosSecurityToken>'
)
));
```
### 上传文件
- 使用 putObject 接口上传文件(最大 5G)
- 使用 Upload 接口分块上传文件
```php
# 上传文件
## putObject(上传接口最大支持上传5G文件)
### 上传内存中的字符串
//bucket 的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
try {
$result = $cosClient->putObject(array(
'Bucket' => $bucket,
'Key' => $key,
'Body' => 'Hello World!'));
print_r($result);
} catch (\Exception $e) {
echo "$e\n";
}
### 上传文件流
try {
$result = $cosClient->putObject(array(
'Bucket' => $bucket,
'Key' => $key,
'Body' => fopen($local_path, 'rb')));
print_r($result);
} catch (\Exception $e) {
echo "$e\n";
}
### 设置header和meta
try {
$result = $cosClient->putObject(array(
'Bucket' => $bucket,
'Key' => $key,
'Body' => fopen($local_path, 'rb'),
'ACL' => 'string',
'CacheControl' => 'string',
'ContentDisposition' => 'string',
'ContentEncoding' => 'string',
'ContentLanguage' => 'string',
'ContentLength' => integer,
'ContentType' => 'string',
'Expires' => 'mixed type: string (date format)|int (unix timestamp)|\DateTime',
'Metadata' => array(
'string' => 'string',
),
'StorageClass' => 'string'));
print_r($result);
} catch (\Exception $e) {
echo "$e\n";
}
## Upload(高级上传接口默认使用分块上传最大支持50T)
### 上传内存中的字符串
try {
$result = $cosClient->Upload(
$bucket = $bucket,
$key = $key,
$body = 'Hello World!');
print_r($result);
} catch (\Exception $e) {
echo "$e\n";
}
### 上传文件流
try {
$result = $cosClient->Upload(
$bucket = $bucket,
$key = $key,
$body = fopen($local_path, 'rb'));
print_r($result);
} catch (\Exception $e) {
echo "$e\n";
}
### 设置header和meta
try {
$result = $cosClient->Upload(
$bucket= $bucket,
$key = $key,
$body = fopen($local_path, 'rb'),
$options = array(
'ACL' => 'string',
'CacheControl' => 'string',
'ContentDisposition' => 'string',
'ContentEncoding' => 'string',
'ContentLanguage' => 'string',
'ContentLength' => integer,
'ContentType' => 'string',
'Expires' => 'mixed type: string (date format)|int (unix timestamp)|\DateTime',
'Metadata' => array(
'string' => 'string',
),
'StorageClass' => 'string'));
print_r($result);
} catch (\Exception $e) {
echo "$e\n";
}
```
### 下载文件
- 使用 getObject 接口下载文件
- 使用 getObjectUrl 接口获取文件下载 URL
```php
# 下载文件
## getObject(下载文件)
### 下载到内存
//bucket 的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
try {
$result = $cosClient->getObject(array(
'Bucket' => $bucket,
'Key' => $key));
echo($result['Body']);
} catch (\Exception $e) {
echo "$e\n";
}
### 下载到本地
try {
$result = $cosClient->getObject(array(
'Bucket' => $bucket,
'Key' => $key,
'SaveAs' => $local_path));
} catch (\Exception $e) {
echo "$e\n";
}
### 指定下载范围
/*
* Range 字段格式为 'bytes=a-b'
*/
try {
$result = $cosClient->getObject(array(
'Bucket' => $bucket,
'Key' => $key,
'Range' => 'bytes=0-10',
'SaveAs' => $local_path));
} catch (\Exception $e) {
echo "$e\n";
}
### 设置返回header
try {
$result = $cosClient->getObject(array(
'Bucket' => $bucket,
'Key' => $key,
'ResponseCacheControl' => 'string',
'ResponseContentDisposition' => 'string',
'ResponseContentEncoding' => 'string',
'ResponseContentLanguage' => 'string',
'ResponseContentType' => 'string',
'ResponseExpires' => 'mixed type: string (date format)|int (unix timestamp)|\DateTime',
'SaveAs' => $local_path));
} catch (\Exception $e) {
echo "$e\n";
}
## getObjectUrl(获取文件UrL)
try {
$signedUrl = $cosClient->getObjectUrl($bucket, $key, '+10 minutes');
echo $signedUrl;
} catch (\Exception $e) {
print_r($e);
}
```

View File

@@ -0,0 +1,91 @@
cos-php-sdk-v5 Upgrade Guide
====================
2.0.6 to 2.0.7
----------
- Fix presigned url when using tmpSecretId/tmpSecretKey/Token
2.0.6 to 2.0.7
----------
- Fix response of `ListParts`
2.0.5 to 2.0.6
----------
- Support Domain
- Add Select Object Content Interface
- Add Traffic Limit
- Fix bug of object endswith /
2.0.4 to 2.0.5
----------
- Fix bug when upload object with metadata
2.0.3 to 2.0.4
----------
- Fix bug when using ip-port
2.0.2 to 2.0.3
----------
- Fix path parse bug with /0/
2.0.1 to 2.0.2
----------
- Fix bug of `putObject` with `fopen`
- Add ut
2.0.0 to 2.0.1
----------
- Add interface of inventory/tagging/logging
- Fix bug of some interface with query string
1.3 to 2.0
----------
cos-php-sdk-v5 now uses [GuzzleHttp] for HTTP message.
Due to fact, it depending on PHP >= 5.6.
- Use the `Qcloud\Cos\Client\getPresignetUrl()` method instead of the `Qcloud\Cos\Command\createPresignedUrl()`
v2:
```php
$signedUrl = $cosClient->getPresignetUrl($method='putObject',
$args=['Bucket'=>'examplebucket-1250000000', 'Key'=>'exampleobject', 'Body'=>''],
$expires='+30 minutes');
```
v1:
```php
$command = $cosClient->getCommand('putObject', array(
'Bucket' => "examplebucket-1250000000",
'Key' => "exampleobject",
'Body' => '',
));
$signedUrl = $command->createPresignedUrl('+30 minutes');
```
- `$copSource` parameters of the `Qcloud\Cos\Client\Copy` interface are no longer compatible with older versions.
v2:
```php
$result = $cosClient->copy(
$bucket = '<srcBucket>',
$Key = '<srcKey>',
$copySorce = array(
'Region' => '<sourceRegion>',
'Bucket' => '<sourceBucket>',
'Key' => '<sourceKey>',
)
);
```
v1:
```php
$result = $cosClient->Copy(
$bucket = '<srcBucket>',
$key = '<srcKey>',
$copysource = '<sourceBucket>.cos.<sourceRegion>.myqcloud.com/<sourceKey>'
);
```
- Now when uploading files with using `open()` to upload stream, if the local file does not exist, a 0 byte file will be uploaded without throwing an exception, only a warning.

View File

@@ -0,0 +1,28 @@
{
"name": "qcloud/cos-sdk-v5",
"description": "PHP SDK for QCloud COS",
"keywords": [
"qcloud", "cos", "php"
],
"license": "MIT",
"authors": [
{
"name": "yaozongyou",
"email": "yaozongyou@vip.qq.com"
},
{
"name": "lewzylu",
"email": "327874225@qq.com"
}
],
"autoload": {
"psr-0": {
"Qcloud\\Cos\\": "src/"
}
},
"require": {
"php": ">=5.3.0",
"guzzlehttp/guzzle": "~6.3",
"guzzlehttp/guzzle-services": "~1.1"
}
}

412
core/api/Qcos/composer.lock generated Normal file
View File

@@ -0,0 +1,412 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "e5931de83ca09b7727a3285fbe93fa63",
"packages": [
{
"name": "guzzlehttp/command",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/command.git",
"reference": "2aaa2521a8f8269d6f5dfc13fe2af12c76921034"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/command/zipball/2aaa2521a8f8269d6f5dfc13fe2af12c76921034",
"reference": "2aaa2521a8f8269d6f5dfc13fe2af12c76921034",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.2",
"guzzlehttp/promises": "~1.3",
"guzzlehttp/psr7": "~1.0",
"php": ">=5.5.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0|~5.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.9-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Command\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
}
],
"description": "Provides the foundation for building command-based web service clients",
"time": "2016-11-24T13:34:15+00:00"
},
{
"name": "guzzlehttp/guzzle",
"version": "6.5.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.6.1",
"php": ">=5.5"
},
"require-dev": {
"ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
"psr/log": "^1.1"
},
"suggest": {
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "6.5-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Guzzle is a PHP HTTP client library",
"homepage": "http://guzzlephp.org/",
"keywords": [
"client",
"curl",
"framework",
"http",
"http client",
"rest",
"web service"
],
"time": "2019-12-23T11:57:10+00:00"
},
{
"name": "guzzlehttp/guzzle-services",
"version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle-services.git",
"reference": "9e3abf20161cbf662d616cbb995f2811771759f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle-services/zipball/9e3abf20161cbf662d616cbb995f2811771759f7",
"reference": "9e3abf20161cbf662d616cbb995f2811771759f7",
"shasum": ""
},
"require": {
"guzzlehttp/command": "~1.0",
"guzzlehttp/guzzle": "^6.2",
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "~4.0"
},
"suggest": {
"gimler/guzzle-description-loader": "^0.0.4"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Command\\Guzzle\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
},
{
"name": "Stefano Kowalke",
"email": "blueduck@mail.org",
"homepage": "https://github.com/konafets"
}
],
"description": "Provides an implementation of the Guzzle Command library that uses Guzzle service descriptions to describe web services, serialize requests, and parse responses into easy to use model structures.",
"time": "2017-10-06T14:32:02+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "v1.3.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"shasum": ""
},
"require": {
"php": ">=5.5.0"
},
"require-dev": {
"phpunit/phpunit": "^4.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Guzzle promises library",
"keywords": [
"promise"
],
"time": "2016-12-20T10:07:11+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
},
"suggest": {
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.6-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Schultze",
"homepage": "https://github.com/Tobion"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
"time": "2019-07-01T23:21:34+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/ralouphie/getallheaders.git",
"reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
"autoload": {
"files": [
"src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Khattar",
"email": "ralph.khattar@gmail.com"
}
],
"description": "A polyfill for getallheaders.",
"time": "2019-03-08T08:55:37+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=5.3.0"
},
"platform-dev": []
}

2
core/api/Qcos/index.php Normal file
View File

@@ -0,0 +1,2 @@
<?php
require dirname(__FILE__) . '/vendor/autoload.php';

15
core/api/Qcos/phpunit.xml Normal file
View File

@@ -0,0 +1,15 @@
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="cos">
<directory>src/Qcloud/Cos/Tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-clover" target="clover.xml"/>
</logging>
</phpunit>

View File

@@ -0,0 +1,54 @@
<?php
require dirname(__FILE__) . '/../vendor/autoload.php';
$secretId = "COS_SECRETID"; //"云 API 密钥 SecretId";
$secretKey = "COS_SECRETKEY"; //"云 API 密钥 SecretKey";
$region = "ap-beijing"; //设置一个默认的存储桶地域
$cosClient = new Qcloud\Cos\Client(array(
'region' => $region,
'schema' => 'https', //协议头部默认为http
'credentials'=> array(
'secretId' => $secretId ,
'secretKey' => $secretKey
)
));
try {
$result = $cosClient->selectObjectContent(array(
'Bucket' => $bucket, //格式BucketName-APPID
'Key' => $key,
'Expression' => 'Select * from COSObject s',
'ExpressionType' => 'SQL',
'InputSerialization' => array(
'CompressionType' => 'None',
'CSV' => array(
'FileHeaderInfo' => 'NONE',
'RecordDelimiter' => '\n',
'FieldDelimiter' => ',',
'QuoteEscapeCharacter' => '"',
'Comments' => '#',
'AllowQuotedRecordDelimiter' => 'FALSE'
)
),
'OutputSerialization' => array(
'CSV' => array(
'QuoteField' => 'ASNEEDED',
'RecordDelimiter' => '\n',
'FieldDelimiter' => ',',
'QuoteCharacter' => '"',
'QuoteEscapeCharacter' => '"'
)
),
'RequestProgress' => array(
'Enabled' => 'FALSE'
)
));
// 请求成功
foreach ($result['Data'] as $data) {
// 迭代遍历select结果
print_r($data);
}
} catch (\Exception $e) {
// 请求失败
echo($e);
}

View File

@@ -0,0 +1,281 @@
<?php
namespace Qcloud\Cos;
include("Common.php");
use Qcloud\Cos\Signature;
use GuzzleHttp\Client as HttpClient;
use GuzzleHttp\HandlerStack;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Command\Guzzle\Description;
use GuzzleHttp\Command\Guzzle\GuzzleClient;
use GuzzleHttp\Command\Guzzle\Deserializer;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Command\Exception\CommandException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7;
use GuzzleHttp\Pool;
class Client extends GuzzleClient {
const VERSION = '2.0.8';
public $httpClient;
private $api;
private $desc;
private $action;
private $operation;
private $cosConfig;
private $signature;
private $rawCosConfig;
public function __construct($cosConfig) {
$this->rawCosConfig = $cosConfig;
$this->cosConfig['schema'] = isset($cosConfig['schema']) ? $cosConfig['schema'] : 'http';
$this->cosConfig['region'] = region_map($cosConfig['region']);
$this->cosConfig['appId'] = isset($cosConfig['credentials']['appId']) ? $cosConfig['credentials']['appId'] : null;
$this->cosConfig['secretId'] = isset($cosConfig['credentials']['secretId']) ? $cosConfig['credentials']['secretId'] : "";
$this->cosConfig['secretKey'] = isset($cosConfig['credentials']['secretKey']) ? $cosConfig['credentials']['secretKey'] : "";
$this->cosConfig['anonymous'] = isset($cosConfig['credentials']['anonymous']) ? $cosConfig['anonymous']['anonymous'] : false;
$this->cosConfig['token'] = isset($cosConfig['credentials']['token']) ? $cosConfig['credentials']['token'] : null;
$this->cosConfig['timeout'] = isset($cosConfig['timeout']) ? $cosConfig['timeout'] : 3600;
$this->cosConfig['connect_timeout'] = isset($cosConfig['connect_timeout']) ? $cosConfig['connect_timeout'] : 3600;
$this->cosConfig['ip'] = isset($cosConfig['ip']) ? $cosConfig['ip'] : null;
$this->cosConfig['port'] = isset($cosConfig['port']) ? $cosConfig['port'] : null;
$this->cosConfig['endpoint'] = isset($cosConfig['endpoint']) ? $cosConfig['endpoint'] : 'myqcloud.com';
$this->cosConfig['domain'] = isset($cosConfig['domain']) ? $cosConfig['domain'] : null;
$this->cosConfig['proxy'] = isset($cosConfig['proxy']) ? $cosConfig['proxy'] : null;
$this->cosConfig['userAgent'] = isset($cosConfig['userAgent']) ? $cosConfig['userAgent'] : 'cos-php-sdk-v5.'. Client::VERSION;
$this->cosConfig['pathStyle'] = isset($cosConfig['pathStyle']) ? $cosConfig['pathStyle'] : false;
$service = Service::getService();
$handler = HandlerStack::create();
$handler->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request->withHeader('User-Agent', $this->cosConfig['userAgent']);
}));
if ($this->cosConfig['anonymous'] != true) {
$handler->push($this::handleSignature($this->cosConfig['secretId'], $this->cosConfig['secretKey']));
}
if ($this->cosConfig['token'] != null) {
$handler->push(Middleware::mapRequest(function (RequestInterface $request) {
return $request->withHeader('x-cos-security-token', $this->cosConfig['token']);
}));
}
$handler->push($this::handleErrors());
$this->signature = new Signature($this->cosConfig['secretId'], $this->cosConfig['secretKey'], $this->cosConfig['token']);
$this->httpClient = new HttpClient([
'base_uri' => $this->cosConfig['schema'].'://cos.' . $this->cosConfig['region'] . '.myqcloud.com/',
'timeout' => $this->cosConfig['timeout'],
'handler' => $handler,
'proxy' => $this->cosConfig['proxy'],
]);
$this->desc = new Description($service);
$this->api = (array)($this->desc->getOperations());
parent::__construct($this->httpClient, $this->desc, [$this,
'commandToRequestTransformer'], [$this, 'responseToResultTransformer'],
null);
}
public function commandToRequestTransformer(CommandInterface $command)
{
$this->action = $command->GetName();
$this->operation = $this->api[$this->action];
$transformer = new CommandToRequestTransformer($this->cosConfig, $this->operation);
$seri = new Serializer($this->desc);
$request = $seri($command);
$request = $transformer->bucketStyleTransformer($command, $request);
$request = $transformer->uploadBodyTransformer($command, $request);
$request = $transformer->metadataTransformer($command, $request);
$request = $transformer->md5Transformer($command, $request);
$request = $transformer->specialParamTransformer($command, $request);
return $request;
}
public function responseToResultTransformer(ResponseInterface $response, RequestInterface $request, CommandInterface $command)
{
$transformer = new ResultTransformer($this->cosConfig, $this->operation);
$transformer->writeDataToLocal($command, $request, $response);
$deseri = new Deserializer($this->desc, true);
$result = $deseri($response, $request, $command);
$result = $transformer->metaDataTransformer($command, $response, $result);
$result = $transformer->extraHeadersTransformer($command, $request, $result);
$result = $transformer->selectContentTransformer($command, $result);
return $result;
}
public function __destruct() {
}
public function __call($method, array $args) {
try {
return parent::__call(ucfirst($method), $args);
} catch (CommandException $e) {
$previous = $e->getPrevious();
if ($previous !== null) {
throw $previous;
} else {
throw $e;
}
}
}
public function getApi() {
return $this->api;
}
private function getCosConfig() {
return $this->cosConfig;
}
private function createPresignedUrl(RequestInterface $request, $expires) {
return $this->signature->createPresignedUrl($request, $expires);
}
public function getthumwaterUrl($method, $args=array(), $expires = null){
$command = $this->getCommand($method, $args);
$request = $this->commandToRequestTransformer($command);
return $this->createPresignedUrl($request, $expires);
}
public function getPresignetUrl($method, $args, $expires = null) {
$command = $this->getCommand($method, $args);
$request = $this->commandToRequestTransformer($command);
return $this->createPresignedUrl($request, $expires);
}
public function getObjectUrl($bucket, $key, $expires = null, array $args = array()) {
$command = $this->getCommand('GetObject', $args + array('Bucket' => $bucket, 'Key' => $key));
$request = $this->commandToRequestTransformer($command);
return $this->createPresignedUrl($request, $expires)->__toString();
}
public function upload($bucket, $key, $body, $options = array()) {
$body = Psr7\stream_for($body);
$options['PartSize'] = isset($options['PartSize']) ? $options['PartSize'] : MultipartUpload::MIN_PART_SIZE;
if ($body->getSize() < $options['PartSize']) {
$rt = $this->putObject(array(
'Bucket' => $bucket,
'Key' => $key,
'Body' => $body,
) + $options);
}
else {
$multipartUpload = new MultipartUpload($this, $body, array(
'Bucket' => $bucket,
'Key' => $key,
) + $options);
$rt = $multipartUpload->performUploading();
}
return $rt;
}
public function resumeUpload($bucket, $key, $body, $uploadId, $options = array()) {
$body = Psr7\stream_for($body);
$options['PartSize'] = isset($options['PartSize']) ? $options['PartSize'] : MultipartUpload::DEFAULT_PART_SIZE;
$multipartUpload = new MultipartUpload($this, $body, array(
'Bucket' => $bucket,
'Key' => $key,
'UploadId' => $uploadId,
) + $options);
$rt = $multipartUpload->resumeUploading();
return $rt;
}
public function copy($bucket, $key, $copySource, $options = array()) {
$options['PartSize'] = isset($options['PartSize']) ? $options['PartSize'] : Copy::DEFAULT_PART_SIZE;
// set copysource client
$sourceConfig = $this->rawCosConfig;
$sourceConfig['region'] = $copySource['Region'];
$cosSourceClient = new Client($sourceConfig);
$copySource['VersionId'] = isset($copySource['VersionId']) ? $copySource['VersionId'] : "";
try {
$rt = $cosSourceClient->headObject(
array('Bucket'=>$copySource['Bucket'],
'Key'=>$copySource['Key'],
'VersionId'=>$copySource['VersionId'],
)
);
} catch (\Exception $e) {
throw $e;
}
$contentLength =$rt['ContentLength'];
// sample copy
if ($contentLength < $options['PartSize']) {
$rt = $this->copyObject(array(
'Bucket' => $bucket,
'Key' => $key,
'CopySource' => $copySource['Bucket']. '.cos.'. $copySource['Region'].
".myqcloud.com/". $copySource['Key']. "?versionId=". $copySource['VersionId'],
) + $options
);
return $rt;
}
// multi part copy
$copySource['ContentLength'] = $contentLength;
$copy = new Copy($this, $copySource, array(
'Bucket' => $bucket,
'Key' => $key
) + $options
);
return $copy->copy();
}
public function doesBucketExist($bucket, array $options = array())
{
try {
$this->HeadBucket(array(
'Bucket' => $bucket));
return True;
} catch (\Exception $e){
return False;
}
}
public function doesObjectExist($bucket, $key, array $options = array())
{
try {
$this->HeadObject(array(
'Bucket' => $bucket,
'Key' => $key));
return True;
} catch (\Exception $e){
return False;
}
}
public static function explodeKey($key) {
// Remove a leading slash if one is found
$split_key = explode('/', $key && $key[0] == '/' ? substr($key, 1) : $key);
// Remove empty element
$split_key = array_filter($split_key, function($var) {
return !($var == '' || $var == null);
});
$final_key = implode("/", $split_key);
if (substr($key, -1) == '/') {
$final_key = $final_key . '/';
}
return $final_key;
}
public static function handleSignature($secretId, $secretKey) {
return function (callable $handler) use ($secretId, $secretKey) {
return new SignatureMiddleware($handler, $secretId, $secretKey);
};
}
public static function handleErrors() {
return function (callable $handler) {
return new ExceptionMiddleware($handler);
};
}
}

View File

@@ -0,0 +1,162 @@
<?php
namespace Qcloud\Cos;
use Guzzle\Service\Description\Parameter;
use Guzzle\Service\Description\ServiceDescription;
use GuzzleHttp\HandlerStack;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Qcloud\Cos\Signature;
use GuzzleHttp\Command\Guzzle\Description;
use GuzzleHttp\Command\Guzzle\GuzzleClient;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7;
use GuzzleHttp\Psr7\Uri;
use InvalidArgumentException;
class CommandToRequestTransformer {
private $config;
private $operation;
public function __construct($config ,$operation) {
$this->config = $config;
$this->operation = $operation;
}
// format bucket style
public function bucketStyleTransformer(CommandInterface $command, RequestInterface $request) {
$action = $command->getName();
if ($action == 'ListBuckets') {
return $request->withUri(new Uri($this->config['schema']."://service.cos.myqcloud.com/"));
}
$operation = $this->operation;
$bucketname = $command['Bucket'];
$appId = $this->config['appId'];
if ($appId != null && endWith($bucketname, '-'.$appId) == False)
{
$bucketname = $bucketname.'-'.$appId;
}
$command['Bucket'] = $bucketname;
$path = '';
$http_method = $operation['httpMethod'];
$uri = $operation['uri'];
// Hoststyle is used by default
// Pathstyle
if ($this->config['pathStyle'] != true) {
if (isset($operation['parameters']['Bucket']) && $command->hasParam('Bucket')) {
$uri = str_replace("{Bucket}", '', $uri);
}
if (isset($operation['parameters']['Key']) && $command->hasParam('Key')) {
$uri = str_replace("{/Key*}", encodeKey($command['Key']), $uri);
}
}
$origin_host = $bucketname. '.cos.' . $this->config['region'] . '.' . $this->config['endpoint'];
// domain
if ($this->config['domain'] != null) {
$origin_host = $this->config['domain'];
}
$host = $origin_host;
if ($this->config['ip'] != null) {
$host = $this->config['ip'];
if ($this->config['port'] != null) {
$host = $this->config['ip'] . ":" . $this->config['port'];
}
}
$path = $this->config['schema'].'://'. $host . $uri;
$uri = new Uri($path);
$query = $request->getUri()->getQuery();
if ($uri->getQuery() != $query && $uri->getQuery() != "") {
$query = $uri->getQuery() . "&" . $request->getUri()->getQuery();
}
$uri = $uri->withQuery($query);
$request = $request->withUri($uri);
$request = $request->withHeader('Host', $origin_host);
return $request;
}
// format upload body
public function uploadBodyTransformer(CommandInterface $command, $request, $bodyParameter = 'Body', $sourceParameter = 'SourceFile') {
$operation = $this->operation;
if (!isset($operation['parameters']['Body'])) {
return $request;
}
$source = isset($command[$sourceParameter]) ? $command[$sourceParameter] : null;
$body = isset($command[$bodyParameter]) ? $command[$bodyParameter] : null;
// If a file path is passed in then get the file handle
if (is_string($source) && file_exists($source)) {
$body = fopen($source, 'rb');
}
// Prepare the body parameter and remove the source file parameter
if (null !== $body) {
return $request;
} else {
throw new InvalidArgumentException(
"You must specify a non-null value for the {$bodyParameter} or {$sourceParameter} parameters.");
}
}
// update md5
public function md5Transformer(CommandInterface $command, $request) {
$operation = $this->operation;
if (isset($operation['data']['contentMd5'])) {
$request = $this->addMd5($request);
}
if (isset($operation['parameters']['ContentMD5']) &&
isset($command['ContentMD5'])) {
$value = $command['ContentMD5'];
if ($value === true) {
$request = $this->addMd5($request);
}
}
return $request;
}
// add meta
public function metadataTransformer(CommandInterface $command, $request) {
$operation = $this->operation;
if (isset($command['Metadata'])) {
$meta = $command['Metadata'];
foreach ($meta as $key => $value) {
$request = $request->withHeader('x-cos-meta-' . $key, $value);
}
}
return $request;
}
// count md5
private function addMd5($request) {
$body = $request->getBody();
if ($body && $body->getSize() > 0) {
$md5 = base64_encode(md5($body, true));
return $request->withHeader('Content-MD5', $md5);
}
return $request;
}
// inventoryId
public function specialParamTransformer(CommandInterface $command, $request) {
$action = $command->getName();
if ($action == 'PutBucketInventory') {
$id = $command['Id'];
$uri = $request->getUri();
$query = $uri->getQuery();
$uri = $uri->withQuery($query . "&Id=".$id);
return $request->withUri($uri);
}
return $request;
}
public function __destruct() {
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Qcloud\Cos;
function region_map($region) {
$regionmap = array('cn-east'=>'ap-shanghai',
'cn-south'=>'ap-guangzhou',
'cn-north'=>'ap-beijing-1',
'cn-south-2'=>'ap-guangzhou-2',
'cn-southwest'=>'ap-chengdu',
'sg'=>'ap-singapore',
'tj'=>'ap-beijing-1',
'bj'=>'ap-beijing',
'sh'=>'ap-shanghai',
'gz'=>'ap-guangzhou',
'cd'=>'ap-chengdu',
'sgp'=>'ap-singapore');
if (array_key_exists($region, $regionmap)) {
return $regionmap[$region];
}
return $region;
}
function encodeKey($key) {
return str_replace('%2F', '/', rawurlencode($key));
}
function endWith($haystack, $needle) {
$length = strlen($needle);
if($length == 0)
{
return true;
}
return (substr($haystack, -$length) === $needle);
}

View File

@@ -0,0 +1,144 @@
<?php
namespace Qcloud\Cos;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Pool;
class Copy {
/**
* const var: part size from 1MB to 5GB, and max parts of 10000 are allowed for each upload.
*/
const MIN_PART_SIZE = 1048576;
const MAX_PART_SIZE = 5368709120;
const DEFAULT_PART_SIZE = 52428800;
const MAX_PARTS = 10000;
private $client;
private $copySource;
private $options;
private $partSize;
private $parts;
private $size;
private $commandList = [];
private $requestList = [];
public function __construct($client, $source, $options = array()) {
$minPartSize = $options['PartSize'];
unset($options['PartSize']);
$this->client = $client;
$this->copySource = $source;
$this->options = $options;
$this->size = $source['ContentLength'];
unset($source['ContentLength']);
$this->partSize = $this->calculatePartSize($minPartSize);
$this->concurrency = isset($options['Concurrency']) ? $options['Concurrency'] : 10;
$this->retry = isset($options['Retry']) ? $options['Retry'] : 5;
}
public function copy() {
$uploadId= $this->initiateMultipartUpload();
for ($i = 0; $i < $this->retry; $i += 1) {
$rt = $this->uploadParts($uploadId);
if ($rt == 0) {
break;
}
sleep(1 << $i);
}
foreach ( $this->parts as $key => $row ){
$num1[$key] = $row ['PartNumber'];
$num2[$key] = $row ['ETag'];
}
array_multisort($num1, SORT_ASC, $num2, SORT_ASC, $this->parts);
return $this->client->completeMultipartUpload(array(
'Bucket' => $this->options['Bucket'],
'Key' => $this->options['Key'],
'UploadId' => $uploadId,
'Parts' => $this->parts)
);
}
public function uploadParts($uploadId) {
$copyRequests = function ($uploadId) {
$offset = 0;
$partNumber = 1;
$partSize = $this->partSize;
$finishedNum = 0;
$this->parts = array();
for ($index = 1; ; $index ++) {
if ($offset + $partSize >= $this->size)
{
$partSize = $this->size - $offset;
}
$copySourcePath = $this->copySource['Bucket']. '.cos.'. $this->copySource['Region'].
".myqcloud.com/". $this->copySource['Key']. "?versionId=". $this->copySource['VersionId'];
$params = array(
'Bucket' => $this->options['Bucket'],
'Key' => $this->options['Key'],
'UploadId' => $uploadId,
'PartNumber' => $partNumber,
'CopySource'=> $copySourcePath,
'CopySourceRange' => 'bytes='.((string)$offset).'-'.(string)($offset+$partSize - 1),
);
if(!isset($parts[$partNumber])) {
$command = $this->client->getCommand('uploadPartCopy', $params);
$request = $this->client->commandToRequestTransformer($command);
$this->commandList[$index] = $command;
$this->requestList[$index] = $request;
yield $request;
}
++$partNumber;
$offset += $partSize;
if ($this->size == $offset) {
break;
}
}
};
$pool = new Pool($this->client->httpClient, $copyRequests($uploadId), [
'concurrency' => $this->concurrency,
'fulfilled' => function ($response, $index) {
$index = $index + 1;
$response = $this->client->responseToResultTransformer($response, $this->requestList[$index], $this->commandList[$index]);
$part = array('PartNumber' => $index, 'ETag' => $response['ETag']);
$this->parts[$index] = $part;
},
'rejected' => function ($reason, $index) {
$retry = 2;
for ($i = 1; $i <= $retry; $i++) {
$index = $index += 1;
try {
$rt =$this->client->execute($commandList[$index]);
$part = array('PartNumber' => $index, 'ETag' => $rt['ETag']);
$this->parts[$index] = $part;
} catch(Exception $e) {
if ($i == $retry) {
throw($e);
}
}
}
},
]);
// Initiate the transfers and create a promise
$promise = $pool->promise();
// Force the pool of requests to complete.
$promise->wait();
}
private function calculatePartSize($minPartSize)
{
$partSize = intval(ceil(($this->size / self::MAX_PARTS)));
$partSize = max($minPartSize, $partSize);
$partSize = min($partSize, self::MAX_PART_SIZE);
$partSize = max($partSize, self::MIN_PART_SIZE);
return $partSize;
}
private function initiateMultipartUpload() {
$result = $this->client->createMultipartUpload($this->options);
return $result['UploadId'];
}
}

View File

@@ -0,0 +1,162 @@
<?php
namespace Qcloud\Cos;
use Guzzle\Service\Description\Parameter;
use Guzzle\Service\Description\ServiceDescription;
use GuzzleHttp\HandlerStack;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Qcloud\Cos\Signature;
use GuzzleHttp\Command\Guzzle\Description;
use GuzzleHttp\Command\Guzzle\GuzzleClient;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7;
use GuzzleHttp\Psr7\Uri;
use InvalidArgumentException;
class CosTransformer {
private $config;
private $operation;
public function __construct($config ,$operation) {
$this->config = $config;
$this->operation = $operation;
}
// format bucket style
public function bucketStyleTransformer(CommandInterface $command, RequestInterface $request) {
$action = $command->getName();
if ($action == 'ListBuckets') {
return $request->withUri(new Uri($this->config['schema']."://service.cos.myqcloud.com/"));
}
$operation = $this->operation;
$bucketname = $command['Bucket'];
$appId = $this->config['appId'];
if ($appId != null && endWith($bucketname, '-'.$appId) == False)
{
$bucketname = $bucketname.'-'.$appId;
}
$command['Bucket'] = $bucketname;
$path = '';
$http_method = $operation['httpMethod'];
$uri = $operation['uri'];
// Hoststyle is used by default
// Pathstyle
if ($this->config['pathStyle'] != true) {
if (isset($operation['parameters']['Bucket']) && $command->hasParam('Bucket')) {
$uri = str_replace("{Bucket}", '', $uri);
}
if (isset($operation['parameters']['Key']) && $command->hasParam('Key')) {
$uri = str_replace("{/Key*}", encodeKey($command['Key']), $uri);
}
}
$origin_host = $bucketname. '.cos.' . $this->config['region'] . '.' . $this->config['endpoint'];
// domain
if ($this->config['domain'] != null) {
$origin_host = $this->config['domain'];
}
$host = $origin_host;
if ($this->config['ip'] != null) {
$host = $this->config['ip'];
if ($this->config['port'] != null) {
$host = $this->config['ip'] . ":" . $this->config['port'];
}
}
$path = $this->config['schema'].'://'. $host . $uri;
$uri = new Uri($path);
$query = $request->getUri()->getQuery();
if ($uri->getQuery() != $query && $uri->getQuery() != "") {
$query = $uri->getQuery() . "&" . $request->getUri()->getQuery();
}
$uri = $uri->withQuery($query);
$request = $request->withUri($uri);
$request = $request->withHeader('Host', $origin_host);
return $request;
}
// format upload body
public function uploadBodyTransformer(CommandInterface $command, $request, $bodyParameter = 'Body', $sourceParameter = 'SourceFile') {
$operation = $this->operation;
if (!isset($operation['parameters']['Body'])) {
return $request;
}
$source = isset($command[$sourceParameter]) ? $command[$sourceParameter] : null;
$body = isset($command[$bodyParameter]) ? $command[$bodyParameter] : null;
// If a file path is passed in then get the file handle
if (is_string($source) && file_exists($source)) {
$body = fopen($source, 'rb');
}
// Prepare the body parameter and remove the source file parameter
if (null !== $body) {
return $request;
} else {
throw new InvalidArgumentException(
"You must specify a non-null value for the {$bodyParameter} or {$sourceParameter} parameters.");
}
}
// update md5
public function md5Transformer(CommandInterface $command, $request) {
$operation = $this->operation;
if (isset($operation['data']['contentMd5'])) {
$request = $this->addMd5($request);
}
if (isset($operation['parameters']['ContentMD5']) &&
isset($command['ContentMD5'])) {
$value = $command['ContentMD5'];
if ($value === true) {
$request = $this->addMd5($request);
}
}
return $request;
}
// add meta
public function metadataTransformer(CommandInterface $command, $request) {
$operation = $this->operation;
if (isset($command['Metadata'])) {
$meta = $command['Metadata'];
foreach ($meta as $key => $value) {
$request = $request->withHeader('x-cos-meta-' . $key, $value);
}
}
return $request;
}
// count md5
private function addMd5($request) {
$body = $request->getBody();
if ($body && $body->getSize() > 0) {
$md5 = base64_encode(md5($body, true));
return $request->withHeader('Content-MD5', $md5);
}
return $request;
}
// inventoryId
public function specialParamTransformer(CommandInterface $command, $request) {
$action = $command->getName();
if ($action == 'PutBucketInventory') {
$id = $command['Id'];
$uri = $request->getUri();
$query = $uri->getQuery();
$uri = $uri->withQuery($query . "&Id=".$id);
return $request->withUri($uri);
}
return $request;
}
public function __destruct() {
}
}

View File

@@ -0,0 +1,7 @@
<?php
namespace Qcloud\Cos\Exception;
use Qcloud\Cos\Exception\ServiceResponseException;
class CosException extends ServiceResponseException {}

View File

@@ -0,0 +1,189 @@
<?php
namespace Qcloud\Cos\Exception;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
class ServiceResponseException extends \RuntimeException {
/**
* @var Response Response
*/
protected $response;
/**
* @var RequestInterface Request
*/
protected $request;
/**
* @var string Request ID
*/
protected $requestId;
/**
* @var string Exception type (client / server)
*/
protected $exceptionType;
/**
* @var string Exception code
*/
protected $exceptionCode;
/**
* Set the exception code
*
* @param string $code Exception code
*/
public function setExceptionCode($code) {
$this->exceptionCode = $code;
}
/**
* Get the exception code
*
* @return string|null
*/
public function getExceptionCode() {
return $this->exceptionCode;
}
/**
* Set the exception type
*
* @param string $type Exception type
*/
public function setExceptionType($type) {
$this->exceptionType = $type;
}
/**
* Get the exception type (one of client or server)
*
* @return string|null
*/
public function getExceptionType() {
return $this->exceptionType;
}
/**
* Set the request ID
*
* @param string $id Request ID
*/
public function setRequestId($id) {
$this->requestId = $id;
}
/**
* Get the Request ID
*
* @return string|null
*/
public function getRequestId() {
return $this->requestId;
}
/**
* Set the associated response
*
* @param Response $response Response
*/
public function setResponse(ResponseInterface $response) {
$this->response = $response;
}
/**
* Get the associated response object
*
* @return Response|null
*/
public function getResponse() {
return $this->response;
}
/**
* Set the associated request
*
* @param RequestInterface $request
*/
public function setRequest(RequestInterface $request) {
$this->request = $request;
}
/**
* Get the associated request object
*
* @return RequestInterface|null
*/
public function getRequest() {
return $this->request;
}
/**
* Get the status code of the response
*
* @return int|null
*/
public function getStatusCode() {
return $this->response ? $this->response->getStatusCode() : null;
}
/**
* Cast to a string
*
* @return string
*/
public function __toString() {
$message = get_class($this) . ': '
. 'Cos Error Code: ' . $this->getExceptionCode() . ', '
. 'Status Code: ' . $this->getStatusCode() . ', '
. 'Cos Request ID: ' . $this->getRequestId() . ', '
. 'Cos Error Type: ' . $this->getExceptionType() . ', '
. 'Cos Error Message: ' . $this->getMessage();
// Add the User-Agent if available
if ($this->request) {
$message .= ', ' . 'User-Agent: ' . $this->request->getHeader('User-Agent')[0];
}
return $message;
}
/**
* Get the request ID of the error. This value is only present if a
* response was received, and is not present in the event of a networking
* error.
*
* Same as `getRequestId()` method, but matches the interface for SDKv3.
*
* @return string|null Returns null if no response was received
*/
public function getCosRequestId() {
return $this->requestId;
}
/**
* Get the Cos error type.
*
* Same as `getExceptionType()` method, but matches the interface for SDKv3.
*
* @return string|null Returns null if no response was received
*/
public function getCosErrorType() {
return $this->exceptionType;
}
/**
* Get the Cos error code.
*
* Same as `getExceptionCode()` method, but matches the interface for SDKv3.
*
* @return string|null Returns null if no response was received
*/
public function getCosErrorCode() {
return $this->exceptionCode;
}
}

View File

@@ -0,0 +1,72 @@
<?php
namespace Qcloud\Cos;
use Qcloud\Cos\Exception\ServiceResponseException;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Psr7;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\RequestException;
class ExceptionMiddleware {
private $nextHandler;
protected $parser;
protected $defaultException;
/**
* @param callable $nextHandler Next handler to invoke.
*/
public function __construct(callable $nextHandler) {
$this->nextHandler = $nextHandler;
$this->parser = new ExceptionParser();
$this->defaultException = 'Qcloud\Cos\Exception\ServiceResponseException';
}
/**
* @param RequestInterface $request
* @param array $options
*
* @return PromiseInterface
*/
public function __invoke(RequestInterface $request, array $options) {
$fn = $this->nextHandler;
return $fn($request, $options)->then(
function (ResponseInterface $response) use ($request) {
return $this->handle($request, $response);
}
);
}
public function handle(RequestInterface $request, ResponseInterface $response) {
$code = $response->getStatusCode();
if ($code < 400) {
return $response;
}
//throw RequestException::create($request, $response);
$parts = $this->parser->parse($request, $response);
$className = 'Qcloud\\Cos\\Exception\\' . $parts['code'];
if (substr($className, -9) !== 'Exception') {
$className .= 'Exception';
}
$className = class_exists($className) ? $className : $this->defaultException;
throw $this->createException($className, $request, $response, $parts);
}
protected function createException($className, RequestInterface $request, ResponseInterface $response, array $parts) {
$class = new $className($parts['message']);
if ($class instanceof ServiceResponseException) {
$class->setExceptionCode($parts['code']);
$class->setExceptionType($parts['type']);
$class->setResponse($response);
$class->setRequest($request);
$class->setRequestId($parts['request_id']);
}
return $class;
}
}

View File

@@ -0,0 +1,112 @@
<?php
namespace Qcloud\Cos;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Parses default XML exception responses
*/
class ExceptionParser {
public function parse(RequestInterface $request, ResponseInterface $response) {
$data = array(
'code' => null,
'message' => null,
//'type' => $response->isClientError() ? 'client' : 'server',
'type' => 'client',
'request_id' => null,
'parsed' => null
);
$body = strval($response->getBody());
if (empty($body)) {
$this->parseHeaders($request, $response, $data);
return $data;
}
try {
$xml = new \SimpleXMLElement(utf8_encode($body));
$this->parseBody($xml, $data);
return $data;
} catch (\Exception $e) {
$data['code'] = 'PhpInternalXmlParseError';
$data['message'] = 'A non-XML response was received';
return $data;
}
}
/**
* Parses additional exception information from the response headers
*
* @param RequestInterface $request Request that was issued
* @param Response $response The response from the request
* @param array $data The current set of exception data
*/
protected function parseHeaders(RequestInterface $request, ResponseInterface $response, array &$data) {
$data['message'] = $response->getStatusCode() . ' ' . $response->getReasonPhrase();
$requestId = $response->getHeader('x-cos-request-id');
if (isset($requestId[0])) {
$requestId = $requestId[0];
$data['request_id'] = $requestId;
$data['message'] .= " (Request-ID: $requestId)";
}
// Get the request
$status = $response->getStatusCode();
$method = $request->getMethod();
// Attempt to determine code for 403s and 404s
if ($status === 403) {
$data['code'] = 'AccessDenied';
} elseif ($method === 'HEAD' && $status === 404) {
$path = explode('/', trim($request->getUri()->getPath(), '/'));
$host = explode('.', $request->getUri()->getHost());
$bucket = (count($host) >= 4) ? $host[0] : array_shift($path);
$object = array_shift($path);
if ($bucket && $object) {
$data['code'] = 'NoSuchKey';
} elseif ($bucket) {
$data['code'] = 'NoSuchBucket';
}
}
}
/**
* Parses additional exception information from the response body
*
* @param \SimpleXMLElement $body The response body as XML
* @param array $data The current set of exception data
*/
protected function parseBody(\SimpleXMLElement $body, array &$data) {
$data['parsed'] = $body;
$namespaces = $body->getDocNamespaces();
if (isset($namespaces[''])) {
// Account for the default namespace being defined and PHP not being able to handle it :(
$body->registerXPathNamespace('ns', $namespaces['']);
$prefix = 'ns:';
} else {
$prefix = '';
}
if ($tempXml = $body->xpath("//{$prefix}Code[1]")) {
$data['code'] = (string) $tempXml[0];
}
if ($tempXml = $body->xpath("//{$prefix}Message[1]")) {
$data['message'] = (string) $tempXml[0];
}
$tempXml = $body->xpath("//{$prefix}RequestId[1]");
if (empty($tempXml)) {
$tempXml = $body->xpath("//{$prefix}RequestID[1]");
}
if (isset($tempXml[0])) {
$data['request_id'] = (string) $tempXml[0];
}
}
}

View File

@@ -0,0 +1,126 @@
<?php
namespace Qcloud\Cos;
use Qcloud\Cos\Exception\CosException;
class MultipartUpload {
/**
* const var: part size from 1MB to 5GB, and max parts of 10000 are allowed for each upload.
*/
const MIN_PART_SIZE = 1048576;
const MAX_PART_SIZE = 5368709120;
const DEFAULT_PART_SIZE = 52428800;
const MAX_PARTS = 10000;
private $client;
private $body;
private $options;
private $partSize;
public function __construct($client, $body, $options = array()) {
$this->client = $client;
$this->body = $body;
$this->options = $options;
$this->partSize = $this->calculatePartSize($options['PartSize']);
unset($options['PartSize']);
}
public function performUploading() {
$rt = $this->initiateMultipartUpload();
$uploadId = $rt['UploadId'];
$partNumber = 1;
$parts = array();
for (;;) {
if ($this->body->eof()) {
break;
}
$body = $this->body->read($this->partSize);
if (empty($body)) {
break;
}
$result = $this->client->uploadPart(array(
'Bucket' => $this->options['Bucket'],
'Key' => $this->options['Key'],
'Body' => $body,
'UploadId' => $uploadId,
'PartNumber' => $partNumber));
if (md5($body) != substr($result['ETag'], 1, -1)){
throw new CosException("ETag check inconsistency");
}
$part = array('PartNumber' => $partNumber, 'ETag' => $result['ETag']);
array_push($parts, $part);
++$partNumber;
}
try {
$rt = $this->client->completeMultipartUpload(array(
'Bucket' => $this->options['Bucket'],
'Key' => $this->options['Key'],
'UploadId' => $uploadId,
'Parts' => $parts));
} catch(\Exception $e){
throw $e;
}
return $rt;
}
public function resumeUploading() {
$uploadId = $this->options['UploadId'];
$rt = $this->client->ListParts(
array('UploadId' => $uploadId,
'Bucket'=>$this->options['Bucket'],
'Key'=>$this->options['Key']));
$parts = array();
if (count($rt['Parts']) > 0) {
foreach ($rt['Parts'] as $part) {
$parts[$part['PartNumber'] - 1] = array('PartNumber' => $part['PartNumber'], 'ETag' => $part['ETag']);
}
}
for ($partNumber = 1;;++$partNumber) {
if ($this->body->eof()) {
break;
}
$body = $this->body->read($this->partSize);
if (array_key_exists($partNumber-1, $parts)){
if (md5($body) != substr($parts[$partNumber-1]['ETag'], 1, -1)){
throw new CosException("ETag check inconsistency");
}
continue;
}
$result = $this->client->uploadPart(array(
'Bucket' => $this->options['Bucket'],
'Key' => $this->options['Key'],
'Body' => $body,
'UploadId' => $uploadId,
'PartNumber' => $partNumber));
if (md5($body) != substr($result['ETag'], 1, -1)){
throw new CosException("ETag check inconsistency");
}
$parts[$partNumber-1] = array('PartNumber' => $partNumber, 'ETag' => $result['ETag']);
}
$rt = $this->client->completeMultipartUpload(array(
'Bucket' => $this->options['Bucket'],
'Key' => $this->options['Key'],
'UploadId' => $uploadId,
'Parts' => $parts));
return $rt;
}
private function calculatePartSize($minPartSize) {
$partSize = intval(ceil(($this->body->getSize() / self::MAX_PARTS)));
$partSize = max($minPartSize, $partSize);
$partSize = min($partSize, self::MAX_PART_SIZE);
$partSize = max($partSize, self::MIN_PART_SIZE);
return $partSize;
}
private function initiateMultipartUpload() {
$result = $this->client->createMultipartUpload($this->options);
return $result;
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace Qcloud\Cos\Request;
use GuzzleHttp\Command\Guzzle\RequestLocation\AbstractLocation;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Command\Guzzle\Parameter;
use GuzzleHttp\Psr7;
use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
/**
* Adds a raw/binary body to a request.
* This is here because: https://github.com/guzzle/guzzle-services/issues/160
*/
class BodyLocation extends AbstractLocation
{
/**
* Set the name of the location
*
* @param string $locationName
*/
public function __construct($locationName = 'body')
{
parent::__construct($locationName);
}
/**
* @param CommandInterface $command
* @param RequestInterface $request
* @param Parameter $param
*
* @return MessageInterface
*/
public function visit(
CommandInterface $command,
RequestInterface $request,
Parameter $param
) {
$value = $request->getBody()->getContents();
if ('' !== $value) {
throw new \RuntimeException('Only one "body" location may exist per operation');
}
// binary string data from bound parameter
$value = $command[$param->getName()];
return $request->withBody(Psr7\stream_for($value));
}
}

View File

@@ -0,0 +1,119 @@
<?php
namespace Qcloud\Cos;
use Guzzle\Service\Description\Parameter;
use Guzzle\Service\Description\ServiceDescription;
use GuzzleHttp\HandlerStack;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Qcloud\Cos\Signature;
use GuzzleHttp\Command\Guzzle\Description;
use GuzzleHttp\Command\Guzzle\GuzzleClient;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Middleware;
use GuzzleHttp\Psr7;
use GuzzleHttp\Psr7\Uri;
use GuzzleHttp\Command\Result;
use InvalidArgumentException;
class ResultTransformer {
private $config;
private $operation;
public function __construct($config, $operation) {
$this->config = $config;
$this->operation = $operation;
}
public function writeDataToLocal(CommandInterface $command, RequestInterface $request, ResponseInterface $response) {
$action = $command->getName();
if ($action == "GetObject") {
if (isset($command['SaveAs'])) {
$fp = fopen($command['SaveAs'], "wb");
fwrite($fp, $response->getBody());
fclose($fp);
}
}
}
public function metaDataTransformer(CommandInterface $command, ResponseInterface $response, Result $result) {
$headers = $response->getHeaders();
$metadata = array();
foreach ($headers as $key => $value) {
if (strpos($key, "x-cos-meta-") === 0) {
$metadata[substr($key, 11)] = $value[0];
}
}
if (!empty($metadata)) {
$result['Metadata'] = $metadata;
}
return $result;
}
public function extraHeadersTransformer(CommandInterface $command, RequestInterface $request, Result $result) {
if ($command['Key'] != null && $result['Key'] == null) {
$result['Key'] = $command['Key'];
}
if ($command['Bucket'] != null && $result['Bucket'] == null) {
$result['Bucket'] = $command['Bucket'];
}
$result['Location'] = $request->getHeader("Host")[0] . $request->getUri()->getPath();
return $result;
}
public function selectContentTransformer(CommandInterface $command, Result $result) {
$action = $command->getName();
if ($action == "SelectObjectContent") {
$result['Data'] = $this->getSelectContents($result);
}
return $result;
}
public function getSelectContents($result) {
$f = $result['RawData'];
while (!$f->eof()) {
$data = array();
$tmp = $f->read(4);
if (empty($tmp)) {
break;
}
$totol_length = (int)(unpack("N", $tmp)[1]);
$headers_length = (int)(unpack("N", $f->read(4))[1]);
$body_length = $totol_length - $headers_length - 16;
$predule_crc = (int)(unpack("N", $f->read(4))[1]);
$headers = array();
for ($offset = 0; $offset < $headers_length;) {
$key_length = (int)(unpack("C", $f->read(1))[1]);
$key = $f->read($key_length);
$head_value_type = (int)(unpack("C", $f->read(1))[1]);
$value_length = (int)(unpack("n", $f->read(2))[1]);
$value = $f->read($value_length);
$offset += 4 + $key_length + $value_length;
if ($key == ":message-type") {
$data['MessageType'] = $value;
}
if ($key == ":event-type") {
$data['EventType'] = $value;
}
if ($key == ":error-code") {
$data['ErrorCode'] = $value;
}
if ($key == ":error-message") {
$data['ErrorMessage'] = $value;
}
}
$body = $f->read($body_length);
$message_crc = (int)(unpack("N", $f->read(4))[1]);
$data['Body'] = $body;
yield $data;
}
}
public function __destruct() {
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace Qcloud\Cos;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Command\Guzzle\SchemaValidator;
use GuzzleHttp\Command\Guzzle\DescriptionInterface;
use GuzzleHttp\Command\Guzzle\Serializer as DefaultSerializer;
use Psr\Http\Message\RequestInterface;
/**
* Override Request serializer to modify authentication mechanism
*/
class Serializer extends DefaultSerializer
{
/**
* {@inheritdoc}
*/
public function __construct(
DescriptionInterface $description,
array $requestLocations = []
) {
// Override Guzzle's body location as it isn't raw binary data
$requestLocations['body'] = new Request\BodyLocation;
parent::__construct($description, $requestLocations);
}
/**
* Authorization header is Loco's preferred authorization method.
* Add Authorization header to request if API key is set, unless query is explicitly configured as auth method.
* Unset key from command to avoid sending it as a query param.
*
* @override
*
* @param CommandInterface $command
* @param RequestInterface $request
*
* @return RequestInterface
*
* @throws \InvalidArgumentException
*/
protected function prepareRequest(
CommandInterface $command,
RequestInterface $request
) {
/*
if ($command->offsetExists('key') === true) {
$mode = empty($command->offsetGet('auth')) === false
? $command->offsetGet('auth')
: 'loco';
if ($mode !== 'query') {
// else use Authorization header of various types
if ($mode === 'loco') {
$value = 'Loco '.$command->offsetGet('key');
$request = $request->withHeader('Authorization', $value);
} elseif ($mode === 'basic') {
$value = 'Basic '.base64_encode($command->offsetGet('key').':');
$request = $request->withHeader('Authorization', $value);
} else {
throw new \InvalidArgumentException("Invalid auth type: {$mode}");
}
// avoid request sending key parameter in query string
$command->offsetUnset('key');
}
}
// Remap legacy parameters to common `data` binding on request body
static $remap = [
'import' => ['src'=>'data'],
'translate' => ['translation'=>'data'],
];
$name = $command->getName();
if (isset($remap[$name])) {
foreach ($remap[$name] as $old => $new) {
if ($command->offsetExists($old)) {
$command->offsetSet($new, $command->offsetGet($old));
$command->offsetUnset($old);
}
}
}
*/
return parent::prepareRequest($command, $request);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,80 @@
<?php
namespace Qcloud\Cos;
use Psr\Http\Message\RequestInterface;
class Signature
{
private $accessKey; // string: access key.
private $secretKey; // string: secret key.
public function __construct($accessKey, $secretKey, $token = null)
{
$this->accessKey = $accessKey;
$this->secretKey = $secretKey;
$this->token = $token;
date_default_timezone_set("PRC");
}
public function __destruct()
{
}
public function signRequest(RequestInterface $request)
{
$authorization = $this->createAuthorization($request);
return $request->withHeader('Authorization', $authorization);
}
public function createAuthorization(RequestInterface $request, $expires = "+30 minutes")
{
$signTime = (string)(time() - 60) . ';' . (string)(strtotime($expires));
$httpString = strtolower($request->getMethod()) . "\n" . urldecode($request->getUri()->getPath()) .
"\n\nhost=" . $request->getHeader("Host")[0] . "\n";
$sha1edHttpString = sha1($httpString);
$stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
$signKey = hash_hmac('sha1', $signTime, $this->secretKey);
$signature = hash_hmac('sha1', $stringToSign, $signKey);
$authorization = 'q-sign-algorithm=sha1&q-ak=' . $this->accessKey .
"&q-sign-time=$signTime&q-key-time=$signTime&q-header-list=host&q-url-param-list=&" .
"q-signature=$signature";
return $authorization;
}
public function createPresignedUrl(RequestInterface $request, $expires = "+30 minutes")
{
$authorization = $this->createAuthorization($request, $expires);
$uri = $request->getUri();
$query = "sign=" . urlencode($authorization);
if ($this->token != null) {
$query = $query . "&x-cos-security-token=" . $this->token;
}
$uri = $uri->withQuery($query);
return $uri;
}
public function createThumbWaterAuthorization($request, $expires){
$signTime = (string)(time() - 60) . ';' . (string)(strtotime($expires));
$httpString = $request->geturi()->getQuery()."\n".strtolower($request->getMethod()) . "\n" . urldecode($request->getUri()->getPath()) .
"\n\nhost=" . $request->getHeader("Host")[0] . "\n";
$sha1edHttpString = sha1($httpString);
$stringToSign = "sha1\n$signTime\n$sha1edHttpString\n";
$signKey = hash_hmac('sha1', $signTime, $this->secretKey);
$signature = hash_hmac('sha1', $stringToSign, $signKey);
$authorization = 'q-sign-algorithm=sha1&q-ak=' . $this->accessKey .
"&q-sign-time=$signTime&q-key-time=$signTime&q-header-list=host&q-url-param-list=&" .
"q-signature=$signature";
return $authorization;
}
public function createThumbWatersignedUrl(RequestInterface $request, $expires = "+30 minutes")
{
$authorization = $this->createThumbWaterAuthorization($request, $expires);
$uri = $request->getUri();
$query = "sign=" . urlencode($authorization);
if ($this->token != null) {
$query = $query . "&x-cos-security-token=" . $this->token;
}
$uri = $uri->withQuery($query);
return $uri;
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Qcloud\Cos;
use Qcloud\Cos\Exception\ServiceResponseException;
use GuzzleHttp\Promise\PromiseInterface;
use GuzzleHttp\Psr7;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\RequestException;
class SignatureMiddleware {
private $nextHandler;
protected $signature;
/**
* @param callable $nextHandler Next handler to invoke.
*/
public function __construct(callable $nextHandler, $accessKey, $secretKey) {
$this->nextHandler = $nextHandler;
$this->signature = new Signature($accessKey, $secretKey);
}
public function __invoke(RequestInterface $request, array $options) {
$fn = $this->nextHandler;
return $fn($this->signature->signRequest($request), $options);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,45 @@
<?php
namespace Qcloud\Cos\Tests;
use Qcloud\Cos\Client;
class TestHelper {
public static function nuke($bucket) {
try {
$cosClient = new Client(array('region' => getenv('COS_REGION'),
'credentials'=> array(
'appId' => getenv('COS_APPID'),
'secretId' => getenv('COS_KEY'),
'secretKey' => getenv('COS_SECRET'))));
$result = $cosClient->listObjects(array('Bucket' => $bucket));
if (isset($result['Contents'])) {
foreach ($result['Contents'] as $content) {
$cosClient->deleteObject(array('Bucket' => $bucket, 'Key' => $content['Key']));
}
}
while(True){
$result = $cosClient->ListMultipartUploads(
array('Bucket' => $bucket));
if (count($result['Uploads']) == 0){
break;
}
foreach ($result['Uploads'] as $upload) {
try {
$rt = $cosClient->AbortMultipartUpload(
array('Bucket' => $bucket,
'Key' => $upload['Key'],
'UploadId' => $upload['UploadId']));
} catch (\Exception $e) {
print_r($e);
}
}
}
$cosClient->deleteBucket(array('Bucket' => $bucket));
} catch (\Exception $e) {
// echo "$e\n";
}
}
}

7
core/api/Qcos/vendor/autoload.php vendored Normal file
View File

@@ -0,0 +1,7 @@
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit6790e31be3eb151cb678c9fe759a5905::getLoader();

View File

@@ -0,0 +1,445 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see http://www.php-fig.org/psr/psr-0/
* @see http://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
// PSR-4
private $prefixLengthsPsr4 = array();
private $prefixDirsPsr4 = array();
private $fallbackDirsPsr4 = array();
// PSR-0
private $prefixesPsr0 = array();
private $fallbackDirsPsr0 = array();
private $useIncludePath = false;
private $classMap = array();
private $classMapAuthoritative = false;
private $missingClasses = array();
private $apcuPrefix;
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', $this->prefixesPsr0);
}
return array();
}
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array $classMap Class to filename map
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*/
public function add($prefix, $paths, $prepend = false)
{
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
(array) $paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 base directories
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
/**
* Unregisters this instance as an autoloader.
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return bool|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*/
function includeFile($file)
{
include $file;
}

21
core/api/Qcos/vendor/composer/LICENSE vendored Normal file
View File

@@ -0,0 +1,21 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,9 @@
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
);

View File

@@ -0,0 +1,13 @@
<?php
// autoload_files.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
);

View File

@@ -0,0 +1,10 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Qcloud\\Cos\\' => array($baseDir . '/src'),
);

View File

@@ -0,0 +1,15 @@
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
'GuzzleHttp\\Command\\Guzzle\\' => array($vendorDir . '/guzzlehttp/guzzle-services/src'),
'GuzzleHttp\\Command\\' => array($vendorDir . '/guzzlehttp/command/src'),
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
);

View File

@@ -0,0 +1,70 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit6790e31be3eb151cb678c9fe759a5905
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit6790e31be3eb151cb678c9fe759a5905', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit6790e31be3eb151cb678c9fe759a5905', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit6790e31be3eb151cb678c9fe759a5905::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit6790e31be3eb151cb678c9fe759a5905::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire6790e31be3eb151cb678c9fe759a5905($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequire6790e31be3eb151cb678c9fe759a5905($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}

View File

@@ -0,0 +1,77 @@
<?php
// autoload_static.php @generated by Composer
namespace Composer\Autoload;
class ComposerStaticInit6790e31be3eb151cb678c9fe759a5905
{
public static $files = array (
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
);
public static $prefixLengthsPsr4 = array (
'P' =>
array (
'Psr\\Http\\Message\\' => 17,
),
'G' =>
array (
'GuzzleHttp\\Psr7\\' => 16,
'GuzzleHttp\\Promise\\' => 19,
'GuzzleHttp\\Command\\Guzzle\\' => 26,
'GuzzleHttp\\Command\\' => 19,
'GuzzleHttp\\' => 11,
),
);
public static $prefixDirsPsr4 = array (
'Psr\\Http\\Message\\' =>
array (
0 => __DIR__ . '/..' . '/psr/http-message/src',
),
'GuzzleHttp\\Psr7\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
),
'GuzzleHttp\\Promise\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
),
'GuzzleHttp\\Command\\Guzzle\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle-services/src',
),
'GuzzleHttp\\Command\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/command/src',
),
'GuzzleHttp\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
),
);
public static $prefixesPsr0 = array (
'Q' =>
array (
'Qcloud\\Cos\\' =>
array (
0 => __DIR__ . '/../..' . '/src',
),
),
);
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit6790e31be3eb151cb678c9fe759a5905::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit6790e31be3eb151cb678c9fe759a5905::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit6790e31be3eb151cb678c9fe759a5905::$prefixesPsr0;
}, null, ClassLoader::class);
}
}

View File

@@ -0,0 +1,408 @@
[
{
"name": "guzzlehttp/command",
"version": "1.0.0",
"version_normalized": "1.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/command.git",
"reference": "2aaa2521a8f8269d6f5dfc13fe2af12c76921034"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/command/zipball/2aaa2521a8f8269d6f5dfc13fe2af12c76921034",
"reference": "2aaa2521a8f8269d6f5dfc13fe2af12c76921034",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.2",
"guzzlehttp/promises": "~1.3",
"guzzlehttp/psr7": "~1.0",
"php": ">=5.5.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0|~5.0"
},
"time": "2016-11-24T13:34:15+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.9-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"GuzzleHttp\\Command\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
}
],
"description": "Provides the foundation for building command-based web service clients"
},
{
"name": "guzzlehttp/guzzle",
"version": "6.5.2",
"version_normalized": "6.5.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.6.1",
"php": ">=5.5"
},
"require-dev": {
"ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
"psr/log": "^1.1"
},
"suggest": {
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"time": "2019-12-23T11:57:10+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "6.5-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"GuzzleHttp\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Guzzle is a PHP HTTP client library",
"homepage": "http://guzzlephp.org/",
"keywords": [
"client",
"curl",
"framework",
"http",
"http client",
"rest",
"web service"
]
},
{
"name": "guzzlehttp/guzzle-services",
"version": "1.1.3",
"version_normalized": "1.1.3.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle-services.git",
"reference": "9e3abf20161cbf662d616cbb995f2811771759f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle-services/zipball/9e3abf20161cbf662d616cbb995f2811771759f7",
"reference": "9e3abf20161cbf662d616cbb995f2811771759f7",
"shasum": ""
},
"require": {
"guzzlehttp/command": "~1.0",
"guzzlehttp/guzzle": "^6.2",
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "~4.0"
},
"suggest": {
"gimler/guzzle-description-loader": "^0.0.4"
},
"time": "2017-10-06T14:32:02+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"GuzzleHttp\\Command\\Guzzle\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
},
{
"name": "Stefano Kowalke",
"email": "blueduck@mail.org",
"homepage": "https://github.com/konafets"
}
],
"description": "Provides an implementation of the Guzzle Command library that uses Guzzle service descriptions to describe web services, serialize requests, and parse responses into easy to use model structures."
},
{
"name": "guzzlehttp/promises",
"version": "v1.3.1",
"version_normalized": "1.3.1.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"shasum": ""
},
"require": {
"php": ">=5.5.0"
},
"require-dev": {
"phpunit/phpunit": "^4.0"
},
"time": "2016-12-20T10:07:11+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Guzzle promises library",
"keywords": [
"promise"
]
},
{
"name": "guzzlehttp/psr7",
"version": "1.6.1",
"version_normalized": "1.6.1.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
},
"suggest": {
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
},
"time": "2019-07-01T23:21:34+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.6-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Schultze",
"homepage": "https://github.com/Tobion"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
]
},
{
"name": "psr/http-message",
"version": "1.0.1",
"version_normalized": "1.0.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"time": "2016-08-06T14:39:51+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
]
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"version_normalized": "3.0.3.0",
"source": {
"type": "git",
"url": "https://github.com/ralouphie/getallheaders.git",
"reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5 || ^6.5"
},
"time": "2019-03-08T08:55:37+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"files": [
"src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Khattar",
"email": "ralph.khattar@gmail.com"
}
],
"description": "A polyfill for getallheaders."
}
]

View File

@@ -0,0 +1,19 @@
Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,134 @@
# Guzzle Commands
[![License](https://poser.pugx.org/guzzlehttp/command/license)](https://packagist.org/packages/guzzlehttp/command)
[![Build Status](https://travis-ci.org/guzzle/command.svg?branch=master)](https://travis-ci.org/guzzle/command)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/guzzle/command/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/guzzle/command/?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/guzzle/command/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/guzzle/command/?branch=master)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/7a93338e-50cd-42f7-9299-17c44d92148f/mini.png)](https://insight.sensiolabs.com/projects/7a93338e-50cd-42f7-9299-17c44d92148f)
[![Latest Stable Version](https://poser.pugx.org/guzzlehttp/command/v/stable)](https://packagist.org/packages/guzzlehttp/command)
[![Latest Unstable Version](https://poser.pugx.org/guzzlehttp/command/v/unstable)](https://packagist.org/packages/guzzlehttp/command)
[![Total Downloads](https://poser.pugx.org/guzzlehttp/command/downloads)](https://packagist.org/packages/guzzlehttp/command)
This library uses Guzzle (``guzzlehttp/guzzle``, version 6.x) and provides the
foundations to create fully-featured web service clients by abstracting Guzzle
HTTP **requests** and **responses** into higher-level **commands** and
**results**. A **middleware** system, analogous to — but separate from — the one
in the HTTP layer may be used to customize client behavior when preparing
commands into requests and processing responses into results.
### Commands
Key-value pair objects representing an operation of a web service. Commands have a name and a set of parameters.
### Results
Key-value pair objects representing the processed result of executing an operation of a web service.
## Installing
This project can be installed using Composer:
``composer require guzzlehttp/command``
For **Guzzle 5**, use ``composer require guzzlehttp/command:0.8.*``. The source
code for the Guzzle 5 version is available on the
`0.8 branch <https://github.com/guzzle/command/tree/0.8>`_.
**Note:** If Composer is not
`installed globally <https://getcomposer.org/doc/00-intro.md#globally>`_,
then you may need to run the preceding Composer commands using
``php composer.phar`` (where ``composer.phar`` is the path to your copy of
Composer), instead of just ``composer``.
## Service Clients
Service Clients are web service clients that implement the
``GuzzleHttp\Command\ServiceClientInterface`` and use an underlying Guzzle HTTP
client (``GuzzleHttp\Client``) to communicate with the service. Service clients
create and execute **commands** (``GuzzleHttp\Command\CommandInterface``),
which encapsulate operations within the web service, including the operation
name and parameters. This library provides a generic implementation of a service
client: the ``GuzzleHttp\Command\ServiceClient`` class.
## Instantiating a Service Client
@TODO Add documentation
* ``ServiceClient``'s constructor
* Transformer functions (``$commandToRequestTransformer`` and ``$responseToResultTransformer``)
* The ``HandlerStack``
## Executing Commands
Service clients create command objects using the ``getCommand()`` method.
```php
$commandName = 'foo';
$arguments = ['baz' => 'bar'];
$command = $client->getCommand($commandName, $arguments);
```
After creating a command, you may execute the command using the ``execute()``
method of the client.
```php
$result = $client->execute($command);
```
The result of executing a command will be a ``GuzzleHttp\Command\ResultInterface``
object. Result objects are ``ArrayAccess``-ible and contain the data parsed from
HTTP response.
Service clients have magic methods that act as shortcuts to executing commands
by name without having to create the ``Command`` object in a separate step
before executing it.
```php
$result = $client->foo(['baz' => 'bar']);
```
## Asynchronous Commands
@TODO Add documentation
* ``-Async`` suffix for client methods
* Promises
```php
// Create and execute an asynchronous command.
$command = $command = $client->getCommand('foo', ['baz' => 'bar']);
$promise = $client->executeAsync($command);
// Use asynchronous commands with magic methods.
$promise = $client->fooAsync(['baz' => 'bar']);
```
@TODO Add documentation
* ``wait()``-ing on promises.
```php
$result = $promise->wait();
echo $result['fizz']; //> 'buzz'
```
## Concurrent Requests
@TODO Add documentation
* ``executeAll()``
* ``executeAllAsync()``.
* Options (``fulfilled``, ``rejected``, ``concurrency``)
## Middleware: Extending the Client
Middleware can be added to the service client or underlying HTTP client to
implement additional behavior and customize the ``Command``-to-``Result`` and
``Request``-to-``Response`` lifecycles, respectively.
## Todo
* Middleware system and command vs request layers
* The ``HandlerStack``

View File

@@ -0,0 +1,36 @@
{
"name": "guzzlehttp/command",
"description": "Provides the foundation for building command-based web service clients",
"license": "MIT",
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
}
],
"require": {
"php": ">=5.5.0",
"guzzlehttp/guzzle": "^6.2",
"guzzlehttp/promises": "~1.3",
"guzzlehttp/psr7": "~1.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0|~5.0"
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Command\\": "src/"
}
},
"extra": {
"branch-alias": {
"dev-master": "0.9-dev"
}
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace GuzzleHttp\Command;
use GuzzleHttp\HandlerStack;
/**
* Default command implementation.
*/
class Command implements CommandInterface
{
use HasDataTrait;
/** @var string */
private $name;
/** @var HandlerStack */
private $handlerStack;
/**
* @param string $name Name of the command
* @param array $args Arguments to pass to the command
* @param HandlerStack $handlerStack Stack of middleware for the command
*/
public function __construct(
$name,
array $args = [],
HandlerStack $handlerStack = null
) {
$this->name = $name;
$this->data = $args;
$this->handlerStack = $handlerStack;
}
public function getHandlerStack()
{
return $this->handlerStack;
}
public function getName()
{
return $this->name;
}
public function hasParam($name)
{
return array_key_exists($name, $this->data);
}
public function __clone()
{
if ($this->handlerStack) {
$this->handlerStack = clone $this->handlerStack;
}
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace GuzzleHttp\Command;
use GuzzleHttp\HandlerStack;
/**
* A command object encapsulates the input parameters used to control the
* creation of a HTTP request and processing of a HTTP response.
*
* Using the getParams() method will return the input parameters of the command
* as an associative array.
*/
interface CommandInterface extends \ArrayAccess, \IteratorAggregate, \Countable, ToArrayInterface
{
/**
* Retrieves the handler stack specific to this command's execution.
*
* This can be used to add middleware that is specific to the command instance.
*
* @return HandlerStack
*/
public function getHandlerStack();
/**
* Get the name of the command.
*
* @return string
*/
public function getName();
/**
* Check if the command has a parameter by name.
*
* @param string $name Name of the parameter to check.
*
* @return bool
*/
public function hasParam($name);
}

View File

@@ -0,0 +1,7 @@
<?php
namespace GuzzleHttp\Command\Exception;
/**
* Exception encountered when a 4xx level response is received for a request
*/
class CommandClientException extends CommandException {}

View File

@@ -0,0 +1,109 @@
<?php
namespace GuzzleHttp\Command\Exception;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Command\CommandInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
/**
* Exception encountered while executing a command.
*/
class CommandException extends \RuntimeException implements GuzzleException
{
/** @var CommandInterface */
private $command;
/** @var RequestInterface */
private $request;
/** @var ResponseInterface */
private $response;
/**
* @param CommandInterface $command
* @param \Exception $prev
* @return CommandException
*/
public static function fromPrevious(CommandInterface $command, \Exception $prev)
{
// If the exception is already a command exception, return it.
if ($prev instanceof self && $command === $prev->getCommand()) {
return $prev;
}
// If the exception is a RequestException, get the Request and Response.
$request = $response = null;
if ($prev instanceof RequestException) {
$request = $prev->getRequest();
$response = $prev->getResponse();
}
// Throw a more specific exception for 4XX or 5XX responses.
$class = self::class;
$statusCode = $response ? $response->getStatusCode() : 0;
if ($statusCode >= 400 && $statusCode < 500) {
$class = CommandClientException::class;
} elseif ($statusCode >= 500 && $statusCode < 600) {
$class = CommandServerException::class;
}
// Prepare the message.
$message = 'There was an error executing the ' . $command->getName()
. ' command: ' . $prev->getMessage();
// Create the exception.
return new $class($message, $command, $prev, $request, $response);
}
/**
* @param string $message Exception message
* @param CommandInterface $command
* @param \Exception $previous Previous exception (if any)
* @param RequestInterface $request
* @param ResponseInterface $response
*/
public function __construct(
$message,
CommandInterface $command,
\Exception $previous = null,
RequestInterface $request = null,
ResponseInterface $response = null
) {
$this->command = $command;
$this->request = $request;
$this->response = $response;
parent::__construct($message, 0, $previous);
}
/**
* Gets the command that failed.
*
* @return CommandInterface
*/
public function getCommand()
{
return $this->command;
}
/**
* Gets the request that caused the exception
*
* @return RequestInterface|null
*/
public function getRequest()
{
return $this->request;
}
/**
* Gets the associated response
*
* @return ResponseInterface|null
*/
public function getResponse()
{
return $this->response;
}
}

View File

@@ -0,0 +1,7 @@
<?php
namespace GuzzleHttp\Command\Exception;
/**
* Exception encountered when a 5xx level response is received for a request
*/
class CommandServerException extends CommandException {}

View File

@@ -0,0 +1,60 @@
<?php
namespace GuzzleHttp\Command;
/**
* Basic collection behavior for Command and Result objects.
*
* The methods in the class are primarily for implementing the ArrayAccess,
* Countable, and IteratorAggregate interfaces.
*/
trait HasDataTrait
{
/** @var array Data stored in the collection. */
protected $data;
public function __toString()
{
return print_r($this, true);
}
public function __debugInfo()
{
return $this->data;
}
public function offsetExists($offset)
{
return array_key_exists($offset, $this->data);
}
public function offsetGet($offset)
{
return isset($this->data[$offset]) ? $this->data[$offset] : null;
}
public function offsetSet($offset, $value)
{
$this->data[$offset] = $value;
}
public function offsetUnset($offset)
{
unset($this->data[$offset]);
}
public function count()
{
return count($this->data);
}
public function getIterator()
{
return new \ArrayIterator($this->data);
}
public function toArray()
{
return $this->data;
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace GuzzleHttp\Command;
/**
* Default command implementation.
*/
class Result implements ResultInterface
{
use HasDataTrait;
/**
* @param array $data
*/
public function __construct(array $data = [])
{
$this->data = $data;
}
}

Some files were not shown because too many files have changed in this diff Show More