mirror of
https://github.com/cloudreve/Cloudreve.git
synced 2024-04-21 12:31:40 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24789ca8a9 | ||
|
|
544769bf04 | ||
|
|
85119bc54d | ||
|
|
d3061f0526 | ||
|
|
4492991bbb | ||
|
|
1e79428425 | ||
|
|
c28f08c210 | ||
|
|
0e0f7d5258 | ||
|
|
d2ca69b945 | ||
|
|
9cb572f0da | ||
|
|
9994f12aa8 | ||
|
|
20b7d67adc | ||
|
|
63cc404d74 | ||
|
|
47f334b6f4 | ||
|
|
1431f433d1 | ||
|
|
b6c1382e73 | ||
|
|
02ce111717 | ||
|
|
02d00d9b19 | ||
|
|
25c86357da | ||
|
|
bb49ff1b5f | ||
|
|
f33414c643 | ||
|
|
c1eebc7bf7 | ||
|
|
90a0b34b3e | ||
|
|
60cd53895d | ||
|
|
a97df81a9e | ||
|
|
3fdc327bb0 | ||
|
|
d02899328d | ||
|
|
34767dd9b0 | ||
|
|
85609ddbd8 | ||
|
|
d6aa3ca86f | ||
|
|
9e33129e7d | ||
|
|
8c54632ccd | ||
|
|
dda74f16ce | ||
|
|
69b540708e | ||
|
|
f290658cd0 | ||
|
|
842f7bf052 | ||
|
|
7998513e4e | ||
|
|
dd3552fefd | ||
|
|
f238dc14ca | ||
|
|
865538f437 | ||
|
|
c6fbca185d | ||
|
|
19fb84efa8 | ||
|
|
0be66f7897 | ||
|
|
ebb99e9515 | ||
|
|
6f911908ed | ||
|
|
d163808d45 |
@@ -4,5 +4,6 @@
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
|
||||
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
|
||||
</IfModule>
|
||||
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
namespace CloudreveInstaller;
|
||||
|
||||
use Composer\Script\Event;
|
||||
|
||||
class Installer{
|
||||
|
||||
public static function startInstall(Event $event){
|
||||
$version = json_decode(file_get_contents("application/version.json"),true)["version"];
|
||||
$ioContext = $event->getIO();
|
||||
$welcomMsg = "
|
||||
___ _ _
|
||||
/ __\ | ___ _ _ __| |_ __ _____ _____
|
||||
/ / | |/ _ \| | | |/ _` | '__/ _ \ \ / / _ \
|
||||
/ /___| | (_) | |_| | (_| | | | __/\ V / __/
|
||||
\____/|_|\___/ \__,_|\__,_|_| \___| \_/ \___|
|
||||
|
||||
Ver $version
|
||||
================================================
|
||||
";
|
||||
$ioContext->write($welcomMsg);
|
||||
$sqlInfo = self::getSqlInformation($event);
|
||||
$ioContext->write("");
|
||||
$siteUrl=$ioContext->ask("The full-url to access to your Cloudreve (e.g. https://pan.aoaoao.me/ , 'http' must be included in the front and '/' must be included at the end):");
|
||||
$ioContext->write("");
|
||||
if(!file_exists('mysql.sql')){
|
||||
$ioContext->writeError("[Error] The file mysql.sql not exist.\nInstaller will exit.To retry, run 'composer install'");
|
||||
exit();
|
||||
}
|
||||
$sqlSource = file_get_contents('mysql.sql');
|
||||
$sqlSource = str_replace("https://cloudreve.org/", $siteUrl, $sqlSource);
|
||||
$mysqli = @new \mysqli($sqlInfo["hostname"], $sqlInfo["username"], $sqlInfo["password"], $sqlInfo["database"], $sqlInfo["hostport"]);
|
||||
$ioContext->write("=======================");
|
||||
$ioContext->write("Starting import sql file...");
|
||||
if ($mysqli->multi_query($sqlSource)) {
|
||||
$ioContext->write("Writing complete.");
|
||||
$ioContext->write("Writing database.php...");
|
||||
if(file_exists('application/database.php')){
|
||||
$ioContext->writeError("[Error] The file database.php already exist.\nInstaller will exit.To retry, run 'composer install'");
|
||||
$ioContext->write("=======================");
|
||||
exit();
|
||||
}
|
||||
self::writrConfig($event,$sqlInfo);
|
||||
$ioContext->write("=======================");
|
||||
}else{
|
||||
$ioContext->writeError("[Error] Writing failed.Installer will exit. To retry, run 'composer install'");
|
||||
$ioContext->write("=======================");
|
||||
}
|
||||
$ioContext->write("");
|
||||
$ioContext->write("Congratulations! Cloudreve has been installed successfully.");
|
||||
$ioContext->write("");
|
||||
$ioContext->write("Here's some informatioin about yor Cloudreve:");
|
||||
$ioContext->write("Homepage: $siteUrl");
|
||||
$ioContext->write("Admin Panel: ".$siteUrl."Admin");
|
||||
$ioContext->write("Default username: admin@cloudreve.org");
|
||||
$ioContext->write("Default password: admin");
|
||||
$ioContext->write("");
|
||||
$ioContext->write("=======================");
|
||||
$ioContext->write("IMPORTANT! You may still have to configure the URL Rewrite to set everthing to work.");
|
||||
$ioContext->write("Refer to the install manual for more informatioin.");
|
||||
$ioContext->write("=======================");
|
||||
self::sendFeedBack($siteUrl);
|
||||
}
|
||||
|
||||
public static function writrConfig(Event $event,$sqlInfo){
|
||||
$ioContext = $event->getIO();
|
||||
try {
|
||||
$fileContent = file_get_contents("CloudreveInstaller/database_sample.php");
|
||||
$replacement = array(
|
||||
'{hostname}' => $sqlInfo["hostname"],
|
||||
'{database}' => $sqlInfo["database"],
|
||||
'{username}' => $sqlInfo["username"],
|
||||
'{password}' => $sqlInfo["password"],
|
||||
'{hostport}' => $sqlInfo["hostport"],
|
||||
);
|
||||
$fileContent = strtr($fileContent,$replacement);
|
||||
file_put_contents('application/database.php',$fileContent);
|
||||
}catch (Exception $e) {
|
||||
$ioContext->writeError("[Error] Writing failed.Installer will exit. To retry, run 'composer install'");
|
||||
}
|
||||
$ioContext->write("Writing complete.");
|
||||
}
|
||||
|
||||
public static function getSqlInformation(Event $event){
|
||||
$ioContext = $event->getIO();
|
||||
$hostname=$ioContext->ask("Input the hostname of your MySQL server (Default:127.0.0.1):","127.0.0.1");
|
||||
$database=$ioContext->ask("The database name:","127.0.0.1");
|
||||
$username=$ioContext->ask("The username of your MySQL server (Default:root):","root");
|
||||
$password=$ioContext->ask("The password of your MySQL server:");
|
||||
$hostport=$ioContext->ask("The hostport of your MySQL server (Default:3306):","3306");
|
||||
$mysqli = @new \mysqli($hostname, $username, $password, $database, $hostport);
|
||||
if ($mysqli->connect_error) {
|
||||
$ioContext->writeError("[Error] Cannot connect to MySQL server, Message:".$mysqli->connect_error);
|
||||
$ioContext->write("");
|
||||
$ioContext->write("Please confirm your connection informatioin:");
|
||||
@$mysqli->close();
|
||||
return self::getSqlInformation($event);
|
||||
}
|
||||
return [
|
||||
"hostname" => $hostname,
|
||||
"database" => $database,
|
||||
"username" => $username,
|
||||
"password" => $password,
|
||||
"hostport" => $hostport,
|
||||
];
|
||||
}
|
||||
|
||||
public static function sendFeedBack($url){
|
||||
@file_get_contents("http://aoaoao.me/api/feedback.php?url=".urlencode($url));
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -13,15 +13,15 @@ return [
|
||||
// 数据库类型
|
||||
'type' => 'mysql',
|
||||
// 服务器地址
|
||||
'hostname' => '127.0.0.1',
|
||||
'hostname' => '{hostname}',
|
||||
// 数据库名
|
||||
'database' => 'lite',
|
||||
'database' => '{database}',
|
||||
// 用户名
|
||||
'username' => 'root',
|
||||
'username' => '{username}',
|
||||
// 密码
|
||||
'password' => 'root',
|
||||
'password' => '{password}',
|
||||
// 端口
|
||||
'hostport' => '3306',
|
||||
'hostport' => '{hostport}',
|
||||
// 连接dsn
|
||||
'dsn' => '',
|
||||
// 数据库连接参数
|
||||
@@ -2,18 +2,18 @@
|
||||
|
||||
Cloudreve - Make the cloud easy for everyone
|
||||
=========================
|
||||
[](https://packagist.org/packages/hfo4/cloudreve)
|
||||
[](https://packagist.org/packages/hfo4/cloudreve)
|
||||
[](https://packagist.org/packages/hfo4/cloudreve)
|
||||
[](https://packagist.org/packages/hfo4/cloudreve)
|
||||
|
||||
基于ThinkPHP构建的网盘系统,能够助您以较低成本快速搭建起公私兼备的网盘。
|
||||
|
||||

|
||||

|
||||
|
||||
目前已经实现的特性:
|
||||
|
||||
* 快速对接多家云存储,支持七牛、又拍云、阿里云OSS、AWS S3,当然,还有本地存储
|
||||
* 可限制单文件最大大小、MMMEType、文件后缀、用户可用容量
|
||||
* 快速对接多家云存储,支持七牛、又拍云、阿里云OSS、AWS S3、自建远程服务器,当然,还有本地存储
|
||||
* 可限制单文件最大大小、MIMEType、文件后缀、用户可用容量
|
||||
* 图片、音频、视频、文本、Markdown、Ofiice文档 在线预览
|
||||
* 移动端全站响应式布局
|
||||
* 文件、目录分享系统,可创建私有分享或公开分享链接
|
||||
@@ -22,19 +22,79 @@ Cloudreve - Make the cloud easy for everyone
|
||||
* 初步完善的后台,方便管理
|
||||
* 拖拽上传、分片上传、断点续传、下载限速(*实验性功能)
|
||||
* 多上传策略,可为不同用户组分配不同策略
|
||||
* 用户组基础权限设置
|
||||
* 用户组基础权限设置、二步验证
|
||||
* WebDAV协议支持
|
||||
|
||||
安装需求
|
||||
------------
|
||||
* LNMP/LAMP With PHP5.6+
|
||||
* LNMP/AMP With PHP5.6+
|
||||
* curl、fileinfo、gd扩展
|
||||
* Composer
|
||||
|
||||
简要安装说明
|
||||
------------
|
||||
|
||||
Coming Soon...
|
||||
#### 1.使用Composer安装主程序
|
||||
```
|
||||
#安装开发版
|
||||
$ composer create-project hfo4/cloudreve:dev-master
|
||||
```
|
||||
|
||||
```
|
||||
#等待安装依赖库后,会自动执行安装脚本,按照提示输入数据库账户信息
|
||||
___ _ _
|
||||
/ __\ | ___ _ _ __| |_ __ _____ _____
|
||||
/ / | |/ _ \| | | |/ _` | '__/ _ \ \ / / _ \
|
||||
/ /___| | (_) | |_| | (_| | | | __/\ V / __/
|
||||
\____/|_|\___/ \__,_|\__,_|_| \___| \_/ \___|
|
||||
|
||||
Ver XX
|
||||
================================================
|
||||
#按提示输入信息
|
||||
......
|
||||
```
|
||||
|
||||
```
|
||||
#出现如下提示表示安装完成
|
||||
Congratulations! Cloudreve has been installed successfully.
|
||||
|
||||
Here's some informatioin about yor Cloudreve:
|
||||
Homepage: https://pan.aoaoao.me/
|
||||
Admin Panel: https://pan.aoaoao.me/Admin
|
||||
Default username: admin@cloudreve.org
|
||||
Default password: admin
|
||||
```
|
||||
|
||||
#### 2.目录权限
|
||||
`runtime`目录需要写入权限,如果你使用本地存储,`public` 目录也需要有写入权限
|
||||
|
||||
#### 3.URL重写
|
||||
对于Apache服务器,项目目录下的`.htaccess`已经配置好重写规则,如有需求酌情修改.
|
||||
对于Nginx服务器,以下是一个可供参考的配置:
|
||||
```
|
||||
location / {
|
||||
if (!-e $request_filename) {
|
||||
rewrite ^(.*)$ /index.php?s=/$1 last;
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.完成
|
||||
后台地址:`http://您的域名/Admin` 初始用户名:`admin@cloudreve.org` 初始密码:`admin`
|
||||
#### 后续操作
|
||||
以下操作不是必须的,但仍推荐你完成这些操作:
|
||||
* 修改初始账户密码
|
||||
* 到 设置-基础设置 中更改站点URL,如果不更改,程序无法正常接受回调请求
|
||||
* 添加Crontab定时任务 :你的域名/Cron
|
||||
* 如果你打算使用本地上传策略并且不准备开启外链功能,请将·public/uploads·目录设置为禁止外部访问
|
||||
* 如需启用二步验证功能,请依次执行`composer require phpgangsta/googleauthenticator:dev-master` `composer require endroid/qrcode`安装二步验证支持库
|
||||
* 给本项目一个Star~
|
||||
|
||||
文档
|
||||
------------
|
||||
* [完整安装说明](https://github.com/HFO4/Cloudreve/wiki/%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E)
|
||||
* [安装及初次使用FAQ](https://github.com/HFO4/Cloudreve/wiki/%E5%AE%89%E8%A3%85%E5%8F%8A%E5%88%9D%E6%AC%A1%E4%BD%BF%E7%94%A8FAQ)
|
||||
|
||||
许可证
|
||||
------------
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
database.php
|
||||
@@ -409,6 +409,12 @@ class Admin extends Controller{
|
||||
]);
|
||||
}
|
||||
|
||||
public function PolicyAddRemote(){
|
||||
return view('add_policy_remote', [
|
||||
'options' => $this->siteOptions,
|
||||
]);
|
||||
}
|
||||
|
||||
public function About(){
|
||||
$verison = json_decode(file_get_contents(ROOT_PATH . "application/version.json"),true);
|
||||
return view('about', [
|
||||
|
||||
@@ -81,4 +81,11 @@ class Callback extends Controller{
|
||||
$handllerObj -> s3Handler($callbackKey);
|
||||
}
|
||||
|
||||
public function Remote(){
|
||||
ob_end_clean();
|
||||
header('Content-Type: application/json');
|
||||
$handllerObj = new CallbackHandler(file_get_contents("php://input"));
|
||||
$handllerObj -> remoteHandler(Request::instance()->header('Authorization'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ class Member extends Controller{
|
||||
}
|
||||
|
||||
public function ForgetPwd(){
|
||||
if(input('?post.regEmail') && input('?post.captchaCode') && !empty(input('post.captchaCode')) && !empty(input('post.regEmail'))){
|
||||
if(input('?post.regEmail') && !empty(input('post.regEmail'))){
|
||||
$findAction = User::findPwd(input('post.regEmail'),input('post.captchaCode'));
|
||||
if ($findAction[0]){
|
||||
return json(['code' => '200','message' => $findAction[1]]);
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
namespace app\index\model;
|
||||
|
||||
use think\Model;
|
||||
use think\Db;
|
||||
use \app\index\model\Option;
|
||||
|
||||
class B2 extends Model{
|
||||
|
||||
public $policy;
|
||||
private $ak;
|
||||
|
||||
public function __construct($policy){
|
||||
$this->policy = $policy;
|
||||
$akInfo = explode(":",$this->policy["ak"]);
|
||||
$this->ak = $akInfo[0];
|
||||
if(time()-$akInfo[1]>=86000){
|
||||
$this->updateAuth();
|
||||
}
|
||||
}
|
||||
|
||||
private function updateAuth(){
|
||||
$credentials = base64_encode($this->ak . ":" . $this->policy["sk"]);
|
||||
$url = "https://api.backblazeb2.com/b2api/v1/b2_authorize_account";
|
||||
$session = curl_init($url);
|
||||
$headers = array();
|
||||
$headers[] = "Accept: application/json";
|
||||
$headers[] = "Authorization: Basic " . $credentials;
|
||||
curl_setopt($session, CURLOPT_HTTPHEADER, $headers);
|
||||
curl_setopt($session, CURLOPT_HTTPGET, true);
|
||||
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false); //不验证证书
|
||||
curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false); //不验证证书
|
||||
$server_output = curl_exec($session);
|
||||
curl_close ($session);
|
||||
$authInfo = json_decode($server_output,true);
|
||||
Db::name("policy")->where("id",$this->policy["id"])
|
||||
->update([
|
||||
"ak" => $this->ak . ":" . time(),
|
||||
"op_name" => $authInfo["apiUrl"],
|
||||
"url" => $authInfo["downloadUrl"],
|
||||
"op_pwd" => $authInfo["authorizationToken"],
|
||||
]);
|
||||
$this->policy = Db::name("policy")->where("id",$this->policy["id"])->find();
|
||||
$this->updateUploadAuth();
|
||||
}
|
||||
|
||||
private function updateUploadAuth(){
|
||||
$session = curl_init($this->policy["op_name"] . "/b2api/v1/b2_get_upload_url");
|
||||
$data = array("bucketId" => $this->policy["bucketname"]);
|
||||
$post_fields = json_encode($data);
|
||||
curl_setopt($session, CURLOPT_POSTFIELDS, $post_fields);
|
||||
$headers = array();
|
||||
$headers[] = "Authorization: " . $this->policy["op_pwd"];
|
||||
curl_setopt($session, CURLOPT_HTTPHEADER, $headers);
|
||||
curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false); //不验证证书
|
||||
curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false); //不验证证书
|
||||
curl_setopt($session, CURLOPT_POST, true);
|
||||
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
|
||||
$server_output = curl_exec($session);
|
||||
curl_close ($session);
|
||||
$authInfo = json_decode($server_output,true);
|
||||
Db::name("policy")->where("id",$this->policy["id"])
|
||||
->update([
|
||||
"server" => $authInfo["uploadUrl"] . "|" . $authInfo["authorizationToken"],
|
||||
]);
|
||||
$this->policy = Db::name("policy")->where("id",$this->policy["id"])->find();
|
||||
die("");
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -20,6 +20,28 @@ class CallbackHandler extends Model{
|
||||
$this->CallbackData = $data;
|
||||
}
|
||||
|
||||
public function remoteHandler($header){
|
||||
$jsonData = json_decode(base64_decode($this->CallbackData),true);
|
||||
$CallbackSqlData = Db::name('callback')->where('callback_key',$jsonData['callbackkey'])->find();
|
||||
$this->policyData = Db::name('policy')->where('id',$CallbackSqlData['pid'])->find();
|
||||
if(!$this->IsRemoteCallback($header)){
|
||||
$this->setError("Undelegated Request");
|
||||
}
|
||||
if($this->policyData == null){
|
||||
$this->setError("CallbackKey Not Exist.");
|
||||
}
|
||||
if(!FileManage::sotrageCheck($CallbackSqlData["uid"],$jsonData["fsize"])){
|
||||
$this->setError("空间容量不足",true);
|
||||
}
|
||||
$picInfo = $jsonData["picinfo"];
|
||||
$addAction = FileManage::addFile($jsonData,$this->policyData,$CallbackSqlData["uid"],$picInfo);
|
||||
if(!$addAction[0]){
|
||||
$this->setError($addAction[1],true);
|
||||
}
|
||||
FileManage::storageCheckOut($CallbackSqlData["uid"],$jsonData["fsize"]);
|
||||
$this->setSuccess($jsonData['fname']);
|
||||
}
|
||||
|
||||
public function qiniuHandler($header){
|
||||
$jsonData = json_decode($this->CallbackData,true);
|
||||
$CallbackSqlData = Db::name('callback')->where('callback_key',$jsonData['callbackkey'])->find();
|
||||
@@ -172,6 +194,11 @@ class CallbackHandler extends Model{
|
||||
}
|
||||
}
|
||||
|
||||
private function IsRemoteCallback($header){
|
||||
$signKey = hash_hmac("sha256",$this->CallbackData,$this->policyData["sk"]);
|
||||
return ($signKey == $header);
|
||||
}
|
||||
|
||||
public function IsOssCallback($auth,$pubKey){
|
||||
if (empty($auth) || empty($pubKey)){
|
||||
header("http/1.1 403 Forbidden");
|
||||
|
||||
@@ -67,6 +67,9 @@ class FileManage extends Model{
|
||||
case 's3':
|
||||
$fileContent = $this->getS3FileContent();
|
||||
break;
|
||||
case 'remote':
|
||||
$fileContent = $this->getRemoteFileContent();
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -101,6 +104,10 @@ class FileManage extends Model{
|
||||
return file_get_contents($this->s3Preview()[1]);
|
||||
}
|
||||
|
||||
public function getRemoteFileContent(){
|
||||
return file_get_contents($this->remotePreview()[1]);
|
||||
}
|
||||
|
||||
public function saveContent($content){
|
||||
$contentSize = strlen($content);
|
||||
$originSize = $this->fileData["size"];
|
||||
@@ -125,6 +132,9 @@ class FileManage extends Model{
|
||||
case 's3':
|
||||
$this->saveS3Content($content);
|
||||
break;
|
||||
case 'remote':
|
||||
$this->saveRemoteContent($content);
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -180,6 +190,11 @@ class FileManage extends Model{
|
||||
$s3->putObjectString($content, $this->policyData["bucketname"], $this->fileData["pre_name"]);
|
||||
}
|
||||
|
||||
public function saveRemoteContent($content){
|
||||
$remote = new Remote($this->policyData);
|
||||
$remote->updateContent($this->fileData["pre_name"],$content);
|
||||
}
|
||||
|
||||
static function fileNameValidate($value){
|
||||
$validate = new Validate([
|
||||
'val' => 'require|max:250',
|
||||
@@ -338,6 +353,10 @@ class FileManage extends Model{
|
||||
$Redirect = $this->s3Preview();
|
||||
return $Redirect;
|
||||
break;
|
||||
case 'remote':
|
||||
$Redirect = $this->remotePreview();
|
||||
return $Redirect;
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -361,6 +380,10 @@ class FileManage extends Model{
|
||||
$Redirect = $this->getUpyunThumb();
|
||||
return $Redirect;
|
||||
break;
|
||||
case 'remote':
|
||||
$remote = new Remote($this->policyData);
|
||||
return [1,$remote->thumb($this->fileData["pre_name"],explode(",",$this->fileData["pic_info"]))];
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -384,6 +407,9 @@ class FileManage extends Model{
|
||||
case 's3':
|
||||
return $DownloadHandler = $this->s3Download();
|
||||
break;
|
||||
case 'remote':
|
||||
return $DownloadHandler = $this->remoteDownload();
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -473,6 +499,8 @@ class FileManage extends Model{
|
||||
self::upyunDelete($value,$uniquePolicy["upyunPolicyData"][$key][0]);
|
||||
}else if(in_array($key,$uniquePolicy["s3List"])){
|
||||
self::s3Delete($value,$uniquePolicy["s3PolicyData"][$key][0]);
|
||||
}else if(in_array($key,$uniquePolicy["remoteList"])){
|
||||
self::remoteDelete($value,$uniquePolicy["remotePolicyData"][$key][0]);
|
||||
}
|
||||
}
|
||||
return ["result"=>["success"=>true,"error"=>null]];
|
||||
@@ -580,6 +608,12 @@ class FileManage extends Model{
|
||||
self::deleteFileRecord(array_column($fileList, 'id'),array_sum(array_column($fileList, 'size')),$fileList[0]["upload_user"]);
|
||||
}
|
||||
|
||||
static function remoteDelete($fileList,$policyData){
|
||||
$remoteObj = new Remote($policyData);
|
||||
$remoteObj->remove(array_column($fileList, 'pre_name'));
|
||||
self::deleteFileRecord(array_column($fileList, 'id'),array_sum(array_column($fileList, 'size')),$fileList[0]["upload_user"]);
|
||||
}
|
||||
|
||||
static function deleteFileRecord($id,$size,$uid){
|
||||
Db::name('files')->where([
|
||||
'id' => ["in",$id],
|
||||
@@ -673,6 +707,11 @@ class FileManage extends Model{
|
||||
return [1,\S3\S3::aws_s3_link($this->policyData["ak"], $this->policyData["sk"],$this->policyData["bucketname"],"/".$this->fileData["pre_name"],3600,$this->policyData["op_name"])];
|
||||
}
|
||||
|
||||
public function remotePreview(){
|
||||
$remote = new Remote($this->policyData);
|
||||
return [1,$remote->preview($this->fileData["pre_name"])];
|
||||
}
|
||||
|
||||
public function upyunPreview($base=null,$name=null){
|
||||
if(!$this->policyData['bucket_private']){
|
||||
$fileUrl = $this->policyData["url"].$this->fileData["pre_name"]."?auth=0";
|
||||
@@ -753,6 +792,11 @@ class FileManage extends Model{
|
||||
return [1,\S3\S3::aws_s3_link($this->policyData["ak"], $this->policyData["sk"],$this->policyData["bucketname"],"/".$this->fileData["pre_name"],3600,$this->policyData["op_name"],array(),false)];
|
||||
}
|
||||
|
||||
private function remoteDownload(){
|
||||
$remote = new Remote($this->policyData);
|
||||
return [1,$remote->download($this->fileData["pre_name"],$this->fileData["orign_name"])];
|
||||
}
|
||||
|
||||
public function ossDownload(){
|
||||
if(!$this->policyData['bucket_private']){
|
||||
$fileUrl = $this->policyData["url"].$this->fileData["pre_name"]."?response-content-disposition=".urlencode('attachment; filename='.$this->fileData["orign_name"]);
|
||||
@@ -1145,6 +1189,8 @@ class FileManage extends Model{
|
||||
$upyunPolicyData = [];
|
||||
$s3List = [];
|
||||
$s3PolicyData = [];
|
||||
$remoteList = [];
|
||||
$remotePolicyData = [];
|
||||
foreach ($data as $key => $value) {
|
||||
if(!in_array($value['policy_id'],$tempList)){
|
||||
array_push($tempList,$value['policy_id']);
|
||||
@@ -1185,6 +1231,13 @@ class FileManage extends Model{
|
||||
}
|
||||
array_push($s3PolicyData[$value['policy_id']],$policyTempData);
|
||||
break;
|
||||
case 'remote':
|
||||
array_push($remoteList,$value['policy_id']);
|
||||
if(empty($remotePolicyData[$value['policy_id']])){
|
||||
$remotePolicyData[$value['policy_id']] = [];
|
||||
}
|
||||
array_push($remotePolicyData[$value['policy_id']],$policyTempData);
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -1203,6 +1256,8 @@ class FileManage extends Model{
|
||||
'upyunPolicyData' => $upyunPolicyData,
|
||||
's3List' => $s3List,
|
||||
's3PolicyData' => $s3PolicyData,
|
||||
'remoteList' => $remoteList,
|
||||
'remotePolicyData' => $remotePolicyData,
|
||||
);
|
||||
return $returenValue;
|
||||
}
|
||||
@@ -1227,7 +1282,10 @@ class FileManage extends Model{
|
||||
$delayTime = time()+$timeOut;
|
||||
$key=$this->fileData["id"].":".$delayTime.":".md5($this->userData["user_pass"].$this->fileData["id"].$delayTime.config("salt"));
|
||||
return $options['siteURL']."Callback/TmpPreview/key/".$key;
|
||||
break;
|
||||
break;
|
||||
case 'remote':
|
||||
return $this->remotePreview()[1];
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
namespace app\index\model;
|
||||
|
||||
use think\Model;
|
||||
use think\Db;
|
||||
use \app\index\model\Option;
|
||||
|
||||
class Remote extends Model{
|
||||
|
||||
public $sk;
|
||||
private $policy;
|
||||
private $serverOutput;
|
||||
private $httpCode;
|
||||
|
||||
public function __construct($policy){
|
||||
$this->policy = $policy;
|
||||
}
|
||||
|
||||
public function remove($fileList){
|
||||
$signKey = $this->sign($fileList,"DELETE");
|
||||
$this->send("manager.php",$signKey,"DELETE",base64_encode(json_encode($fileList)));
|
||||
}
|
||||
|
||||
public function preview($fname){
|
||||
return $this->signUrl($this->policy["url"]."object.php?action=preview&name=".urlencode($fname)."&expires=".(time()+(int)Option::getValue("timeout")));
|
||||
}
|
||||
|
||||
public function clean(){
|
||||
return $this->signUrl($this->policy["url"]."object.php?action=clean&expires=".(time()+(int)Option::getValue("timeout")));
|
||||
}
|
||||
|
||||
public function download($fname,$attnanme){
|
||||
return $this->signUrl($this->policy["url"]."object.php?action=download&name=".urlencode($fname)."&attaname=".urlencode($attnanme)."&expires=".(time()+(int)Option::getValue("timeout")));
|
||||
}
|
||||
|
||||
public function thumb($fname,$picInfo){
|
||||
return $this->signUrl($this->policy["url"]."object.php?action=thumb&name=".urlencode($fname)."&expires=".(time()+(int)Option::getValue("timeout"))."&w=".$picInfo[0]."&h=".$picInfo[1]);
|
||||
}
|
||||
|
||||
public function signUrl($url){
|
||||
$signKey = hash_hmac("sha256",$url,"GET".$this->policy["sk"]);
|
||||
return $url."&auth=".$signKey;
|
||||
}
|
||||
|
||||
public function updateContent($fname,$content){
|
||||
$object = ["fname"=>$fname,"content"=>$content];
|
||||
$signKey = $this->sign($object,"UPDATE");
|
||||
$this->send("manager.php",$signKey,"UPDATE",base64_encode(json_encode($object)));
|
||||
}
|
||||
|
||||
public function send($target,$auth,$action,$object){
|
||||
$session = curl_init($this->policy["server"].$target);
|
||||
$postData = array(
|
||||
"action" => $action,
|
||||
"auth" => $auth,
|
||||
"object" => $object,
|
||||
);
|
||||
curl_setopt($session, CURLOPT_POST, 1);
|
||||
curl_setopt($session, CURLOPT_POSTFIELDS, $postData);
|
||||
curl_setopt($session, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false);
|
||||
$this->serverOutput = curl_exec($session);
|
||||
$this->httpCode = curl_getinfo($session,CURLINFO_HTTP_CODE);
|
||||
echo $this->serverOutput;
|
||||
}
|
||||
|
||||
public function sign($content,$method = null){
|
||||
return hash_hmac("sha256",base64_encode(json_encode($content)),$method.$this->policy["sk"]);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -228,6 +228,9 @@ class UploadHandler extends Model{
|
||||
case 's3':
|
||||
return $this->getS3Token();
|
||||
break;
|
||||
case 'remote':
|
||||
return $this->getRemoteToken();
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
@@ -295,6 +298,35 @@ class UploadHandler extends Model{
|
||||
return $token;
|
||||
}
|
||||
|
||||
private function getRemoteToken(){
|
||||
$callbackKey = $this->getRandomKey();
|
||||
$sqlData = [
|
||||
'callback_key' => $callbackKey,
|
||||
'pid' => $this->policyId,
|
||||
'uid' => $this->userId
|
||||
];
|
||||
Db::name('callback')->insert($sqlData);
|
||||
$policy = array(
|
||||
'callbackUrl' =>Option::getValue("siteURL").'Callback/Remote',
|
||||
'callbackKey' => $callbackKey,
|
||||
'callbackBodyType' => 'application/json',
|
||||
'fsizeLimit' => (int)$this->policyContent['max_size'],
|
||||
'uid' => $this->userId,
|
||||
);
|
||||
$dirName = $this->getObjName($this->policyContent['dirrule']);
|
||||
if($this->policyContent["autoname"]){
|
||||
$policy = array_merge($policy,array("saveKey" => $dirName.(empty($dirName)?"":"/").$this->getObjName($this->policyContent['namerule'])));
|
||||
}else{
|
||||
$policy = array_merge($policy,array("saveKey" => $dirName.(empty($dirName)?"":"/")."$(fname)"));
|
||||
}
|
||||
if(!empty($this->policyContent['mimetype'])){
|
||||
$policy = array_merge($policy,array("mimeLimit" => $this->policyContent['mimetype']));
|
||||
}
|
||||
$signingKey = hash_hmac("sha256",json_encode($policy),"UPLOAD".$this->policyContent['sk']);
|
||||
$token = $signingKey. ":" .base64_encode(json_encode($policy));
|
||||
return $token;
|
||||
}
|
||||
|
||||
static function upyunSign($key, $secret, $method, $uri, $date, $policy=null, $md5=null){
|
||||
$elems = array();
|
||||
foreach (array($method, $uri, $date, $policy, $md5) as $v){
|
||||
|
||||
@@ -87,7 +87,7 @@ class User extends Model{
|
||||
* @return [type] [description]
|
||||
*/
|
||||
static function register($userEmail,$userPass,$captchaCode){
|
||||
if(Option::getValue("login_captcha")=="1"){
|
||||
if(Option::getValue("reg_captcha")=="1"){
|
||||
if(!self::checkCaptcha($captchaCode)){
|
||||
return [false,"验证码错误"];
|
||||
}
|
||||
@@ -193,7 +193,7 @@ class User extends Model{
|
||||
}
|
||||
|
||||
static function findPwd($email,$captchaCode){
|
||||
if(Option::getValue("login_captcha")=="1"){
|
||||
if(Option::getValue("forget_captcha")=="1"){
|
||||
if(!self::checkCaptcha($captchaCode)){
|
||||
return [false,"验证码错误"];
|
||||
}
|
||||
|
||||
@@ -67,11 +67,21 @@
|
||||
<img class="card-img-top" src="/static/img/s3.png" alt="Card image cap">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Amazon S3</h5>
|
||||
<p class="card-text"><a href="https://aws.amazon.com/cn/s3/?nc1=h_ls" target="_blank">Amazon S3</a>专为从任意位置存储和检索任意数量的数据而构建的对象存储</p>
|
||||
<p class="card-text"><a href="https://aws.amazon.com/cn/s3/?nc1=h_ls" target="_blank">Amazon S3</a>专为数据而构建的对象存储</p>
|
||||
<a href="/Admin/PolicyAddS3" class="btn btn-primary">添加</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3 mt-2 md-2">
|
||||
<div class="card cloud">
|
||||
<img class="card-img-top" src="/static/img/remote.png" alt="Card image cap">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">远程服务器</h5>
|
||||
<p class="card-text">你可以将文件存放在不同于主程序的服务器上。<a href="https://github.com/HFO4/Cloudreve/wiki/%E8%BF%9C%E7%A8%8B%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA">配置说明</a></p>
|
||||
<a href="/Admin/PolicyAddRemote" class="btn btn-primary">添加</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
{extend name="header_admin" /}
|
||||
{block name="title"}添加上传策略- {$options.siteName}{/block}
|
||||
{block name="content"}
|
||||
<div class="content-wrapper">
|
||||
<div class="container-fluid">
|
||||
<!-- Breadcrumbs-->
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item">
|
||||
<a href="/Admin">管理面板</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item">
|
||||
<a href="/Admin/PolicyAdd">上传策略</a>
|
||||
</li>
|
||||
<li class="breadcrumb-item active">添加</li>
|
||||
</ol>
|
||||
|
||||
<!-- Area Chart Example-->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h2>添加上传策略</h2>
|
||||
<br>
|
||||
|
||||
|
||||
<div class="card" id="s3" >
|
||||
<div class="card-header">
|
||||
添加远程上传策略
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="qiniuPolicy">
|
||||
<input type="text" class="form-control" name="policy_type" value="remote" style="display: none">
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="policy_name" class="col-form-label col-form-label-sm">上传策略名称</label>
|
||||
</div>
|
||||
<div class="col-md-4"> <input type="text" class="form-control" name="policy_name" required></div>
|
||||
<div class="col-md-4 option-des"> 上传策略的名称,用于区别不同策略</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="ak" class="col-form-label col-form-label-sm">AccessToken </label>
|
||||
</div>
|
||||
<div class="col-md-4"> <input type="text" class="form-control" name="sk" required></div>
|
||||
<div class="col-md-4 option-des"> 默认随机生成,请与远程服务端配置文件中保持一致</div>
|
||||
</div>
|
||||
|
||||
<input type="text" class="form-control" name="ak" value="0" style="display: none" required>
|
||||
|
||||
<input type="text" name="bucket_private" value="1" style="display: none">
|
||||
<input type="text" name="origin_link" value="0" style="display: none">
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="url" class="col-form-label col-form-label-sm">服务端URL</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" name="server" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 结尾要加"/"</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="url" class="col-form-label col-form-label-sm">下载根URL</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" name="url" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 一般与上一步保持一致,结尾要加"/"</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="filetype" class="col-form-label col-form-label-sm">单文件最大大小</label>
|
||||
</div>
|
||||
<div class="col-md-4 input-group mb-3">
|
||||
<input type="number" class="form-control" name="max_size" spellcheck="false" min="0" value="10" required>
|
||||
<div class="input-group-append">
|
||||
<span class="input-group-text" id="basic-addon2">
|
||||
<select name="sizeTimes" class="selectIn">
|
||||
<option value="1">B</option>
|
||||
<option value="1024">KB</option>
|
||||
<option value="1048576" selected>MB</option>
|
||||
<option value="1073741824">GB</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 允许上传的单个文件的最大尺寸</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="filetype" class="col-form-label col-form-label-sm">文件重命名</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input class="" type="radio" name="autoname" id="autoname1" value="1" checked>
|
||||
<label class="" for="autoname1" >开启</label>
|
||||
|
||||
<input class="" type="radio" name="autoname" id="autoname2" value="0" >
|
||||
<label class="" for="autoname2">关闭</label>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 是否对存储的文件自动重命名。推荐开启,重命名不会影响用户端文件名展示,开启后可以避免文件重名</div>
|
||||
</div>
|
||||
<div class="row form-setting" id="autoname_form" >
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="url" class="col-form-label col-form-label-sm">重命名规则</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" name="namerule" value="{uid}_{randomkey8}_{originname}" spellcheck="false" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 你可以使用变量对照表中的字段填写</div>
|
||||
</div>
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="filetype" class="col-form-label col-form-label-sm">存储目录</label>
|
||||
</div>
|
||||
<div class="col-md-4 input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" id="basic-addon2">
|
||||
/public/uploads/
|
||||
</span>
|
||||
</div>
|
||||
<input type="text" class="form-control" name="dirrule" spellcheck="false" value="{date}/{uid}" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 文件存放的目录,你可以使用目录变量对照表中的字段填写</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
</div>
|
||||
<div class="col-md-4"> <button type="submit" class="btn btn-primary" id="saveQiniu">保存设置</button></div>
|
||||
<div class="col-md-4 option-des"> </div>
|
||||
<br> <br>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<bn>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<br>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Example DataTables Card-->
|
||||
</div>
|
||||
<!-- /.container-fluid-->
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script src="/static/js/admin/add_policy.js"></script>
|
||||
<script type="text/javascript">
|
||||
function randomString(len) {
|
||||
len = len || 32;
|
||||
var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
|
||||
var maxPos = $chars.length;
|
||||
var pwd = '';
|
||||
for (i = 0; i < len; i++) {
|
||||
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
|
||||
}
|
||||
return pwd;
|
||||
}
|
||||
$("[name='sk']").val(randomString(32));
|
||||
</script>
|
||||
{/block}
|
||||
@@ -48,7 +48,7 @@
|
||||
</div>
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="colFormLabelSm" class="col-form-label col-form-label-sm">站点关键词</label>
|
||||
<label for="colFormLabelSm" class="col-form-label col-form-label-sm">站点描述</label>
|
||||
</div>
|
||||
<div class="col-md-4"> <input type="text" class="form-control" name="siteDes" value="{$options.siteDes}"></div>
|
||||
<div class="col-md-4 option-des"> 位于首页meta标签内的站点描述</div>
|
||||
|
||||
@@ -684,7 +684,7 @@
|
||||
{case value="s3"}
|
||||
<div class="card" id="s3" >
|
||||
<div class="card-header">
|
||||
添加S3上传策略
|
||||
编辑S3上传策略
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="Policy">
|
||||
@@ -803,6 +803,130 @@
|
||||
<bn>
|
||||
</div>
|
||||
|
||||
{/case}
|
||||
{case value="remote"}
|
||||
<div class="card" id="remote" >
|
||||
<div class="card-header">
|
||||
编辑远程上传策略
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="Policy">
|
||||
<input type="text" value="{$policy.id}" name="id" style="display: none">
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="policy_name" class="col-form-label col-form-label-sm">上传策略名称</label>
|
||||
</div>
|
||||
<div class="col-md-4"> <input type="text" class="form-control" value="{$policy.policy_name}" name="policy_name" required></div>
|
||||
<div class="col-md-4 option-des"> 上传策略的名称,用于区别不同策略</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="ak" class="col-form-label col-form-label-sm">AccessToken </label>
|
||||
</div>
|
||||
<div class="col-md-4"> <input type="text" class="form-control" name="sk" value="{$policy.sk}" required></div>
|
||||
<div class="col-md-4 option-des"> 默认随机生成,请与远程服务端配置文件中保持一致</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="url" class="col-form-label col-form-label-sm">服务端URL</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" name="server" value="{$policy.server}" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 结尾要加"/"</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="url" class="col-form-label col-form-label-sm">下载根URL</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" name="url" value="{$policy.url}" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 一般与上一步保持一致,结尾要加"/"</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="filetype" class="col-form-label col-form-label-sm">单文件最大大小</label>
|
||||
</div>
|
||||
<div class="col-md-4 input-group mb-3">
|
||||
<input type="number" class="form-control" name="max_size" spellcheck="false" min="0" value="{:countSize($policy.max_size,true)[0]}" required>
|
||||
<div class="input-group-append">
|
||||
<span class="input-group-text" id="basic-addon2">
|
||||
<select name="sizeTimes" class="selectIn" data-value="{:countSize($policy.max_size,true)[1]}">
|
||||
<option value="1">B</option>
|
||||
<option value="1024">KB</option>
|
||||
<option value="1048576" >MB</option>
|
||||
<option value="1073741824">GB</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 允许上传的单个文件的最大尺寸</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="filetype" class="col-form-label col-form-label-sm">文件重命名</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
{eq name="$policy.autoname" value="1"}
|
||||
<input class="" type="radio" name="autoname" id="autoname1" value="1" checked>
|
||||
<label class="" for="autoname1" >开启</label>
|
||||
|
||||
<input class="" type="radio" name="autoname" id="autoname2" value="0" >
|
||||
<label class="" for="autoname2">关闭</label>
|
||||
{else/}
|
||||
<input class="" type="radio" name="autoname" id="autoname1" value="1" >
|
||||
<label class="" for="autoname1" >开启</label>
|
||||
|
||||
<input class="" type="radio" name="autoname" id="autoname2" value="0" checked>
|
||||
<label class="" for="autoname2" >关闭</label>
|
||||
{/eq}
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 是否对存储的文件自动重命名。推荐开启,重命名不会影响用户端文件名展示,开启后可以避免文件重名</div>
|
||||
</div>
|
||||
<div class="row form-setting" id="autoname_form" style=" {eq name="$policy.autoname" value="0"}display:none{/eq}">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="url" class="col-form-label col-form-label-sm">重命名规则</label>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" name="namerule" value="{$policy.namerule}" spellcheck="false" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 你可以使用<a href="javascript:void()" data-toggle="modal" data-target="#varTable">变量对照表</a>中的字段填写</div>
|
||||
</div>
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
<label for="filetype" class="col-form-label col-form-label-sm">存储目录</label>
|
||||
</div>
|
||||
<div class="col-md-4 input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" id="basic-addon2">
|
||||
/public/uploads/
|
||||
</span>
|
||||
</div>
|
||||
<input type="text" class="form-control" name="dirrule" spellcheck="false" value="{$policy.dirrule}" required>
|
||||
</div>
|
||||
<div class="col-md-4 option-des"> 文件存放的目录,你可以使用<a href="javascript:void()" data-toggle="modal" data-target="#varTableFolder">目录变量对照表</a>中的字段填写</div>
|
||||
</div>
|
||||
|
||||
<div class="row form-setting">
|
||||
<div class="col-md-1 form-label ">
|
||||
</div>
|
||||
<div class="col-md-4"> <button type="submit" class="btn btn-primary" id="savePolicy">保存设置</button></div>
|
||||
<div class="col-md-4 option-des"> </div>
|
||||
<br> <br>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<bn>
|
||||
</div>
|
||||
|
||||
{/case}
|
||||
{/switch}
|
||||
<br>
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link selectLab" href="javascript:void()" data-policy="s3">S3</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link selectLab" href="javascript:void()" data-policy="remote">远程</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -78,6 +81,7 @@
|
||||
{case value="oss"}OSS{/case}
|
||||
{case value="upyun"}又拍云{/case}
|
||||
{case value="s3"}Amazon S3{/case}
|
||||
{case value="remote"}远程{/case}
|
||||
{default /}其他
|
||||
{/switch}
|
||||
</td>
|
||||
|
||||
@@ -1,34 +1,22 @@
|
||||
<!doctype html>
|
||||
<html lang="en" data-ng-app="FileManagerApp">
|
||||
<html lang="zh_cn" data-ng-app="FileManagerApp">
|
||||
<head>
|
||||
<!--
|
||||
* Angular FileManager v1.5.1 (https://github.com/joni2back/angular-filemanager)
|
||||
* Jonas Sciangula Street <joni2back@gmail.com>
|
||||
* Licensed under MIT (https://github.com/joni2back/angular-filemanager/blob/master/LICENSE)
|
||||
-->
|
||||
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
|
||||
<meta charset="utf-8">
|
||||
<title>我的文件 - {$options.siteName}</title>
|
||||
<!-- third party -->
|
||||
<script src="/static/js/angular.min.js"></script>
|
||||
<script src="/static/js/angular-translate.min.js"></script>
|
||||
|
||||
<script src="/static/js/jquery.min.js"></script>
|
||||
<link rel="stylesheet" href="/static/css/bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="/static/css/material.css" />
|
||||
|
||||
<script src="/static/js/bootstrap.min.js"></script>
|
||||
<link rel="stylesheet" href="/static/css/font-awesome.min.css">
|
||||
<!-- /third party -->
|
||||
<!-- Comment if you need to use raw source code -->
|
||||
<link href="/static/css/angular-filemanager.min.css" rel="stylesheet">
|
||||
<link href="/static/css/toastr.min.css" rel="stylesheet">
|
||||
<script type="text/javascript" src="/static/js/toastr.min.js"></script>
|
||||
<script src="/static/js/angular-filemanager.min.js"></script>
|
||||
<link rel="stylesheet" href="/static/css/photoswipe.css">
|
||||
<link rel="stylesheet" href="/static/css/default-skin/default-skin.css">
|
||||
|
||||
<!-- /Comment if you need to use raw source code -->
|
||||
<script type="text/javascript">
|
||||
uploadConfig={
|
||||
saveType : "{$policyData.policy_type}",
|
||||
@@ -106,4 +94,4 @@ upload_load=0;
|
||||
|
||||
</script>
|
||||
{$options.js_code}
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<!--Video-->
|
||||
<div class="intro-video view" id="home">
|
||||
<img src="static/img/output.jpg">
|
||||
|
||||
|
||||
|
||||
<div class="hm-gradient">
|
||||
@@ -16,7 +16,8 @@
|
||||
<hr class="hr-light">
|
||||
<h4 class="subtext-header mt-2 mb-2">只需十秒钟,注册后即可开始使用免费高速的云存储服务</h4>
|
||||
</div>
|
||||
<a href="/Login" class="btn btn-rounded btn-light-green-2" ><i class="fa fa-paper-plane-o"></i> 立即注册</a>
|
||||
<a href="/Login" class="btn btn-rounded btn-light-green-2" ><i class="fa fa-paper-plane-o"></i> 注册</a>
|
||||
<a href="/Home" class="btn btn-rounded btn-light-green-2" ><i class="fa fa-sign-in"></i> 登录</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!doctype html>
|
||||
<html lang="en" data-ng-app="FileManagerApp">
|
||||
<html lang="zh_cn" data-ng-app="FileManagerApp">
|
||||
<head>
|
||||
<!--
|
||||
* Angular FileManager v1.5.1 (https://github.com/joni2back/angular-filemanager)
|
||||
@@ -80,4 +80,4 @@ upload_load=0;
|
||||
|
||||
</script>
|
||||
{$options.js_code}
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -15,7 +15,7 @@ Route::rule([
|
||||
's/:key'=>'index/Share/index',
|
||||
'Share/Download/:key'=>'index/Share/Download',
|
||||
'Share/Preview/:key'=>'index/Share/Preview',
|
||||
'Share/List/:key'=>'index/Share/List',
|
||||
'Share/ListFile/:key'=>'index/Share/ListFile',
|
||||
'Login'=>'index/Member/LoginForm',
|
||||
'Member/emailActivate/:key'=>'index/Member/emailActivate',
|
||||
'Member/resetPwd/:key'=>'index/Member/resetPwd',
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"type":"","version":"1.0 Beta","version_id":1}
|
||||
{"type":"","version":"1.0.2","version_id":3}
|
||||
+31
-19
@@ -6,33 +6,45 @@
|
||||
"type": "project",
|
||||
"license": "GPL-3.0-only",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Aaron",
|
||||
"email": "abslant@foxmail.com",
|
||||
"homepage": "https://aoaoao.me",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Qnner",
|
||||
"email": "admin@qnner.com",
|
||||
"homepage": "http://me.qnner.com",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "dune",
|
||||
"email": "rainaysann@gmail.com",
|
||||
"homepage": "https://github.com/rainays",
|
||||
"role": "Developer"
|
||||
}
|
||||
{
|
||||
"name": "Aaron",
|
||||
"email": "abslant@foxmail.com",
|
||||
"homepage": "https://aoaoao.me",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "Qnner",
|
||||
"email": "admin@qnner.com",
|
||||
"homepage": "http://me.qnner.com",
|
||||
"role": "Developer"
|
||||
},
|
||||
{
|
||||
"name": "dune",
|
||||
"email": "rainaysann@gmail.com",
|
||||
"homepage": "https://github.com/rainays",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"ext-curl":"*",
|
||||
"ext-fileinfo":"*",
|
||||
"ext-gd":"*",
|
||||
"topthink/think-captcha":"1.*",
|
||||
"endroid/qrcode": "1.*",
|
||||
"aliyuncs/oss-sdk-php": "~2.0",
|
||||
"sabre/dav":"~3.2.0",
|
||||
"upyun/sdk": "^3.3"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"CloudreveInstaller\\Installer" : ""
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"post-install-cmd": [
|
||||
"CloudreveInstaller\\Installer::startInstall"
|
||||
],
|
||||
"post-create-project-cmd" : [
|
||||
"CloudreveInstaller\\Installer::startInstall"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
@@ -1,2 +1,3 @@
|
||||
*
|
||||
!.gitignore
|
||||
!.gitignore
|
||||
!chunks
|
||||
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
Vendored
+2
File diff suppressed because one or more lines are too long
@@ -1 +1,4 @@
|
||||
.header-panel{background-color:#3f51b5;height:250px;position:relative;z-index:3}.header-panel div{position:relative;height:100%}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.navbar{margin-bottom:0}.main{position:relative;top:-180px;z-index:4;overflow:hidden}.jumbotron{padding:0!important;transition:all .2s linear;background-color:rgba(255,255,255,0)!important}.jumbotron:hover{box-shadow:1px 4px 8px 0 rgba(0,0,0,.2),1px 3px 6px 0 rgba(0,0,0,.19)!important;transition:box-shadow .2s}.l-block{background:#fff;border-radius:2px;max-width:350px;width:100%;vertical-align:middle;position:relative;display:none;text-align:left}.palette-Teal.bg{background-color:#009688}.card_top{border-top-left-radius:2px;border-top-right-radius:2px}.card_botom{background-color:#f7f7f7;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.card-top-row{padding:25px 30px;color:#fff}.top-color{background-color:#3f51b5;margin-right:0;margin-left:0;border-top-left-radius:2px;border-top-right-radius:2px}.bottom-width{margin-right:0;margin-left:0;padding:25px;padding-top:5px}.login-icon{font-size:40px}.login-text{margin-top:10px;margin-left:-5px}.form-group{padding-bottom:0}.noWave{display:initial}.link-group{margin-left:5px;line-height:25px}[alt=captcha]{width:150px}
|
||||
.header-panel{background-color:#3f51b5;height:250px;position:relative;z-index:3}.header-panel div{position:relative;height:100%}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.navbar{margin-bottom:0}.main{position:relative;top:-180px;z-index:4;overflow:hidden}.jumbotron{padding:0!important;transition:all .2s linear;background-color:rgba(255,255,255,0)!important}.jumbotron:hover{box-shadow:1px 4px 8px 0 rgba(0,0,0,.2),1px 3px 6px 0 rgba(0,0,0,.19)!important;transition:box-shadow .2s}.l-block{background:#fff;border-radius:2px;max-width:350px;width:100%;vertical-align:middle;position:relative;display:none;text-align:left}.palette-Teal.bg{background-color:#009688}.card_top{border-top-left-radius:2px;border-top-right-radius:2px}.card_botom{background-color:#f7f7f7;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.card-top-row{padding:25px 30px;color:#fff}.top-color{background-color:#3f51b5;margin-right:0;margin-left:0;border-top-left-radius:2px;border-top-right-radius:2px}.bottom-width{margin-right:0;margin-left:0;padding:25px;padding-top:5px}.login-icon{font-size:40px}.login-text{margin-top:10px;margin-left:-5px}.form-group{padding-bottom:0}.noWave{display:initial}.link-group{margin-left:5px;line-height:25px}[alt=captcha]{width:150px}
|
||||
.form-group.is-focused label, .form-group.is-focused label.control-label {
|
||||
color: #3F51B5;
|
||||
}
|
||||
+4
-1
@@ -1 +1,4 @@
|
||||
.intro-page .navbar:not(.top-nav-collapse){background:0 0!important;box-shadow:none}.full-height,.full-height body,.full-height header,.full-height header .view{height:100%}.intro-page .navbar:not(.top-nav-collapse){background:0 0!important;box-shadow:none}.creative-lp .navbar{background-color:#6d7275}.grey-skin .navbar{background-color:#7d8488}.navbar{font-weight:300}.navbar.navbar-dark .navbar-brand{color:#fff}.navbar .navbar-brand{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;overflow:visible}.full-height,.full-height body,.full-height header,.full-height header .view{height:100%}header .view{position:relative;width:100%;height:auto;background-repeat:no-repeat;background-position:center center;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;-o-background-size:cover}header .view{position:relative;width:100%;height:auto;background-repeat:no-repeat;background-position:center center;background-size:cover}.view{overflow:hidden;position:relative;cursor:default}.creative-lp .hm-gradient .full-bg-img{background:-moz-linear-gradient(45deg,rgba(153,122,226,.6),rgba(3,3,4,.6) 100%);background:-webkit-linear-gradient(45deg,rgba(153,122,226,.6),rgba(3,3,4,.6) 100%);background:linear-gradient(to 45deg,rgba(153,122,226,.6),rgba(3,3,4,.6) 100%)}.full-bg-img{height:100%;width:100%;position:absolute;overflow:hidden;top:0;left:0}.card .card-circle,.card-overlay,.flex-center,.section.team-section .avatar,.testimonial-carousel .testimonial .avatar{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:100%}.white-text{color:#FFF!important}.brand-name{font-size:4.5rem}.font-bold{font-weight:500}.mb-2{margin-bottom:1.5rem!important}.hr-streak hr.hr-light,.intro hr.hr-light,.intro-video hr.hr-light{margin-left:31%;margin-right:31%;background-color:#fff;height:1px}.hr-streak hr,.intro hr,.intro-video hr{margin:1.5rem 0 1.5rem 0}.hr-light{background-color:#fff;height:.5px}.subtext-header{line-height:1.5}.btn-light-green-2{background:#00bfa5}.btn-rounded{-webkit-border-radius:10em;-moz-border-radius:10em;-ms-border-radius:10em;-o-border-radius:10em;border-radius:10em!important}.btn{border-radius:2px;border:0;transition:.2s ease-out;color:#fff!important;margin:6px;white-space:normal!important;word-wrap:break-word;text-transform:uppercase}.btn{font-size:.8rem;padding:.85rem 2.13rem}.badge,.btn,.btn-floating,.card,.card-cascade-2 .card-block,.card-cascade.wider .card-block,.card-wrapper .back,.card-wrapper .front,.cascading-media .view,.chip,.dropdown-content,.dropdown-menu,.jumbotron,.list-group,.modal-dialog.cascading-modal .modal-c-tabs .nav-tabs,.modal-dialog.modal-notify .modal-header,.navbar,.navbar .nav-item .dropdown-menu.dropdown a:active,.navbar .nav-item .dropdown-menu.dropdown a:focus,.navbar .nav-item .dropdown-menu.dropdown a:hover,.pager li a,.pagination .active .page-link,.popover,.pricing-card .price .version,.social-list,.top-nav-collapse,.z-depth-1{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.btn,.btn-floating{transition:.5s}
|
||||
.intro-page .navbar:not(.top-nav-collapse){background:0 0!important;box-shadow:none}.full-height,.full-height body,.full-height header,.full-height header .view{height:100%}.intro-page .navbar:not(.top-nav-collapse){background:0 0!important;box-shadow:none}.creative-lp .navbar{background-color:#6d7275}.grey-skin .navbar{background-color:#7d8488}.navbar{font-weight:300}.navbar.navbar-dark .navbar-brand{color:#fff}.navbar .navbar-brand{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;overflow:visible}.full-height,.full-height body,.full-height header,.full-height header .view{height:100%}header .view{position:relative;width:100%;height:auto;background-repeat:no-repeat;background-position:center center;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;-o-background-size:cover}header .view{position:relative;width:100%;height:auto;background-repeat:no-repeat;background-position:center center;background-size:cover}.view{overflow:hidden;position:relative;cursor:default}.creative-lp .hm-gradient .full-bg-img{background:-moz-linear-gradient(45deg,rgba(153,122,226,.6),rgba(3,3,4,.6) 100%);background:-webkit-linear-gradient(45deg,rgba(153,122,226,.6),rgba(3,3,4,.6) 100%);background:linear-gradient(to 45deg,rgba(153,122,226,.6),rgba(3,3,4,.6) 100%)}.full-bg-img{height:100%;width:100%;position:absolute;overflow:hidden;top:0;left:0}.card .card-circle,.card-overlay,.flex-center,.section.team-section .avatar,.testimonial-carousel .testimonial .avatar{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:100%}.white-text{color:#FFF!important}.brand-name{font-size:4.5rem}.font-bold{font-weight:500}.mb-2{margin-bottom:1.5rem!important}.hr-streak hr.hr-light,.intro hr.hr-light,.intro-video hr.hr-light{margin-left:31%;margin-right:31%;background-color:#fff;height:1px}.hr-streak hr,.intro hr,.intro-video hr{margin:1.5rem 0 1.5rem 0}.hr-light{background-color:#fff;height:.5px}.subtext-header{line-height:1.5}.btn-light-green-2{background:#00bfa5}.btn-rounded{-webkit-border-radius:10em;-moz-border-radius:10em;-ms-border-radius:10em;-o-border-radius:10em;border-radius:10em!important}.btn{border-radius:2px;border:0;transition:.2s ease-out;color:#fff!important;margin:6px;white-space:normal!important;word-wrap:break-word;text-transform:uppercase}.btn{font-size:.8rem;padding:.85rem 2.13rem}.badge,.btn,.btn-floating,.card,.card-cascade-2 .card-block,.card-cascade.wider .card-block,.card-wrapper .back,.card-wrapper .front,.cascading-media .view,.chip,.dropdown-content,.dropdown-menu,.jumbotron,.list-group,.modal-dialog.cascading-modal .modal-c-tabs .nav-tabs,.modal-dialog.modal-notify .modal-header,.navbar,.navbar .nav-item .dropdown-menu.dropdown a:active,.navbar .nav-item .dropdown-menu.dropdown a:focus,.navbar .nav-item .dropdown-menu.dropdown a:hover,.pager li a,.pagination .active .page-link,.popover,.pricing-card .price .version,.social-list,.top-nav-collapse,.z-depth-1{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.btn,.btn-floating{transition:.5s}
|
||||
.intro-video{
|
||||
background-image: url(/static/img/output.jpg);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
Vendored
+2
File diff suppressed because one or more lines are too long
Vendored
+3
-7
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+78
-45
@@ -62,27 +62,27 @@
|
||||
cache: true
|
||||
});
|
||||
openUpload = function() {
|
||||
$("#pickfiles").css("z-index", "9999");
|
||||
$('#upload_modal').modal();
|
||||
if (!upload_load) {
|
||||
$("#up_text").html("正在加载上传组件...");
|
||||
$.getScript("/static/js/moxie.js").done(function() {
|
||||
$.getScript("/static/js/plupload.dev.js").done(function() {
|
||||
$.getScript("/static/js/i18n/zh_CN.js").done(function() {
|
||||
$.getScript("/static/js/ui.js").done(function() {
|
||||
$.getScript("/static/js/qiniu.js").done(function() {
|
||||
$.getScript("/static/js/main.js");
|
||||
$("#up_text").html("选择文件");
|
||||
toastr.clear();
|
||||
upload_load = 1;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
$("[class='moxie-shim moxie-shim-html5']").show();
|
||||
}
|
||||
$("#pickfiles").css("z-index", "9999");
|
||||
$('#upload_modal').modal();
|
||||
if (!upload_load) {
|
||||
$("#up_text").html("正在加载上传组件...");
|
||||
$.getScript("/static/js/moxie.js").done(function() {
|
||||
$.getScript("/static/js/plupload.dev.js").done(function() {
|
||||
$.getScript("/static/js/i18n/zh_CN.js").done(function() {
|
||||
$.getScript("/static/js/ui.js").done(function() {
|
||||
$.getScript("/static/js/qiniu.js").done(function() {
|
||||
$.getScript("/static/js/main.js");
|
||||
$("#up_text").html("选择文件");
|
||||
toastr.clear();
|
||||
upload_load = 1;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
} else {
|
||||
$("[class='moxie-shim moxie-shim-html5']").show();
|
||||
}
|
||||
}
|
||||
function closeUpload() {
|
||||
$('#upload_modal').modal('hide');
|
||||
@@ -95,12 +95,12 @@
|
||||
})
|
||||
});
|
||||
function includeCss(filename) {
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
var link = document.createElement('link');
|
||||
link.href = filename;
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
head.appendChild(link)
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
var link = document.createElement('link');
|
||||
link.href = filename;
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
head.appendChild(link)
|
||||
}
|
||||
function loadMdEditor(result){
|
||||
if (mdLoad == 0) {
|
||||
@@ -114,17 +114,17 @@
|
||||
$.getScript("/static/js/mdeditor/squire-raw.js").done(function() {
|
||||
$.when(
|
||||
$.ajax({
|
||||
async: false,
|
||||
url: "/static/js/mdeditor/tui-editor-Editor-all.min.js",
|
||||
dataType: "script"
|
||||
async: false,
|
||||
url: "/static/js/mdeditor/tui-editor-Editor-all.min.js",
|
||||
dataType: "script"
|
||||
})).done(function(){
|
||||
editor = new tui.Editor({
|
||||
el: document.querySelector('#md'),
|
||||
initialEditType: 'markdown',
|
||||
previewStyle: 'vertical',
|
||||
height: 'auto',
|
||||
initialValue: result,
|
||||
language:"zh",
|
||||
el: document.querySelector('#md'),
|
||||
initialEditType: 'markdown',
|
||||
previewStyle: 'vertical',
|
||||
height: 'auto',
|
||||
initialValue: result,
|
||||
language:"zh",
|
||||
});
|
||||
|
||||
toastr.clear();
|
||||
@@ -154,7 +154,7 @@
|
||||
|
||||
function audioPause() {
|
||||
document.getElementById('audiopreview-target').pause();
|
||||
document.getElementById('videopreview-target').pause();
|
||||
dp.pause()
|
||||
}
|
||||
|
||||
|
||||
@@ -190,6 +190,39 @@
|
||||
openPhotoSwipe(t);
|
||||
}
|
||||
}
|
||||
vplayderLoad = false;
|
||||
var loadDPlayer = function(url){
|
||||
if (!vplayderLoad) {
|
||||
toastr["info"]("加载预览组件...");
|
||||
includeCss("/static/css/DPlayer.min.css");
|
||||
$.getScript("/static/js/DPlayer.min.js").done(function() {
|
||||
toastr.clear();
|
||||
vplayderLoad = 1;
|
||||
playVideo(url);
|
||||
});
|
||||
}else{
|
||||
playVideo(url);
|
||||
}
|
||||
}
|
||||
var playVideo = function(url){
|
||||
dp = new DPlayer({
|
||||
container: document.getElementById("videopreview-target"),
|
||||
screenshot: true,
|
||||
video: {
|
||||
url: url
|
||||
},
|
||||
});
|
||||
dp.on("fullscreen", function(){
|
||||
$(".modal-backdrop").hide();
|
||||
$("#side").hide();
|
||||
return false;
|
||||
});
|
||||
dp.on("fullscreen_cancel", function(){
|
||||
$(".modal-backdrop").show();
|
||||
$("#side").show();
|
||||
return false;
|
||||
})
|
||||
}
|
||||
function suffix($fname){
|
||||
alert($fname);
|
||||
}
|
||||
@@ -198,15 +231,15 @@
|
||||
$('a[ng-click|="selectOrUnselect(item, $event)"]').click(function(event){
|
||||
var menu = $("#context-menu");
|
||||
if (event.pageX >= window.innerWidth - menu.width()) {
|
||||
event.pageX -= menu.width();
|
||||
}
|
||||
if (event.pageY >= window.innerHeight - menu.height()) {
|
||||
event.pageY -= menu.height();
|
||||
}
|
||||
event.pageX -= menu.width();
|
||||
}
|
||||
if (event.pageY >= window.innerHeight - menu.height()) {
|
||||
event.pageY -= menu.height();
|
||||
}
|
||||
$("#context-menu").css({
|
||||
"left": event.pageX,
|
||||
"top": event.pageY
|
||||
});
|
||||
"left": event.pageX,
|
||||
"top": event.pageY
|
||||
});
|
||||
$(this).contextmenu();
|
||||
return false;
|
||||
})
|
||||
|
||||
+1745
-1691
File diff suppressed because it is too large
Load Diff
@@ -21,6 +21,14 @@
|
||||
}),
|
||||
});
|
||||
}]);
|
||||
function includeCss(filename) {
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
var link = document.createElement('link');
|
||||
link.href = filename;
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
head.appendChild(link)
|
||||
}
|
||||
previewLoad = 0;
|
||||
var openPhotoSwipe = function(items) {
|
||||
var pswpElement = document.querySelectorAll('.pswp')[0];
|
||||
@@ -56,6 +64,39 @@
|
||||
openPhotoSwipe(t);
|
||||
}
|
||||
}
|
||||
vplayderLoad = false;
|
||||
var loadDPlayer = function(url){
|
||||
if (!vplayderLoad) {
|
||||
toastr["info"]("加载预览组件...");
|
||||
includeCss("/static/css/DPlayer.min.css");
|
||||
$.getScript("/static/js/DPlayer.min.js").done(function() {
|
||||
toastr.clear();
|
||||
vplayderLoad = 1;
|
||||
playVideo(url);
|
||||
});
|
||||
}else{
|
||||
playVideo(url);
|
||||
}
|
||||
}
|
||||
var playVideo = function(url){
|
||||
dp = new DPlayer({
|
||||
container: document.getElementById("videopreview-target"),
|
||||
screenshot: true,
|
||||
video: {
|
||||
url: url
|
||||
},
|
||||
});
|
||||
dp.on("fullscreen", function(){
|
||||
$(".modal-backdrop").hide();
|
||||
$("#side").hide();
|
||||
return false;
|
||||
});
|
||||
dp.on("fullscreen_cancel", function(){
|
||||
$(".modal-backdrop").show();
|
||||
$("#side").show();
|
||||
return false;
|
||||
})
|
||||
}
|
||||
function mobileBind(){
|
||||
if($(window).width()<768){
|
||||
$('a[ng-click|="selectOrUnselect(item, $event)"]').click(function(event){
|
||||
|
||||
+86
-45
@@ -14,8 +14,8 @@
|
||||
|
||||
});
|
||||
jQuery.ajaxSetup({
|
||||
cache: true
|
||||
});
|
||||
cache: true
|
||||
});
|
||||
|
||||
function getSize(size) {
|
||||
var filetype = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
||||
@@ -27,12 +27,12 @@
|
||||
}
|
||||
Date.prototype.format = function(fmt) {
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1,
|
||||
"M+": this.getMonth() + 1,
|
||||
"d+": this.getDate(),
|
||||
"h+": this.getHours(),
|
||||
"m+": this.getMinutes(),
|
||||
"s+": this.getSeconds(),
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3),
|
||||
"h+": this.getHours(),
|
||||
"m+": this.getMinutes(),
|
||||
"s+": this.getSeconds(),
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3),
|
||||
"S": this.getMilliseconds()
|
||||
};
|
||||
if (/(y+)/.test(fmt)) {
|
||||
@@ -45,8 +45,10 @@
|
||||
}
|
||||
return fmt;
|
||||
}
|
||||
|
||||
function audioPause() {
|
||||
document.getElementById('preview-target').pause();
|
||||
dp.pause();
|
||||
}
|
||||
$("#size").html(getSize(shareInfo.fileSize));
|
||||
$("#down_num").html(shareInfo.downloadNum);
|
||||
@@ -64,16 +66,55 @@
|
||||
}
|
||||
});
|
||||
});
|
||||
var openPhotoSwipe = function(pic,ww,hh) {
|
||||
vplayderLoad = false;
|
||||
function includeCss(filename) {
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
var link = document.createElement('link');
|
||||
link.href = filename;
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
head.appendChild(link)
|
||||
}
|
||||
var loadDPlayer = function(url){
|
||||
if (!vplayderLoad) {
|
||||
toastr["info"]("加载预览组件...");
|
||||
includeCss("/static/css/DPlayer.min.css");
|
||||
$.getScript("/static/js/DPlayer.min.js").done(function() {
|
||||
toastr.clear();
|
||||
vplayderLoad = 1;
|
||||
playVideo(url);
|
||||
});
|
||||
}else{
|
||||
playVideo(url);
|
||||
}
|
||||
}
|
||||
var playVideo = function(url){
|
||||
dp = new DPlayer({
|
||||
container: document.getElementById("preview-target"),
|
||||
screenshot: true,
|
||||
video: {
|
||||
url: url
|
||||
},
|
||||
});
|
||||
dp.on("fullscreen", function(){
|
||||
$(".modal-backdrop").hide();
|
||||
$("#side").hide();
|
||||
return false;
|
||||
});
|
||||
dp.on("fullscreen_cancel", function(){
|
||||
$(".modal-backdrop").show();
|
||||
$("#side").show();
|
||||
return false;
|
||||
})
|
||||
}
|
||||
var openPhotoSwipe = function(pic, ww, hh) {
|
||||
var pswpElement = document.querySelectorAll('.pswp')[0];
|
||||
items= [
|
||||
{
|
||||
src: pic,
|
||||
w: ww,
|
||||
h: hh
|
||||
}
|
||||
];
|
||||
var options = {
|
||||
items = [{
|
||||
src: pic,
|
||||
w: ww,
|
||||
h: hh
|
||||
}];
|
||||
var options = {
|
||||
history: false,
|
||||
focus: false,
|
||||
showAnimationDuration: 5,
|
||||
@@ -86,57 +127,57 @@
|
||||
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
|
||||
gallery.init();
|
||||
};
|
||||
if(/\.(gif|jpg|jpeg|png|svg|SVG|GIF|JPG|PNG)$/.test(shareInfo.fileName)){
|
||||
|
||||
if (/\.(gif|jpg|jpeg|png|svg|SVG|GIF|JPG|PNG)$/.test(shareInfo.fileName)) {
|
||||
$.getScript("/static/js/photoswipe.min.js").done(function() {
|
||||
$.getScript("/static/js/photoswipe-ui-default.js").done(function() {
|
||||
$("#previewButton").click(function(){
|
||||
if(shareInfo.allowPreview){
|
||||
$("#previewButton").click(function() {
|
||||
if (shareInfo.allowPreview) {
|
||||
x = shareInfo.picSize.split(",")[0];
|
||||
y = shareInfo.picSize.split(",")[1];
|
||||
openPhotoSwipe("/Share/Preview/"+shareInfo.shareId,x,y);
|
||||
}else{
|
||||
openPhotoSwipe("/Share/Preview/" + shareInfo.shareId, x, y);
|
||||
} else {
|
||||
toastr["error"]("请先登录")
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
||||
})
|
||||
}else if(/\.(mp4|flv|avi|tff|MP4|FLV|AVI|TFF)$/.test(shareInfo.fileName)){
|
||||
} else if (/\.(mp4|flv|avi|tff|MP4|FLV|AVI|TFF)$/.test(shareInfo.fileName)) {
|
||||
$(".file-sign").html('<i class="fa fa-file-movie-o" aria-hidden="true"></i>')
|
||||
$("#previewButton").click(function(){
|
||||
if(shareInfo.allowPreview){
|
||||
$(".previewContent").html('<video id="preview-target" style="width: 100%;object-fit: fill" controls="controls" class="preview" src="/Share/Preview/'+shareInfo.shareId+'" ></video>');
|
||||
$("#previewButton").click(function() {
|
||||
if (shareInfo.allowPreview) {
|
||||
$(".previewContent").html('<div id="preview-target" style="width: 100%;object-fit: fill" class="preview"></div>');
|
||||
$('#previewModal').modal();
|
||||
}else{
|
||||
loadDPlayer('/Share/Preview/' + shareInfo.shareId);
|
||||
} else {
|
||||
toastr["error"]("请先登录")
|
||||
}
|
||||
})
|
||||
}
|
||||
else if(/\.(MP3|mp3|wav|WAV|ogg|OGG)$/.test(shareInfo.fileName)){
|
||||
} else if (/\.(MP3|mp3|wav|WAV|ogg|OGG)$/.test(shareInfo.fileName)) {
|
||||
$(".file-sign").html('<i class="fa fa-file-audio-o" aria-hidden="true"></i>');
|
||||
$("#previewButton").click(function(){
|
||||
if(shareInfo.allowPreview){
|
||||
$(".previewContent").html('<audio id="preview-target" style="width: 100%;object-fit: fill" controls="controls" class="preview" src="/Share/Preview/'+shareInfo.shareId+'" ></audio>');
|
||||
$("#previewButton").click(function() {
|
||||
if (shareInfo.allowPreview) {
|
||||
$(".previewContent").html('<audio id="preview-target" style="width: 100%;object-fit: fill" controls="controls" class="preview" src="/Share/Preview/' + shareInfo.shareId + '" ></audio>');
|
||||
$('#previewModal').modal();
|
||||
}else{
|
||||
} else {
|
||||
toastr["error"]("请先登录")
|
||||
}
|
||||
})
|
||||
}else{
|
||||
$("#previewButton").click(function(){
|
||||
toastr["warning"]("当前文件暂不支持预览")
|
||||
});
|
||||
if(/\.(doc|DOC|docx|DOCX|ogg)$/.test(shareInfo.fileName)){
|
||||
$(".file-sign").html('<i class="fa fa-file-word-o" aria-hidden="true"></i>');
|
||||
}else if(/\.(ppt|PPT|pptx|PPTX)$/.test(shareInfo.fileName)){
|
||||
} else {
|
||||
$("#previewButton").click(function() {
|
||||
toastr["warning"]("当前文件暂不支持预览")
|
||||
});
|
||||
if (/\.(doc|DOC|docx|DOCX|ogg)$/.test(shareInfo.fileName)) {
|
||||
$(".file-sign").html('<i class="fa fa-file-word-o" aria-hidden="true"></i>');
|
||||
} else if (/\.(ppt|PPT|pptx|PPTX)$/.test(shareInfo.fileName)) {
|
||||
$(".file-sign").html('<i class="fa fa-file-powerpoint-o" aria-hidden="true"></i>');
|
||||
}else if(/\.(pdf|PDF)$/.test(shareInfo.fileName)){
|
||||
} else if (/\.(pdf|PDF)$/.test(shareInfo.fileName)) {
|
||||
$(".file-sign").html('<i class="fa fa-file-pdf-o" aria-hidden="true"></i>');
|
||||
}
|
||||
else if(/\.(zip|ZIP|RAR|rar|7z|7Z)$/.test(shareInfo.fileName)){
|
||||
} else if (/\.(zip|ZIP|RAR|rar|7z|7Z)$/.test(shareInfo.fileName)) {
|
||||
$(".file-sign").html('<i class="fa fa-file-archive-o" aria-hidden="true"></i>');
|
||||
}else{
|
||||
} else {
|
||||
$(".file-sign").html('<i class="fa fa-file-text" aria-hidden="true"></i>');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user