Feat: Folder share

This commit is contained in:
HFO4 2019-03-10 19:07:01 +08:00
parent d84b00f35d
commit 41d1294ebf
12 changed files with 506 additions and 254 deletions

View file

@ -35,9 +35,10 @@ class Share extends Controller{
'dirData' => $shareObj->dirData,
'shareData' => $shareObj->shareData,
'loginStatus' => $this->userObj->loginStatus,
'userData' => $this->userObj->userSQLData,
'userData' => $this->userObj->getInfo(),
'groupData' => $shareObj->shareOwner->groupData,
'allowPreview' => Option::getValue("allowdVisitorDownload"),
'path' => empty(input("get.path"))?"/":input("get.path"),
]);
}else{
return view('share_single', [
@ -85,6 +86,20 @@ class Share extends Controller{
}
}
public function Content(){
$shareId = input('param.key');
$filePath = input('get.path');
$shareObj = new ShareHandler($shareId,false);
if(empty($filePath)){
//todo 单文件时
}else{
$contentHandller = $shareObj->getContent($this->userObj,$filePath);
}
if(!$contentHandller[0]){
return json(["result"=>["success"=>false,"error"=>$contentHandller[1]]]);
}
}
public function chekPwd(){
$shareId = input('key');
$inputPwd = input('password');
@ -122,7 +137,7 @@ class Share extends Controller{
$shareId = input('param.key');
$reqPathTo = stripslashes(json_decode(file_get_contents("php://input"),true)['path']);
$shareObj = new ShareHandler($shareId,false);
return $shareObj->ListFile($reqPathTo);
return json($shareObj->ListFile($reqPathTo));
}
public function ListPic(){
@ -133,8 +148,8 @@ class Share extends Controller{
}
public function Thumb(){
$shareId = input('get.shareKey');
$filePath = input('get.path');
$shareId = input('param.key');
$filePath = urldecode(input('get.path'));
if(input("get.isImg") != "true"){
return "";
}
@ -147,6 +162,23 @@ class Share extends Controller{
}
}
public function DocPreview(){
$shareId = input('param.key');
$filePath = urldecode(input('get.path'));
$shareObj = new ShareHandler($shareId,false);
if(empty($filePath)){
//TODO 单文件时
}else{
$Redirect = $shareObj->getDocPreview($this->userObj,$filePath);
}
if($Redirect[0]){
$this->redirect($Redirect[1],302);
}else{
$this->error($Redirect[1],403,$this->siteOptions);
}
}
public function Delete(){
$shareId = input('post.id');
$shareObj = new ShareHandler($shareId,false);

View file

@ -7,6 +7,7 @@ use \app\index\model\Option;
use \app\index\model\User;
use think\Session;
use \app\index\model\FileManage;
use \app\index\model\ShareHandler;
class Viewer extends Controller{
@ -26,12 +27,17 @@ class Viewer extends Controller{
$pathSplit = explode("/",urldecode($path));
$userInfo = $this->userObj->getInfo();
$groupData = $this->userObj->getGroupData();
$url = "/File/Preview?action=preview&path=".$path;
if(input("get.share")==true){
$url = "/Share/Preview/".input("get.shareKey")."/?path=".$path;
}
return view('video', [
'options' => Option::getValues(['basic']),
'userInfo' => $userInfo,
'groupData' => $groupData,
'url' => "/File/Preview?action=preview&path=".$path,
'url' => $url,
'fileName' => end($pathSplit),
'isSharePage' => input("?get.share")?"true":"false",
]);
}
@ -40,13 +46,18 @@ class Viewer extends Controller{
$pathSplit = explode("/",urldecode($path));
$userInfo = $this->userObj->getInfo();
$groupData = $this->userObj->getGroupData();
$url = "/File/Content?action=preview&path=".$path;
if(input("get.share")==true){
$url = "/Share/Content/".input("get.shareKey")."/?path=".$path;
}
return view('markdown', [
'options' => Option::getValues(['basic']),
'userInfo' => $userInfo,
'groupData' => $groupData,
'url' => "/File/Content?action=preview&path=".$path,
'url' => $url,
'fileName' => end($pathSplit),
'path' => urldecode($path),
'isSharePage' => input("?get.share")?"true":"false",
]);
}

View file

@ -636,11 +636,14 @@ class FileManage extends Model{
}
/**
* [List description]
* @param [type] $path [description]
* @param [type] $uid [description]
* 列出文件
*
* @param 路径 $path
* @param 用户UID $uid
* @param boolean $isShare 是否为分享模式下列出文件
* @return void
*/
static function ListFile($path,$uid){
static function ListFile($path,$uid,$isShare=false,$originPath=null){
$fileList = Db::name('files')->where('upload_user',$uid)->where('dir',$path)->select();
$dirList = Db::name('folders')->where('owner',$uid)->where('position',$path)->select();
$count= 0;
@ -657,6 +660,12 @@ class FileManage extends Model{
$fileListData['result'][$count]['id'] = $value['id'];
$fileListData['result'][$count]['pic'] = "";
$fileListData['result'][$count]['path'] = $value['position'];
if($isShare){
if (substr($value['position'], 0, strlen($originPath)) == $originPath) {
$value['position'] = substr($value['position'], strlen($originPath));
}
$fileListData['result'][$count]['path'] = ($value['position']=="")?"/":$value['position'];
}
$count++;
}
foreach ($fileList as $key => $value) {
@ -665,10 +674,15 @@ class FileManage extends Model{
$fileListData['result'][$count]['size'] = $value['size'];
$fileListData['result'][$count]['date'] = $value['upload_date'];
$fileListData['result'][$count]['type'] = 'file';
$fileListData['result'][$count]['name2'] = $value["dir"];
$fileListData['result'][$count]['id'] = $value["id"];
$fileListData['result'][$count]['pic'] = $value["pic_info"];
$fileListData['result'][$count]['path'] = $value['dir'];
if($isShare){
if (substr($value['dir'], 0, strlen($originPath)) == $originPath) {
$value['dir'] = substr($value['dir'], strlen($originPath));
}
$fileListData['result'][$count]['path'] = ($value['dir']=="")?"/":$value['dir'];
}
$count++;
}

View file

@ -95,6 +95,28 @@ class ShareHandler extends Model{
return $fileObj->getThumb();
}
public function getDocPreview($user,$path){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
$fileObj = new FileManage($reqPath["position_absolute"].$path,$this->shareData["owner"]);
$tmpUrl = $fileObj->signTmpUrl();
return[true,"http://view.officeapps.live.com/op/view.aspx?src=".urlencode($tmpUrl)];
}
public function getContent($user,$path=null){
$checkStatus = $this->checkSession($user);
if(!$checkStatus[0]){
return [$checkStatus[0],$checkStatus[1]];
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
$fileObj = new FileManage($reqPath["position_absolute"].$path,$this->shareData["owner"]);
$fileObj->getContent();
exit();
}
public function checkSession($user){
if($this->lockStatus){
return [false,"会话过期,请刷新页面"];
@ -146,7 +168,7 @@ class ShareHandler extends Model{
}
$reqPath = Db::name('folders')->where('position_absolute',$this->shareData["source_name"])->find();
$path = $path == "/"?"":$path;
return FileManage::ListFile($this->shareData["source_name"].$path,$this->shareData["owner"]);
return FileManage::ListFile($this->shareData["source_name"].$path,$this->shareData["owner"],true,$this->shareData["source_name"]);
}
public function Preview($user){

View file

@ -1,6 +1,4 @@
{extend name="header_public" /}
{block name="title"}错误提示 - {$options.siteName}{/block}
{block name="content"}
<link rel="stylesheet" href="/static/css/error.css" />
</head>
<body data-ma-header="teal">
@ -19,6 +17,4 @@
</div>
</div>
</div>
{$options.js_code}
</body>
{/block}

View file

@ -1,6 +1,7 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
@ -8,7 +9,7 @@
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="manifest" href="/manifest.json">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
@ -20,43 +21,86 @@
-->
<title>我的文件 - {$options.siteName}</title>
<script type="text/javascript">
isHomePage=true;
uploadConfig={
saveType : "{$policyData.policy_type}",
maxSize : "{$policyData.max_size}mb",
allowedType: [
{$extLimit}
],
allowSource : "{$policyData.origin_link}",
upUrl : "{$policyData.server}",
allowShare:"{$groupData.allow_share}",
allowRemoteDownload:"{:explode(",",$groupData.aria2)[0]}",
allowTorrentDownload:"{:explode(",",$groupData.aria2)[1]}",
};
apiURL={
imgThumb:"/File/Thumb",
preview:"/File/Preview",
download:"/File/Download",
docPreiview:'/File/DocPreview',
};
userInfo={
uid:{$userInfo.uid},
nick:"{$userInfo.userNick}",
email:"{$userInfo.userMail}",
group:"{$userInfo.groupData.group_name}",
groupId:{$userInfo.groupData.id},
groupColor:"{$userInfo.groupData.color}",
};
siteInfo = {
mainTitle:"{$options.siteName}",
};
path = "{$path}";
mediaType = {},
isMobile = window.innerWidth<600;
</script>
</head>
<body>
colorTheme = {
"palette": {
"common": {
"black": "#000",
"white": "#fff"
},
"background": {
"paper": "#fff",
"default": "#fafafa"
},
"primary": {
"light": "#7986cb",
"main": "#3f51b5",
"dark": "#303f9f",
"contrastText": "#fff"
},
"secondary": {
"light": "#ff4081",
"main": "#f50057",
"dark": "#c51162",
"contrastText": "#fff"
},
"error": {
"light": "#e57373",
"main": "#f44336",
"dark": "#d32f2f",
"contrastText": "#fff"
},
"text": {
"primary": "rgba(0, 0, 0, 0.87)",
"secondary": "rgba(0, 0, 0, 0.54)",
"disabled": "rgba(0, 0, 0, 0.38)",
"hint": "rgba(0, 0, 0, 0.38)"
},
"explorer": {
"filename": "#474849",
"icon": "#8f8f8f",
"bgSelected": "#D5DAF0",
"emptyIcon": "#e8e8e8",
}
}
};
isHomePage = true;
isSharePage = false;
uploadConfig = {
saveType: "{$policyData.policy_type}",
maxSize: "{$policyData.max_size}mb",
allowedType: [{$extLimit}],
allowSource: "{$policyData.origin_link}",
upUrl: "{$policyData.server}",
allowShare: "{$groupData.allow_share}",
allowRemoteDownload: "{:explode(",",$groupData.aria2)[0]}",
allowTorrentDownload: "{:explode(",",$groupData.aria2)[1]}",
};
apiURL = {
imgThumb: "/File/Thumb",
preview: "/File/Preview",
download: "/File/Download",
docPreiview: '/File/DocPreview',
listFile:"/File/ListFile"
};
userInfo = {
uid: {$userInfo.uid},
nick: "{$userInfo.userNick}",
email: "{$userInfo.userMail}",
group: "{$userInfo.groupData.group_name}",
groupId: {$userInfo.groupData.id},
groupColor: "{$userInfo.groupData.color}",
};
siteInfo = {
mainTitle: "{$options.siteName}",
};
path = "{$path}";
mediaType = {},
isMobile = window.innerWidth < 600;
</script>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
@ -71,10 +115,13 @@
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
<script src="http://192.168.123.19:3000/static/js/runtime~index.bundle.js"></script><script src="http://192.168.123.19:3000/static/js/0.chunk.js"></script><script src="http://192.168.123.19:3000/static/js/3.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/7.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/11.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/8.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/index.chunk.js"></script>
</html>
</body>
<script src="http://192.168.123.19:3000/static/js/runtime~index.bundle.js"></script>
<script src="http://192.168.123.19:3000/static/js/0.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/1.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/2.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/4.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/8.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/index.chunk.js"></script>
</html>

View file

@ -1,100 +0,0 @@
<!doctype html>
<html lang="zh_cn" data-ng-app="FileManagerApp">
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<meta name="theme-color" content="#4e64d9"/>
<title>我的文件 - {$options.siteName}</title>
<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">
<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">
<script type="text/javascript">
uploadConfig={
saveType : "{$policyData.policy_type}",
maxSize : "{$policyData.max_size}mb",
allowedType: [
{$extLimit}
],
allowSource : "{$policyData.origin_link}",
upUrl : "{$policyData.server}",
allowShare:"{$groupData.allow_share}",
allowRemoteDownload:"{:explode(",",$groupData.aria2)[0]}",
allowTorrentDownload:"{:explode(",",$groupData.aria2)[1]}",
};
</script>
<script src="/static/js/home.js"></script>
</head>
<body class="ng-cloak">
<div id="container">
{include file="navbar_home" /}
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<!-- Background of PhotoSwipe.
It's a separate element, as animating opacity is faster than rgba(). -->
<div class="pswp__bg"></div>
<!-- Slides wrapper with overflow:hidden. -->
<div class="pswp__scroll-wrap">
<!-- Container that holds slides. PhotoSwipe keeps only 3 slides in DOM to save memory. -->
<div class="pswp__container">
<!-- don't modify these 3 pswp__item elements, data is added later on -->
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<!-- Controls are self-explanatory. Order can be changed. -->
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
<!-- element will get class pswp__preloader--active when preloader is running -->
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
<div class="col-md-10 max_height">
<angular-filemanager></angular-filemanager>
</div>
</div>
</body>
<script src="/static/js/material.js"></script>
<script type="text/javascript">
upload_load=0;
</script>
{$options.js_code}
</html>

View file

@ -1,80 +1,95 @@
{extend name="header_dir_share" /}
{block name="title"}{$dirData.folder_name} - {$options.siteName}{/block}
{block name="content"}
<link rel="stylesheet" href="/static/css/share_dir.css" />
<link rel="stylesheet" href="/static/css/photoswipe.css">
<link rel="stylesheet" href="/static/css/default-skin/default-skin.css">
</head>
<body data-ma-header="teal">
<div class="modal fade" id="previewModal" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" onclick="audioPause()" data-dismiss="modal">
<span aria-hidden="true">×</span>
<span class="sr-only ng-binding">关闭</span>
</button>
<h4 class="modal-title">视频预览</h4>
</div>
<div class="modal-body">
<div class="text-center previewContent">
</div>
</div>
</div>
</div>
</div>
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<!-- Background of PhotoSwipe.
It's a separate element, as animating opacity is faster than rgba(). -->
<div class="pswp__bg"></div>
<!-- Slides wrapper with overflow:hidden. -->
<div class="pswp__scroll-wrap">
<!-- Container that holds slides. PhotoSwipe keeps only 3 slides in DOM to save memory. -->
<div class="pswp__container">
<!-- don't modify these 3 pswp__item elements, data is added later on -->
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<!-- Controls are self-explanatory. Order can be changed. -->
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
<!-- element will get class pswp__preloader--active when preloader is running -->
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
<angular-filemanager></angular-filemanager>
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
</body>
<script type="text/javascript">
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>{$dirData.folder_name} - {$options.siteName}</title>
<script type="text/javascript">
colorTheme = {
"palette": {
"common": {
"black": "#000",
"white": "#fff"
},
"background": {
"paper": "#fff",
"default": "#fafafa"
},
"primary": {
"light": "#7986cb",
"main": "#3f51b5",
"dark": "#303f9f",
"contrastText": "#fff"
},
"secondary": {
"light": "#ff4081",
"main": "#f50057",
"dark": "#c51162",
"contrastText": "#fff"
},
"error": {
"light": "#e57373",
"main": "#f44336",
"dark": "#d32f2f",
"contrastText": "#fff"
},
"text": {
"primary": "rgba(0, 0, 0, 0.87)",
"secondary": "rgba(0, 0, 0, 0.54)",
"disabled": "rgba(0, 0, 0, 0.38)",
"hint": "rgba(0, 0, 0, 0.38)"
},
"explorer": {
"filename": "#474849",
"icon": "#8f8f8f",
"bgSelected": "#D5DAF0",
"emptyIcon": "#e8e8e8",
}
}
};
isHomePage = false;
isSharePage = true;
apiURL = {
imgThumb: "/Share/Thumb/{$shareData.share_key}",
preview: "/Share/Preview/{$shareData.share_key}",
download: "/Share/Download/{$shareData.share_key}",
docPreiview: '/Share/DocPreview/{$shareData.share_key}',
listFile:'/Share/ListFile/{$shareData.share_key}'
};
userInfo = {
uid: {$userData.uid},
nick: "{$userData.userNick}",
email: "{$userData.userMail}",
group: "{$userData.groupData.group_name}",
groupId: {$userData.groupData.id},
groupColor: "{$userData.groupData.color}",
};
siteInfo = {
mainTitle: "{$dirData.folder_name}",
};
path = "{$path}";
uploadConfig = {
allowSource: false,
allowShare: false,
allowRemoteDownload: "0",
allowTorrentDownload: "0",
};
shareInfo={
shareDate : "{$shareData.share_time}",
ownerUid:"{$userInfo.id}",
@ -91,15 +106,36 @@
allowPreview:{$allowPreview},
{/eq}
};
</script>
<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>
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/material.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/static/js/toastr.min.js"></script>
<script src="/static/js/filemanager_share.js"></script>
<script src="/static/js/share_dir.js"> </script>
{$options.js_code}
{/block}
mediaType = {},
isMobile = window.innerWidth < 600;
</script>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
<script src="http://192.168.123.19:3000/static/js/runtime~folderShare.bundle.js"></script>
<script src="http://192.168.123.19:3000/static/js/0.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/3.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/1.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/4.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/6.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/2.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/8.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/folderShare.chunk.js"></script>
</html>

View file

@ -0,0 +1,105 @@
{extend name="header_dir_share" /}
{block name="title"}{$dirData.folder_name} - {$options.siteName}{/block}
{block name="content"}
<link rel="stylesheet" href="/static/css/share_dir.css" />
<link rel="stylesheet" href="/static/css/photoswipe.css">
<link rel="stylesheet" href="/static/css/default-skin/default-skin.css">
</head>
<body data-ma-header="teal">
<div class="modal fade" id="previewModal" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" onclick="audioPause()" data-dismiss="modal">
<span aria-hidden="true">×</span>
<span class="sr-only ng-binding">关闭</span>
</button>
<h4 class="modal-title">视频预览</h4>
</div>
<div class="modal-body">
<div class="text-center previewContent">
</div>
</div>
</div>
</div>
</div>
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<!-- Background of PhotoSwipe.
It's a separate element, as animating opacity is faster than rgba(). -->
<div class="pswp__bg"></div>
<!-- Slides wrapper with overflow:hidden. -->
<div class="pswp__scroll-wrap">
<!-- Container that holds slides. PhotoSwipe keeps only 3 slides in DOM to save memory. -->
<div class="pswp__container">
<!-- don't modify these 3 pswp__item elements, data is added later on -->
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<!-- Controls are self-explanatory. Order can be changed. -->
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
<!-- element will get class pswp__preloader--active when preloader is running -->
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
<angular-filemanager></angular-filemanager>
</body>
<script type="text/javascript">
shareInfo={
shareDate : "{$shareData.share_time}",
ownerUid:"{$userInfo.id}",
ownerNick:"{$userInfo.user_nick}",
downloadNum:"{$shareData.download_num}",
ViewNum:"{$shareData.view_num}",
shareId:"{$shareData.share_key}",
dirName:"{$dirData.folder_name}",
groupName:"{$groupData.group_name}",
color:"{$groupData.color}",
{eq name="$loginStatus" value="1"}
allowPreview:true,
{else/}
allowPreview:{$allowPreview},
{/eq}
};
</script>
<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>
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/material.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/static/js/toastr.min.js"></script>
<script src="/static/js/filemanager_share.js"></script>
<script src="/static/js/share_dir.js"> </script>
{$options.js_code}
{/block}

View file

@ -21,7 +21,50 @@
-->
<title>{$fileName} - {$options.siteName}</title>
<script type="text/javascript">
isHomePage = false,
colorTheme = {
"palette": {
"common": {
"black": "#000",
"white": "#fff"
},
"background": {
"paper": "#fff",
"default": "#fafafa"
},
"primary": {
"light": "#7986cb",
"main": "#3f51b5",
"dark": "#303f9f",
"contrastText": "#fff"
},
"secondary": {
"light": "#ff4081",
"main": "#f50057",
"dark": "#c51162",
"contrastText": "#fff"
},
"error": {
"light": "#e57373",
"main": "#f44336",
"dark": "#d32f2f",
"contrastText": "#fff"
},
"text": {
"primary": "rgba(0, 0, 0, 0.87)",
"secondary": "rgba(0, 0, 0, 0.54)",
"disabled": "rgba(0, 0, 0, 0.38)",
"hint": "rgba(0, 0, 0, 0.38)"
},
"explorer": {
"filename": "#474849",
"icon": "#8f8f8f",
"bgSelected": "#D5DAF0",
"emptyIcon": "#e8e8e8",
}
}
};
isHomePage = false;
isSharePage = false;
apiURL={
imgThumb:"/File/Thumb",
preview:"/File/Preview",

View file

@ -20,7 +20,50 @@
-->
<title>{$fileName} - {$options.siteName}</title>
<script type="text/javascript">
isHomePage = false,
colorTheme = {
"palette": {
"common": {
"black": "#000",
"white": "#fff"
},
"background": {
"paper": "#fff",
"default": "#fafafa"
},
"primary": {
"light": "#7986cb",
"main": "#3f51b5",
"dark": "#303f9f",
"contrastText": "#fff"
},
"secondary": {
"light": "#ff4081",
"main": "#f50057",
"dark": "#c51162",
"contrastText": "#fff"
},
"error": {
"light": "#e57373",
"main": "#f44336",
"dark": "#d32f2f",
"contrastText": "#fff"
},
"text": {
"primary": "rgba(0, 0, 0, 0.87)",
"secondary": "rgba(0, 0, 0, 0.54)",
"disabled": "rgba(0, 0, 0, 0.38)",
"hint": "rgba(0, 0, 0, 0.38)"
},
"explorer": {
"filename": "#474849",
"icon": "#8f8f8f",
"bgSelected": "#D5DAF0",
"emptyIcon": "#e8e8e8",
}
}
};
isHomePage = false;
isSharePage = false;
apiURL={
imgThumb:"/File/Thumb",
preview:"/File/Preview",
@ -65,8 +108,8 @@
</body>
<script src="http://192.168.123.19:3000/static/js/runtime~video.bundle.js"></script><script src="http://192.168.123.19:3000/static/js/5.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/0.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/4.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/9.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/1.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/6.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/3.chunk.js"></script>
<script src="http://192.168.123.19:3000/static/js/video.chunk.js"></script>
</html>

View file

@ -24,4 +24,7 @@ Route::rule([
'Member/Avatar/:uid/:size' => ['Member/Avatar',[],['uid'=>'\d+']],
'Profile/:uid' => ['Profile/index',[],['uid'=>'\d+']],
'Callback/Payment/Jinshajiang' => 'index/Callback/Jinshajiang',
'Share/Thumb/:key' => 'index/Share/Thumb',
'Share/DocPreview/:key' => 'index/Share/DocPreview',
'Share/Content/:key' => 'index/Share/Content',
]);