pull/141/head
= 2022-02-22 11:56:49 +01:00
parent 6192830822
commit 6c207090e1
9 changed files with 160 additions and 146 deletions

View File

@ -104,8 +104,10 @@ $HTTP["url"] =~ "^/(i|public)/" {
<details><summary><mark>点击查看2.0版更新日志</mark></summary>
* 2022-2-21 v2.5.3 Developing
- 增加图床数据开放
- 增加自定义服务条款
- 升级 Viewer.js 到 v1.10.4
- 将页面选择记录从cookie改为本地存储
- 修复实时生成缩略图导致的页面布局异常
- 优化显示代码

View File

@ -527,16 +527,55 @@ if (isset($_GET['reimg'])) {
<label class="radio-inline"><input type="radio" name="check_ip_model" value="1" <?php if ($config['check_ip_model'] == 1) echo 'checked'; ?>> 白名单模式</label>
</div>
<div class="form-group">
<div class="switch switch-inline">
<input type="hidden" name="checkEnv" value="0">
<input type="checkbox" name="checkEnv" value="1" <?php if ($config['checkEnv']) echo 'checked="checked"'; ?>>
<label style="font-weight: bold">PHP扩展检测 | 安全设置检测 | 版本检测</label>
<div class="switch switch-inline" data-toggle="tooltip" title="通过指定参数查询图床的开放数据,当前不开启下边多选框不会生效, 使用方法见使用手册->公共查询">
<input type="hidden" name="public" value="0">
<input type="checkbox" name="public" value="1" <?php if ($config['public']) echo 'checked'; ?>>
<label style="font-weight: bold">开放数据</label>
</div>
</div>
<div class="form-group">
<div class="switch switch-inline">
<label class="checkbox-inline" data-toggle="tooltip" title="<?php echo $config['domain']; ?>/api/public.php?show=time">
<input type="checkbox" name="public_list[]" value="time" id="time" <?php if (in_array('time', $config['public_list'])) echo 'checked'; ?>><label for="time">统计时间</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=today">
<input type="checkbox" name="public_list[]" value="today" id="today" <?php if (in_array('today', $config['public_list'])) echo 'checked'; ?>><label for="today">今日</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=yesterday">
<input type="checkbox" name="public_list[]" value="yesterday" id="yesterday" <?php if (in_array('yesterday', $config['public_list'])) echo 'checked'; ?>><label for="yesterday">昨日</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=total_space">
<input type="checkbox" name="public_list[]" value="total_space" id="total_space" <?php if (in_array('total_space', $config['public_list'])) echo 'checked'; ?>><label for="total_space">总空间</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=used_space">
<input type="checkbox" name="public_list[]" value="used_space" id="used_space" <?php if (in_array('used_space', $config['public_list'])) echo 'checked'; ?>><label for="used_space">已用</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=free_space">
<input type="checkbox" name="public_list[]" value="free_space" id="free_space" <?php if (in_array('free_space', $config['public_list'])) echo 'checked'; ?>><label for="free_space">剩余</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=image_used">
<input type="checkbox" name="public_list[]" value="image_used" id="image_used" <?php if (in_array('image_used', $config['public_list'])) echo 'checked'; ?>><label for="image_used">图床占用</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=file">
<input type="checkbox" name="public_list[]" value="file" id="file" <?php if (in_array('file', $config['public_list'])) echo 'checked'; ?>><label for="file">文件数量</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=dir">
<input type="checkbox" name="public_list[]" value="dir" id="dir" <?php if (in_array('dir', $config['public_list'])) echo 'checked'; ?>><label for="dir">文件夹数量</label>
</label>
<label class="checkbox-inline" data-toggle="tooltip" title="public.php?show=month">
<input type="checkbox" name="public_list[]" value="month" id="month" <?php if (in_array('month', $config['public_list'])) echo 'checked'; ?>><label for="month">最近30日</label>
</label>
</div>
<div class="form-group">
<div class="switch switch-inline" data-toggle="tooltip" title="PHP扩展 | 安全设置 | 鉴黄 | 版本">
<input type="hidden" name="checkEnv" value="0">
<input type="checkbox" name="checkEnv" value="1" <?php if ($config['checkEnv']) echo 'checked="checked"'; ?>>
<label style="font-weight: bold">检测网站</label>
</div>
</div>
<div class="form-group">
<div class="switch switch-inline" data-toggle="tooltip" title="日志每月保存一个文件; 经测试二十万条数据并不影响速度!">
<input type="hidden" name="upload_logs" value="0">
<input type="checkbox" name="upload_logs" value="1" <?php if ($config['upload_logs']) echo 'checked="checked"'; ?> title="日志每月保存一个文件;经过测试每月二十万条数据并不影响速度! ">
<input type="checkbox" name="upload_logs" value="1" <?php if ($config['upload_logs']) echo 'checked="checked"'; ?>>
<label style="font-weight: bold">上传日志</label>
</div>
</div>
@ -816,26 +855,23 @@ if (isset($_GET['reimg'])) {
<link href="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.css" rel="stylesheet">
<script src="<?php static_cdn(); ?>/public/static/zui/lib/datetimepicker/datetimepicker.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/md5/md5.min.js"></script>
<script src="<?php static_cdn(); ?>/public/static/jquery/jquery.cookie.js"></script>
<?php /** 引入设置页面检测文件 */ if ($config['checkEnv']) require_once APP_ROOT . '/application/check_admin.inc.php'; ?>
<script>
// cookie 记录当前tab页面
// 使用本地存储记录当前tab页面
$('[data-tab]').on('shown.zui.tab', function(e) {
var cookie_value = e.delegateTarget.attributes[1].value;
$.cookie('data-tab-now', cookie_value, {
expires: 1,
}); // 存储一个带1天期限的 cookie
$.zui.store.pageSet('data-tab-now', cookie_value);
console.log('当前被激活的标签页', e.target);
console.log('上一个标签页', e.relatedTarget);
});
})
// cookie有
if ($.cookie('data-tab-now') != null) {
$ac = $.cookie('data-tab-now');
if ($.zui.store.pageGet('data-tab-now') != null) {
$ac = $.zui.store.pageGet('data-tab-now');
$("a[href = '" + $ac + "']").parent().addClass("active in")
$($ac).addClass("active in")
}
// cookie无
if ($.cookie('data-tab-now') == null) {
if ($.zui.store.pageGet('data-tab-now') == null) {
$("a[href = '#Content1']").parent().addClass("active in")
$('#Content1').addClass("active in")
}

View File

@ -108,7 +108,12 @@ if (is_array($char_data)) {
<?php printf("%d 个", read_total_json('dirnum')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
占用存储
总空间
<hr />
<?php echo getDistUsed(disk_total_space('.')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
已用空间
<hr />
<?php echo getDistUsed(disk_total_space('.') - disk_free_space('.')); ?>
</div>
@ -117,6 +122,11 @@ if (is_array($char_data)) {
<hr />
<?php echo getDistUsed(disk_free_space('.')); ?>
</div>
<div class="col-xs-3 alert alert-primary autoshadow">
图床占用
<hr />
<?php echo read_total_json('usage_space'); ?>
</div>
</div>
<div class="col-md-12 col-xs-12">
<hr />

74
api/public.php Executable file
View File

@ -0,0 +1,74 @@
<?php
/**
* 图床公共信息查询APi
* 2022年2月22日11:41:38
* @author Icret
*/
require_once '../application/function.php';
require_once '../application/chart.php';
// 检查是否开启查询
if ($config['public'] == 0) die('开放数据接口已关闭!');
// 获得get值
$show = (empty($_GET['show'])) ? die('没有参数!') : htmlspecialchars($_GET['show']);
// 检查是否在允许范围内
if (!in_array($show, $config['public_list'])) die('没有权限或参数错误!');
// 根据请求返回值
switch ($show) {
// 统计时间
case 'time':
echo read_total_json('total_time');
break;
// 今日上传
case 'today':
echo read_total_json('todayUpload');
break;
// 昨日上传
case 'yesterday':
echo read_total_json('yestUpload');
break;
// 总空间
case 'total_space':
echo getDistUsed(disk_total_space('.'));
break;
// 已用空间
case 'used_space':
echo getDistUsed(disk_total_space('.') - disk_free_space('.'));
break;
// 剩余空间
case 'free_space':
echo getDistUsed(disk_free_space('/'));
break;
// 图床使用空间
case 'image_used':
echo read_total_json('usage_space');
break;
// 文件数量
case 'file':
echo read_total_json('filenum');
break;
// 文件夹数量
case 'dir':
echo read_total_json('dirnum');
break;
case 'month':
foreach (read_chart_total()['number'] as $value)
echo $value;
break;
default:
return read_chart_total();
break;
}

View File

@ -2,7 +2,6 @@
defined('APP_ROOT') ?: exit; // 禁止访问
if ($config['ad_bot']) echo $config['ad_bot_info']; // 底部广告
?>
<footer class="col-md-12 text-muted small" style="text-align: center;">
<hr>
<!-- 对话框HTML -->
@ -71,7 +70,6 @@ if ($config['ad_bot']) echo $config['ad_bot_info']; // 底部广告
console.log("%cEasyImage2.0", "background: rgba(252,234,187,1);background: -moz-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%,rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: -webkit-gradient(left top, right top, color-stop(0%, rgba(252,234,187,1)), color-stop(12%, rgba(175,250,77,1)), color-stop(28%, rgba(0,247,49,1)), color-stop(39%, rgba(0,210,247,1)), color-stop(51%, rgba(0,189,247,1)), color-stop(64%, rgba(133,108,217,1)), color-stop(78%, rgba(177,0,247,1)), color-stop(87%, rgba(247,0,189,1)), color-stop(100%, rgba(245,22,52,1)));background: -webkit-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: -o-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: -ms-linear-gradient(left, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);background: linear-gradient(to right, rgba(252,234,187,1) 0%, rgba(175,250,77,1) 12%, rgba(0,247,49,1) 28%, rgba(0,210,247,1) 39%, rgba(0,189,247,1) 51%, rgba(133,108,217,1) 64%, rgba(177,0,247,1) 78%, rgba(247,0,189,1) 87%, rgba(245,22,52,1) 100%);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fceabb', endColorstr='#f51634', GradientType=1 );font-size:2.34em;font-weight:bold")
console.log('%c图床演示网站: https://png.cm \n请为本人博客 https://blog.png.cm/ 加上链接, 谢谢尊重!\n作为开发者你可以对相应的后台功能进行扩展(增删改相应代码), 但请保留代码中相关来源信息(例如: 本人博客, 邮箱等);\n本程序由 Icret 独自开发并完全开源, 碰到收费发布的请不要轻易付款; 本人仅为程序开源创作, 如非法网站使用与本人无关, 请勿用于非法用途.%c ', 'color: #eaad1a; padding:5px 0; border:1px solid #448ef6; font-size:12px;', '');
</script>
<!-- <div class="navbar navbar-default" style="margin-bottom:0px;margin-left:0px;margin-right:0px;clear:both;">Navbar Code</div> -->
</body>
</html>

View File

@ -39,7 +39,7 @@ $config=Array
'imgRatio_quality'=>80,
'imgRatio_crop'=>0,
'imgRatio_preserve_headers'=>1,
'static_cdn'=>0,
'static_cdn'=>1,
'theme'=>'default',
'static_cdn_url'=>'https://cdn.jsdelivr.net/gh/icret/EasyImages2.0@2.5.2',
'TinyPng_key'=>'',
@ -58,14 +58,14 @@ var _hmt = _hmt || [];
})();
</script>',
'ad_top'=>0,
'ad_top_info'=>' <!--广告 按照这个范例替换相应链接,如果想多几个广告,就多复制几个-->
<div class="col-md-12" style="text-align: center;margin:2px;">
<a href="https://app.cloudcone.com.cn/?ref=3521" target="_blank"><img src="/public/images/EasyImage2.0.png" /></a>
'ad_top_info'=>' <!--广告 按照这个范例替换相应链接,如果想多几个广告,就多复制几个-->
<div class="col-md-12" style="text-align: center;margin:2px;">
<a href="https://app.cloudcone.com.cn/?ref=3521" target="_blank"><img src="/public/images/EasyImage2.0.png" /></a>
</div>',
'ad_bot'=>0,
'ad_bot_info'=>'<div class="col-md-12" style="text-align: center;margin:12px;">
<a href="../public/images/wechat.jpg" title="您的赞美是我开发的动力!" data-toggle="lightbox" class="btn btn-mini" style="color:#329d38;" data-lightbox-group="group1644998953432"><i class="icon icon-wechat"></i> 打赏作者</a>
<a href="../public/images/alipay.jpg" title="您的赞美是我开发的动力!" data-toggle="lightbox" class="btn btn-mini" style="color:#1970fc;" data-lightbox-group="group1644998953432"><i class="icon icon-zhifubao"></i> 打赏作者</a>
'ad_bot_info'=>'<div class="col-md-12" style="text-align: center;margin:12px;">
<a href="../public/images/wechat.jpg" title="您的赞美是我开发的动力!" data-toggle="lightbox" class="btn btn-mini" style="color:#329d38;" data-lightbox-group="group1644998953432"><i class="icon icon-wechat"></i> 打赏作者</a>
<a href="../public/images/alipay.jpg" title="您的赞美是我开发的动力!" data-toggle="lightbox" class="btn btn-mini" style="color:#1970fc;" data-lightbox-group="group1644998953432"><i class="icon icon-zhifubao"></i> 打赏作者</a>
</div>',
'showSwitch'=>1,
'showSort'=>1,
@ -81,9 +81,23 @@ var _hmt = _hmt || [];
'check_ip'=>0,
'check_ip_model'=>0,
'check_ip_list'=>'',
'public'=>0,
'public_list'=>Array
(
0=>'time',
1=>'today',
2=>'yesterday',
3=>'total_space',
4=>'used_space',
5=>'free_space',
6=>'image_used',
7=>'file',
8=>'dir',
9=>'month'
),
'language'=>0,
'version'=>'2.5.3',
'update'=>'2022-02-22 03:37:40',
'update'=>'2022-02-22 18:47:40',
'terms'=>'<div class="container">
<div class="row">
<div class="col-xs-3">

View File

@ -1,117 +0,0 @@
/*!
* jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
var pluses = /\+/g;
function encode(s) {
return config.raw ? s : encodeURIComponent(s);
}
function decode(s) {
return config.raw ? s : decodeURIComponent(s);
}
function stringifyCookieValue(value) {
return encode(config.json ? JSON.stringify(value) : String(value));
}
function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
// This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
try {
// Replace server-side written pluses with spaces.
// If we can't decode the cookie, ignore it, it's unusable.
// If we can't parse the cookie, ignore it, it's unusable.
s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
} catch(e) {}
}
function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
// Write
if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// Read
var result = key ? undefined : {};
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : [];
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('=');
if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
}
// Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
}
return result;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
}
// Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};
}));

View File

@ -1,2 +0,0 @@
/*! Lazy Load 2.0.0-rc.2 - MIT license - Copyright 2007-2019 Mika Tuupola */
!function(t,e){"object"==typeof exports?module.exports=e(t):"function"==typeof define&&define.amd?define([],e):t.LazyLoad=e(t)}("undefined"!=typeof global?global:this.window||this.global,function(t){"use strict";function e(t,e){this.settings=s(r,e||{}),this.images=t||document.querySelectorAll(this.settings.selector),this.observer=null,this.init()}"function"==typeof define&&define.amd&&(t=window);const r={src:"data-src",srcset:"data-srcset",selector:".lazyload",root:null,rootMargin:"0px",threshold:0},s=function(){let t={},e=!1,r=0,o=arguments.length;"[object Boolean]"===Object.prototype.toString.call(arguments[0])&&(e=arguments[0],r++);for(;r<o;r++)!function(r){for(let o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e&&"[object Object]"===Object.prototype.toString.call(r[o])?t[o]=s(!0,t[o],r[o]):t[o]=r[o])}(arguments[r]);return t};if(e.prototype={init:function(){if(!t.IntersectionObserver)return void this.loadImages();let e=this,r={root:this.settings.root,rootMargin:this.settings.rootMargin,threshold:[this.settings.threshold]};this.observer=new IntersectionObserver(function(t){Array.prototype.forEach.call(t,function(t){if(t.isIntersecting){e.observer.unobserve(t.target);let r=t.target.getAttribute(e.settings.src),s=t.target.getAttribute(e.settings.srcset);"img"===t.target.tagName.toLowerCase()?(r&&(t.target.src=r),s&&(t.target.srcset=s)):t.target.style.backgroundImage="url("+r+")"}})},r),Array.prototype.forEach.call(this.images,function(t){e.observer.observe(t)})},loadAndDestroy:function(){this.settings&&(this.loadImages(),this.destroy())},loadImages:function(){if(!this.settings)return;let t=this;Array.prototype.forEach.call(this.images,function(e){let r=e.getAttribute(t.settings.src),s=e.getAttribute(t.settings.srcset);"img"===e.tagName.toLowerCase()?(r&&(e.src=r),s&&(e.srcset=s)):e.style.backgroundImage="url('"+r+"')"})},destroy:function(){this.settings&&(this.observer.disconnect(),this.settings=null)}},t.lazyload=function(t,r){return new e(t,r)},t.jQuery){const r=t.jQuery;r.fn.lazyload=function(t){return t=t||{},t.attribute=t.attribute||"data-src",new e(r.makeArray(this),t),this}}return e});

View File

@ -1 +0,0 @@
{"version":3,"sources":["lazyload.js"],"names":["root","factory","exports","module","define","amd","LazyLoad","global","this","window","images","options","settings","extend","defaults","document","querySelectorAll","selector","observer","init","src","srcset","rootMargin","threshold","extended","deep","i","length","arguments","Object","prototype","toString","call","obj","prop","hasOwnProperty","merge","IntersectionObserver","loadImages","self","observerConfig","entries","Array","forEach","entry","isIntersecting","unobserve","target","getAttribute","tagName","toLowerCase","style","backgroundImage","image","observe","loadAndDestroy","destroy","disconnect","lazyload","jQuery","$","fn","attribute","makeArray"],"mappings":"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"}