first commit

This commit is contained in:
2026-07-23 09:40:36 +08:00
commit 090abf48fa
989 changed files with 145728 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
use think\facade\Db;
function get_pfolder($id)
{
$folder = Db::name('Disk')->where('id',$id)->find();
if($folder && $folder['pid'] > 0){
$pfolders = get_pfolder($folder['pid']);
$pfolders[] = $folder;
return $pfolders;
}
else{
if(empty($folder)){
return [];
}
return [$folder];
}
}
+161
View File
@@ -0,0 +1,161 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\disk\controller;
use app\api\BaseController;
use think\facade\Db;
use think\facade\View;
class Api extends BaseController
{
//获取共享空间
public function get_group()
{
$where=[];
$whereOr=[];
$where[] = ['delete_time','=',0];
$uid=$this->uid;
if($uid>1){
$map1=[
['admin_id','=',$uid],
];
$map2=[
['', 'exp', Db::raw("FIND_IN_SET('{$uid}',director_uids)")],
];
$map3=[
['', 'exp', Db::raw("FIND_IN_SET('{$uid}',group_uids)")],
];
$whereOr =[$map1,$map2,$map3];
}
$list = Db::name('DiskGroup')
->where($where)
->where(function ($query) use($whereOr) {
if (!empty($whereOr)){
$query->whereOr($whereOr);
}
})
->select()->toArray();
return to_assign(0, '',$list);
}
/**
* 空间成员列表
*/
public function memberlist()
{
$param = get_params();
if (request()->isAjax()) {
$group_uids = Db::name('DiskGroup')->where('id',$param['id'])->value('group_uids');
$list['data']=[];
if(!empty($group_uids)){
$list['data'] = Db::name('Admin')
->field('a.*,p.title as position, d.title as department')
->alias('a')
->join('Position p','p.id = a.position_id')
->join('Department d','d.id = a.did')
->where([['a.id','in',$group_uids],['a.status','=',1]])
->select()->toArray();
}
table_assign(0,'', $list);
}
else{
$detail = Db::name('DiskGroup')->where('id',$param['id'])->find();
View::assign('detail', $detail);
return view();
}
}
/**
* 设置空间成员
*/
public function memberset()
{
$param = get_params();
if (request()->isAjax()) {
$uid=$this->uid;
$detail = Db::name('DiskGroup')->where('id',$param['id'])->find();
$array = array_map('trim', explode(',', $detail['director_uids']));
if($uid==1 || $detail['admin_id'] == $uid || in_array($uid, $array)){
$res = Db::name('DiskGroup')->where('id',$param['id'])->update(['group_uids'=>$param['group_uids']]);
if($res!==false){
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
else{
return to_assign(1,'操作失败');
}
}else{
return to_assign(1,'只要超级管理员、创建人、空间管理人员才有权限操作');
}
}
else{
// 禁止访问
throw new \think\exception\HttpException(403, '禁止访问');
}
}
/**
* 空间管理员列表
*/
public function adminlist()
{
$param = get_params();
if (request()->isAjax()) {
$director_uids = Db::name('DiskGroup')->where('id',$param['id'])->value('director_uids');
$list['data']=[];
if(!empty($director_uids)){
$list['data'] = Db::name('Admin')
->field('a.*,p.title as position, d.title as department')
->alias('a')
->join('Position p','p.id = a.position_id')
->join('Department d','d.id = a.did')
->where([['a.id','in',$director_uids],['a.status','=',1]])
->select()->toArray();
}
table_assign(0,'', $list);
}
else{
$detail = Db::name('DiskGroup')->where('id',$param['id'])->find();
View::assign('detail', $detail);
return view();
}
}
/**
* 设置空间管理员
*/
public function adminset()
{
$param = get_params();
if (request()->isAjax()) {
$uid=$this->uid;
$detail = Db::name('DiskGroup')->where('id',$param['id'])->find();
if($uid==1 || $detail['admin_id'] == $uid){
$res = Db::name('DiskGroup')->where('id',$param['id'])->update(['director_uids'=>$param['director_uids']]);
if($res!==false){
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
else{
return to_assign(1,'操作失败');
}
}else{
return to_assign(1,'只要超级管理员和创建人才有权限操作');
}
}
else{
// 禁止访问
throw new \think\exception\HttpException(403, '禁止访问');
}
}
}
+606
View File
@@ -0,0 +1,606 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
declare (strict_types = 1);
namespace app\disk\controller;
use app\base\BaseController;
use app\disk\model\Disk as DiskModel;
use app\disk\validate\DiskValidate;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Index extends BaseController
{
/**
* 构造函数
*/
protected $model;
public function __construct()
{
parent::__construct(); // 调用父类构造函数
$this->model = new DiskModel();
}
/**
* 数据列表
*/
public function datalist()
{
$param = get_params();
if (request()->isAjax()) {
$pid = isset($param['pid']) ? $param['pid'] : 0;
$where=[];
$where[]=['admin_id','=',$this->uid];
$where[]=['delete_time','=',0];
$where[]=['group_id','=',0];
if (!empty($param['keywords'])) {
$where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['is_star'])) {
$where[]=['types','<',2];
$where[]=['is_star','=',1];
}
if (!empty($param['ext'])) {
$where[] = ['file_ext', 'in',$param['ext']];
}
if (!empty($param['is_star']) || !empty($param['ext'])) {
}
else{
$where[]=['pid','=',$pid];
}
$list = $this->model->datalist($param,$where);
$folder = get_pfolder($pid);
return table_assign(0, '', $list,$folder);
}
else{
return view();
}
}
/**
* 分享列表
*/
public function sharelist()
{
$param = get_params();
if (request()->isAjax()) {
$pid = isset($param['pid']) ? $param['pid'] : 0;
$group_id = isset($param['group_id']) ? $param['group_id'] : 0;
$where=[];
$where[]=['delete_time','=',0];
$where[]=['group_id','=',$group_id];
if (!empty($param['keywords'])) {
$where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['is_star'])) {
if($pid>0){
$where[]=['pid','=',$pid];
}
else{
$where[]=['is_star','=',1];
}
}
if (!empty($param['ext'])) {
$where[] = ['file_ext', 'in',$param['ext']];
}
if (!empty($param['is_star']) || !empty($param['ext'])) {
}
else{
$where[]=['pid','=',$pid];
}
$list = $this->model->datalist($param,$where);
$folder = get_pfolder($param['pid']);
return table_assign(0, '', $list,$folder);
}
else{
return view();
}
}
/**
* 回收站列表
*/
public function clearlist()
{
$param = get_params();
if (request()->isAjax()) {
$pid = isset($param['pid']) ? $param['pid'] : 0;
$where=[];
$where[]=['admin_id','=',$this->uid];
$where[]=['clear_time','=',0];
if($pid>0){
$where[]=['pid','=',$pid];
}
else{
$where[]=['delete_time','>',0];
}
if (!empty($param['ext'])) {
$where[] = ['file_ext', 'in',$param['ext']];
}
if (!empty($param['keywords'])) {
$where[] = ['name', 'like', '%' . $param['keywords'] . '%'];
}
$list = $this->model->datalist($param,$where);
$folder = get_pfolder($param['pid']);
return table_assign(0, '', $list,$folder);
}
else{
return view();
}
}
//添加&编辑
public function add_group()
{
if (request()->isAjax()) {
$param = get_params();
if($param['title'] == '全部' || $param['title']=='未共享空间'){
return to_assign(1, '该共享空间名称已经存在');
}
if (!empty($param['id']) && $param['id'] > 0) {
$uid=$this->uid;
$detail = Db::name('DiskGroup')->where('id',$param['id'])->find();
if($uid==1 || $detail['admin_id'] == $uid){
$count = Db::name('DiskGroup')->where([['id','<>',$param['id']],['delete_time','=',0],['title','=',$param['title']]])->count();
if ($count > 0) {
return to_assign(1, '该共享空间名称已经被其他员工占用');
}
$param['update_time'] = time();
$res = Db::name('DiskGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
if($res!=false){
add_log('edit', $param['id'], $param);
return to_assign(0,'编辑成功',$param['id']);
}else{
return to_assign(1,'操作失败');
}
}else{
return to_assign(1,'只要超级管理员和创建人才有权限操作');
}
} else {
$param['admin_id'] = $this->uid;
$param['create_time'] = time();
$count = Db::name('DiskGroup')->where([['delete_time','=',0],['title','=',$param['title']]])->count();
if ($count > 0) {
return to_assign(1, '该共享空间名称已经被其他员工占用');
}
$gid = Db::name('DiskGroup')->strict(false)->field(true)->insertGetId($param);
if($gid!=false){
add_log('add', $gid, $param);
return to_assign(0,'添加成功',$gid);
}else{
return to_assign(1,'操作失败');
}
}
}
}
//删除
public function del_group()
{
if (request()->isDelete()) {
$id = get_params("id");
$uid=$this->uid;
$detail = Db::name('DiskGroup')->where('id',$id)->find();
if($uid==1 || $detail['admin_id'] == $uid){
$count = Db::name('Disk')->where(["group_id" => $id,'delete_time'=>0])->count();
if ($count > 0) {
return to_assign(1, "该共享空间还存在文件,请去除文件或者转移文件后再删除");
}
if (Db::name('DiskGroup')->delete($id) !== false) {
add_log('delete', $id, []);
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
}else{
return to_assign(1,'只要超级管理员和创建人才有权限操作');
}
} else {
return to_assign(1, "错误的请求");
}
}
/**
* 新增上传文件
*/
public function add_upload()
{
$param = get_params();
if (request()->isAjax()) {
try {
validate(DiskValidate::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['admin_id'] = $this->uid;
$param['did'] = $this->did;
$this->model->add($param);
}
}
/**
* 新增文件夹
*/
public function add_folder()
{
$param = get_params();
if (request()->isAjax()) {
try {
validate(DiskValidate::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['types'] = 2;
$param['admin_id'] = $this->uid;
$param['did'] = $this->did;
$this->model->add($param);
}
}
public function add_article()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
$param['update_time'] = time();
$res = Db::name('Article')->strict(false)->field(true)->update($param);
if ($res !== false) {
add_log('edit', $param['id'], $param);
$disk['id'] = $param['disk_id'];
$disk['name'] = $param['name'];
$disk['update_time'] = $param['update_time'];
$this->model->edit($disk);
} else {
return to_assign(1, "操作失败");
}
} else {
$param['admin_id'] = $this->uid;
$param['create_time'] = time();
$aid = Db::name('Article')->strict(false)->field(true)->insertGetId($param);
if ($aid !== false) {
add_log('add', $aid, $param);
$param['action_id'] = $aid;
$param['types'] = 1;
$param['ext'] = 'article';
$param['did'] = $this->did;
$this->model->add($param);
} else {
return to_assign(1, "操作失败");
}
}
}else{
$id = isset($param['id']) ? $param['id'] : 0;
$pid = isset($param['pid']) ? $param['pid'] : 0;
$group_id = isset($param['group_id']) ? $param['group_id'] : 0;
if ($id>0) {
$file = $this->model->getById($id);
$detail = Db::name('Article')->find($file['action_id']);
if($detail['file_ids'] !=''){
$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
$detail['file_array'] = $file_array;
}
$detail['disk_id'] = $id;
View::assign('detail', $detail);
return view('edit_article');
}
View::assign('pid', $pid);
View::assign('group_id', $group_id);
return view();
}
}
//查看在线文档
public function view_article()
{
$param = get_params();
$id = isset($param['id']) ? $param['id'] : 0;
if ($id>0) {
$file = $this->model->getById($id);
$detail = Db::name('Article')->find($file['action_id']);
$detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name');
if($detail['file_ids'] !=''){
$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
$detail['file_array'] = $file_array;
}
View::assign('detail', $detail);
}
return view();
}
/**
* 新增文件夹
*/
public function rename()
{
$param = get_params();
if (request()->isAjax()) {
$uid=$this->uid;
$detail = Db::name('Disk')->where('id',$param['id'])->find();
if($uid==1 || $detail['admin_id'] == $uid){
try {
validate(DiskValidate::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$this->model->edit($param);
}else{
return to_assign(1,'只要超级管理员和创建人才有权限操作');
}
}
}
/**
* 查看
*/
public function view($id)
{
$detail = $this->model->getById($id);
if (!empty($detail)) {
View::assign('detail', $detail);
return view();
}
else{
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
}
}
/**
* 删除
*/
public function del()
{
$param = get_params();
if (request()->isDelete()) {
$ids = $param["ids"];
$idArray = explode(',', strval($ids));
$list = [];
foreach ($idArray as $key => $val) {
$file = Db::name('Disk')->find($val);
if($file['admin_id'] != $this->uid && $this->uid>1){
return to_assign(1, "删除失败,【".$file['name']."】不是你上传的文件");
break;
}
$count = Db::name('Disk')->where(['pid'=>$val,'delete_time'=>0])->count();
if($count>0){
return to_assign(1, "删除失败,请先清空【".$file['name']."】里面的文件");
break;
}
$list[] = [
'id' => $val,
'delete_time' => time()
];
}
if(!empty($list)){
$model = new DiskModel();
foreach ($list as $item) {
$model->update($item);
}
return to_assign();
}
else{
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
/**
* 恢复
*/
public function back()
{
$param = get_params();
if (request()->isAjax()) {
$ids = $param["ids"];
$idArray = explode(',', strval($ids));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'delete_time' => 0
];
}
if(!empty($list)){
$model = new DiskModel();
foreach ($list as $item) {
$model->update($item);
}
return to_assign();
}
else{
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
/**
* 清除
*/
public function clear()
{
$param = get_params();
if (request()->isAjax()) {
$ids = $param["ids"];
$idArray = explode(',', strval($ids));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'clear_time' => time()
];
}
if(!empty($list)){
$model = new DiskModel();
foreach ($list as $item) {
$model->update($item);
}
return to_assign();
}
else{
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//查找父文件的所有父ids
public function get_pidsa($id)
{
$pid = Db::name('Disk')->where('id',$id)->value('pid');
if($pid==0){
return [];
}
else{
$pids=$this->get_pids($pid);
$pids[] = $pid;
return $pids;
}
return [];
}
//while方法
public function get_pids($categoryId)
{
$parentIds = [];
while ($categoryId > 0) {
$category = Db::name('Disk')->where('id',$categoryId)->find();
if ($category && $category['pid'] > 0) {
$parentIds[] = $category['id'];
$categoryId = $category['pid'];
} else {
break;
}
}
return $parentIds;
}
/**
* 移动
*/
public function move()
{
$param = get_params();
if (request()->isAjax()) {
$ids = $param["ids"];
$pid = $param["pid"];
$pids = $this->get_pids($pid);
$idArray = explode(',', strval($ids));
$list = [];
foreach ($idArray as $key => $val) {
if(in_array($val,$pids) || $val==$pid){
$file = Db::name('Disk')->find($val);
return to_assign(1, "移动失败,【".$file['name']."】不能移动到文件夹本身或其子目录");
break;
}
$list[] = [
'id' => $val,
'pid' => $pid,
'update_time' => time()
];
}
if(!empty($list)){
$model = new DiskModel();
foreach ($list as $item) {
$model->update($item);
}
return to_assign();
}
else{
return to_assign(1, "转移失败");
}
}else{
$pid = isset($param['pid']) ? $param['pid']: 0 ;
$group_id = isset($param['group_id']) ? $param['group_id']: 0 ;
$path = get_pfolder($pid);
$folder = Db::name('Disk')->where(['pid'=>$pid,'group_id'=>$group_id,'types'=>2,'delete_time'=>0])->order('id desc')->select()->toArray();
$pfolder = '全部文件';
if($pid>0){
$pfolder = Db::name('Disk')->where(['id'=>$pid])->value('name');
}
View::assign('pid', $pid);
View::assign('pfolder', $pfolder);
View::assign('path', $path);
View::assign('folder', $folder);
View::assign('group_id', $group_id);
return view();
}
}
/**
* 标星
*/
public function star()
{
$param = get_params();
if (request()->isAjax()) {
$ids = $param["ids"];
$idArray = explode(',', strval($ids));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'is_star' => 1,
'update_time' => time()
];
}
if(!empty($list)){
$model = new DiskModel();
foreach ($list as $item) {
$model->update($item);
}
return to_assign();
}
else{
return to_assign(1, "操作失败");
}
}
}
/**
* 取消标星
*/
public function unstar()
{
$param = get_params();
if (request()->isAjax()) {
$ids = $param["ids"];
$idArray = explode(',', strval($ids));
$list = [];
foreach ($idArray as $key => $val) {
$list[] = [
'id' => $val,
'is_star' => 0,
'update_time' => time()
];
}
if(!empty($list)){
$model = new DiskModel();
foreach ($list as $item) {
$model->update($item);
}
return to_assign();
}
else{
return to_assign(1, "操作失败");
}
}
}
}
+5
View File
@@ -0,0 +1,5 @@
<?php
// 这是系统自动生成的event定义文件
return [
];
+9
View File
@@ -0,0 +1,9 @@
<?php
// 这是系统自动生成的middleware定义文件
return [
//开启session中间件
//'think\middleware\SessionInit',
//验证勾股OA是否完成安装
\app\home\middleware\Install::class,
];
+138
View File
@@ -0,0 +1,138 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\disk\model;
use think\model;
use think\facade\Db;
class Disk extends Model
{
protected $autoWriteTimestamp=false;
/**
* 获取分页列表
* @param $where
* @param $param
*/
public function datalist($param,$where,$whereOr=[])
{
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
try {
$list = self::where($where)
->where(function ($query) use($whereOr) {
if (!empty($whereOr)){
$query->whereOr($whereOr);
}
})
->orderRaw("case when types = 2 then 1 else 2 end, id desc")
->paginate(['list_rows'=> $rows])
->each(function ($item, $key){
$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
$item->department = Db::name('Department')->where('id',$item->did)->value('title');
if($item->types == 0){
$item->filepath = Db::name('File')->where('id',$item->action_id)->value('filepath');
$item->thumbpath = Db::name('File')->where('id',$item->action_id)->value('thumbpath');
if(empty($item->thumbpath)){
$item->thumbpath = $item->filepath;
}
}
else{
$item->filepath='';
$item->thumbpath='';
}
});
return $list;
} catch(\Exception $e) {
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
}
}
/**
* 添加数据
* @param $param
*/
public function add($param)
{
$insertId = 0;
try {
$param['create_time'] = time();
$insertId = self::strict(false)->field(true)->insertGetId($param);
add_log('add', $insertId, $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$insertId]);
}
/**
* 编辑信息
* @param $param
*/
public function edit($param)
{
try {
$param['update_time'] = time();
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
$info = self::find($param['id']);
if($info['types'] == 0){
Db::name('File')->where('id',$info['action_id'])->update(['name'=>$param['name']]);
}
if($info['types'] == 1){
Db::name('Article')->where('id',$info['action_id'])->update(['name'=>$param['name'],'update_time'=>time()]);
}
add_log('edit', $param['id'], $param);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
}
/**
* 根据id获取信息
* @param $id
*/
public function getById($id)
{
$info = self::find($id);
return $info;
}
/**
* 删除信息
* @param $id
* @param $type
* @return array
*/
public function delById($id,$type=0)
{
if($type==0){
//逻辑删除
try {
$param['delete_time'] = time();
self::where('id', $id)->update(['delete_time'=>time()]);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
else{
//物理删除
try {
self::destroy($id);
add_log('delete', $id);
} catch(\Exception $e) {
return to_assign(1, '操作失败,原因:'.$e->getMessage());
}
}
return to_assign();
}
}
+41
View File
@@ -0,0 +1,41 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\disk\validate;
use think\Validate;
use think\facade\Db;
class DiskValidate extends Validate
{
// 自定义验证规则
protected function checkOne($value,$rule,$data=[])
{
$count = Db::name('Disk')->where([['name','=',$data['name']],['group_id','=',$data['group_id']],['pid','=',$data['pid']],['id','<>',$data['id']]])->count();
return $count == 0 ? true : false;
}
protected $rule = [
'name' => 'require|checkOne',
'id' => 'require',
];
protected $message = [
'name.require' => '名称不能为空',
'name.checkOne' => '同一目录下不能有相同名称的文件',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['name'],
'edit' => ['name', 'id'],
];
}
+120
View File
@@ -0,0 +1,120 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbaruser">
<button class="layui-btn layui-btn-sm" lay-event="add">+ 新增空间管理员</button>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus','oaPicker'];
const id = {$detail.id};
const director_uids = "{$detail.director_uids|default=''}";
function removeDuplicateNumbers(str) {
// 1. 按逗号分割字符串为数组
const numbers = str.split(',');
// 2. 使用Set记录唯一值 + filter保留首次出现的顺序
const seen = new Set();
const uniqueNumbers = numbers.filter(num => {
if (seen.has(num)) return false;
seen.add(num);
return true;
});
// 3. 重新拼接为字符串
return uniqueNumbers.join(',');
}
function removeSpecificNumber(str, target) {
// 1. 将字符串按逗号分割成数组
const numbers = str.split(',');
// 2. 过滤掉所有指定的数字
const filteredNumbers = numbers.filter(num => num !== target.toString());
// 3. 重新拼接为字符串
return filteredNumbers.join(',');
}
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool, form = layui.form, oaPicker = layui.oaPicker;
layui.userTable = table.render({
elem: '#test',
title: '共享空间管理员列表',
cellMinWidth: 80,
toolbar: '#toolbaruser',
url: "/disk/api/adminlist", //数据接口
where: { 'id': id },
page: false, //开启分页
limit: 9999,
cols: [[ //表头
{field: 'id', title: '编号', width: 80, align: 'center' }
,{field: 'name', title: '管理员姓名', width: 100, align: 'center' }
,{field: 'position', title: '职位', align: 'center', width: 200}
,{field: 'department', title: '所在部门'}
,{title: '操作',fixed: 'right', align: 'center', width: 80,templet: function (d) {
let html = '<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">移除</span>';
return html;
}
}
]]
});
//触发事件
table.on('toolbar(test)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
switch(obj.event){
case 'add':
oaPicker.employeeInit({
type: 2,
callback: function (data) {
let callback = function (e) {
layer.msg(e.msg);
if(e.code == 0){
layui.userTable.reload();
}
}
let select_id=[];
for(var a=0; a<data.length;a++){
select_id.push(data[a].id);
}
let ids = select_id.join(',');
if(ids=='' || ids==0){
return false;
}
if(director_uids!=''){
ids = director_uids+','+ids;
}
ids = removeDuplicateNumbers(ids);
tool.post("/disk/api/adminset", {director_uids: ids,id: id}, callback);
}
})
break;
};
});
//监听行工具事件
table.on('tool(test)', function (obj) {
let callback = function (e) {
layer.closeAll();
layer.msg(e.msg);
if(e.code == 0){
layui.userTable.reload();
}
}
if (obj.event === 'remove') {
tool.ask('确定要移除该管理员吗?', function (index) {
let ids = removeSpecificNumber(director_uids, obj.data.id);
tool.post("/disk/api/adminset", {director_uids: ids,id: id}, callback);
});
}
return;
});
}
</script>
{/block}
<!-- /脚本 -->
+120
View File
@@ -0,0 +1,120 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbaruser">
<button class="layui-btn layui-btn-sm" lay-event="add">+ 新增空间成员</button>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus','oaPicker'];
const id = {$detail.id};
const group_uids = "{$detail.group_uids|default=''}";
function removeDuplicateNumbers(str) {
// 1. 按逗号分割字符串为数组
const numbers = str.split(',');
// 2. 使用Set记录唯一值 + filter保留首次出现的顺序
const seen = new Set();
const uniqueNumbers = numbers.filter(num => {
if (seen.has(num)) return false;
seen.add(num);
return true;
});
// 3. 重新拼接为字符串
return uniqueNumbers.join(',');
}
function removeSpecificNumber(str, target) {
// 1. 将字符串按逗号分割成数组
const numbers = str.split(',');
// 2. 过滤掉所有指定的数字
const filteredNumbers = numbers.filter(num => num !== target.toString());
// 3. 重新拼接为字符串
return filteredNumbers.join(',');
}
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool, form = layui.form, oaPicker = layui.oaPicker;
layui.userTable = table.render({
elem: '#test',
title: '共享空间成员列表',
cellMinWidth: 80,
toolbar: '#toolbaruser',
url: "/disk/api/memberlist", //数据接口
where: { 'id': id },
page: false, //开启分页
limit: 9999,
cols: [[ //表头
{field: 'id', title: '编号', width: 80, align: 'center' }
,{field: 'name', title: '成员姓名', width: 100, align: 'center' }
,{field: 'position', title: '职位', align: 'center', width: 200}
,{field: 'department', title: '所在部门'}
,{title: '操作',fixed: 'right', align: 'center', width: 80,templet: function (d) {
let html = '<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">移除</span>';
return html;
}
}
]]
});
//触发事件
table.on('toolbar(test)', function(obj){
var checkStatus = table.checkStatus(obj.config.id);
switch(obj.event){
case 'add':
oaPicker.employeeInit({
type: 2,
callback: function (data) {
let callback = function (e) {
layer.msg(e.msg);
if(e.code == 0){
layui.userTable.reload();
}
}
let select_id=[];
for(var a=0; a<data.length;a++){
select_id.push(data[a].id);
}
let ids = select_id.join(',');
if(ids=='' || ids==0){
return false;
}
if(group_uids!=''){
ids = group_uids+','+ids;
}
ids = removeDuplicateNumbers(ids);
tool.post("/disk/api/memberset", {group_uids: ids,id: id}, callback);
}
})
break;
};
});
//监听行工具事件
table.on('tool(test)', function (obj) {
let callback = function (e) {
layer.closeAll();
layer.msg(e.msg);
if(e.code == 0){
layui.userTable.reload();
}
}
if (obj.event === 'remove') {
tool.ask('确定要移除该成员吗?', function (index) {
let ids = removeSpecificNumber(group_uids, obj.data.id);
tool.post("/disk/api/memberset", {group_uids: ids,id: id}, callback);
});
}
return;
});
}
</script>
{/block}
<!-- /脚本 -->
+76
View File
@@ -0,0 +1,76 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-page">
<h3 class="pb-2">新增文档</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">文档标题<font>*</font></td>
<td><input type="text" name="name" lay-verify="required" lay-reqText="请输入文档标题" autocomplete="off" placeholder="请输入文档标题" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray-2">
<div class="layui-input-inline">关联附件</div>
<div class="layui-input-inline">
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
</div>
</td>
<td>
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="">
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">文档内容<font>*</font></td>
<td><textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea></td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="group_id" value="{$group_id}">
<input type="hidden" name="pid" value="{$pid}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','uploadPlus','tinymce'];
function gouguInit() {
var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
//编辑器初始化
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
menubar:false,
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
height: 555
});
//相关附件上传
var attachment = new uploadPlus();
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善文档的内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
tool.post("/disk/index/add_article", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+320
View File
@@ -0,0 +1,320 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
.disk-left{width:120px; float:left; height:calc(100vh - 86px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px;}
.disk-left::-webkit-scrollbar {width: 0;}
.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
.disk-types{padding:12px 0;}
.disk-types li{padding:8px; border-radius:3px; cursor:pointer;}
.disk-types li strong{margin-right:12px; font-size:18px;}
.disk-types li:hover{background-color:#F3F4F5;}
.disk-types li.on-this{background-color:#F2FAFF; color:#1E9FFF}
.disk-line{border-bottom:1px solid #eee; margin:6px 0;}
.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 56px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
.layui-btn.tool-add{padding:0 12px;}
.disk-path{height:48px;padding:0 4px 0 12px;}
.disk-breadcrumb{float:left; padding:11px 0}
.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
.layui-tab{margin:0;}
.file-item {height:calc(100vh - 216px); overflow-y: auto;}
.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
/** 文件 **/
.file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
.file-item .file-subject:hover::-webkit-scrollbar { display: block; }
.file-item .file-subject ul { display: flex; flex-wrap: wrap; }
.file-item .file-subject ul li {position: relative; height: 144px; margin:20px 10px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
.file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
.file-item .file-subject ul li.on {border: 1px solid #ff5722; }
.file-item .file-subject ul li img { width: 86px; height: 86px; padding:16px;}
.file-item .file-subject ul li img.file-image { width: 118px; height: 118px; padding:0; border-radius: 2px; }
.file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
.file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 118px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
.file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}
.file-item .file-subject ul li:hover .file-check{display: block;}
.file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; display:none;}
.file-item .file-subject ul li:hover .layui-btn-ctrl{display:block}
.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
.file-item .file-subject ul li .has-share{position: absolute; width:20px; height:20px; right: 2px; top: 75px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#1E9FFF; border:1px solid #fff; padding:2px;}
.file-item .file-subject ul li .has-star{position: absolute; width:20px; height:20px; right: 32px; top: 75px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#ffb800; border:1px solid #fff; padding:2px;}
.file-item .file-subject ul li .file-info{position: absolute; width:100%; height:23px; left: 0; top: 0; text-align:center; font-size: 12px; line-height: 23px; background-color:rgba(0,0,0,.12);border-radius:2px 2px 0 0;}
.file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
/** 无数据 **/
.file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
.file-item .empty i { font-size: 180px; }
.file-item .empty p { width: 180px; text-align: center; }
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<div class="disk-left">
<h3>全部文件</h3>
<div id="diskTypes" class="disk-types">
<ul>
<li class="on-this" data-tab=""><strong class="iconfont icon-dingdanguanli"></strong>全部</li>
<li data-tab="image"><strong class="iconfont icon-sucaiguanli"></strong>图片</li>
<li data-tab="video"><strong class="iconfont icon-wodekecheng"></strong>视频</li>
<li data-tab="audio"><strong class="iconfont icon-tuiguang"></strong>音频</li>
<li data-tab="office"><strong class="iconfont icon-chengjiliebiao"></strong>Office文件</li>
<li data-tab="pdf"><strong class="iconfont icon-lunwenguanli"></strong>在线文档</li>
<li data-tab="zip"><strong class="iconfont icon-xiaoshoupin"></strong>压缩文件</li>
</ul>
</div>
</div>
<div class="disk-table">
<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
{gt name="$auth" value="0"}
<div class="layui-input-inline user-name" style="width:90px;">
<input type="text" name="admin" placeholder="选择员工" class="layui-input picker-admin" readonly />
<input type="text" name="admin_id" value="" style="display:none" />
</div>
{else/}
{gt name="$is_leader" value="0"}
<div class="layui-input-inline user-name" style="width:90px;">
<input type="text" name="admin" placeholder="选择员工" class="layui-input picker-sub" readonly />
<input type="text" name="admin_id" value="" style="display:none" />
</div>
{/gt}
{/gt}
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="输入关键字,文件名称/目录名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<input type="hidden" name="pid" value="0" />
<input type="hidden" name="ext" value="" />
<input type="hidden" name="limit" value="30" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset">清空</button>
</div>
</form>
<div class="disk-path layui-form border-b">
<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-component"></i> <a href="javascript:void(0);" data-id="0">全部文件</a></div>
</div>
<!-- 主体 -->
<div class="file-item">
<div class="file-subject">
<ul id="filesBox"></ul>
</div>
</div>
<!-- 页脚 -->
<div class="file-footer">
<div id="laypage"></div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const fileExt={
image:['jpg','jpeg','png','gif'],
office:['doc','docx','xls','xlsx','ppt','pptx'],
pdf:['txt','pdf','article'],
zip:['zip','rar','7z','gz','tar'],
video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
audio:['mp3','wav','wma','flac','midi']
};
const moduleInit = ['tool','uploadPlus','oaPicker'];
function gouguInit() {
var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage;
let ctrl_callback = function (e) {
if(e.code == 0){
layer.closeAll();
layer.msg(e.msg);
$('[lay-filter="webform"]').click();
}
else{
layer.msg(e.msg);
}
}
//左侧操作
$('#diskTypes').on('click','li',function(){
$(this).addClass('on-this').siblings().removeClass('on-this');
let tab = $(this).data('tab');
$('[name="pid"]').val(0);
$('[name="keywords"]').val('');
if(tab==''){
$('[name="ext"]').val('');
}
else{
$('[name="ext"]').val(fileExt[tab]);
}
let data = form.val('barsearchform');
get_files(data);
})
//顶部目录操作
$('#diskPath').on('click','a',function(){
let id=$(this).data('id');
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
})
//查看文件
$('#filesBox').on('click','.file-item',function(){
let id = $(this).parent().data('id');
let href = $(this).data('href');
let ext = $(this).data('ext');
if(ext == 'video'){
tool.videoView(href);
}
else if(ext == 'audio'){
tool.audioView(href);
}
else if(ext == 'image'){
tool.photoView(href);
}
else if(ext == 'pdf'){
tool.pdfView(href);
}
else if(ext == 'article'){
tool.articleView(id);
}
else if(ext == 'folder'){
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
}
else{
return false;
}
})
//加载数据
var data = form.val('barsearchform');
get_files(data);
form.on('submit(webform)', function (data) {
get_files(data.field);
return false;
});
$('.layui-btn-reset').click(function(){
setTimeout(function(){
$('[lay-filter="webform"]').click();
},200)
})
function get_files(param){
var loadIndex = layer.load(0);
$.ajax({
url:"/disk/index/alllist",
data:param,
complete:function(){
setTimeout(function(){
layer.close(loadIndex)
}, 200);
},
success:function(res){
$('[name="select_all"]').prop('checked', false);
form.render('checkbox');
if(res.code==0){
laypage.render({
elem: 'laypage',
limit:param['limit'],
curr:param['page'],
count: res.count, // 数据总数
jump: function(obj, first){
//console.log(obj.curr); // 得到当前页,以便向服务端请求对应页的数据。
//console.log(obj.limit); // 得到每页显示的条数
// 首次不执行
if(!first){
var data = form.val('barsearchform');
data['page'] = obj.curr;
get_files(data);
}
}
});
let folder = res.totalRow;
let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">全部文件</a>';
if(folder.length>0){
for(var f=0;f<folder.length;f++){
folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
}
}
$('#diskPath').html(folderHtml);
var item=res.data,li='';
if(item.length>0){
for(var a=0;a<item.length;a++){
let type = '',ext="zip";
// 判断元素是否在数组中
let path='/static/home/images/icon/file.png';
if (fileExt.image.includes(item[a].file_ext)) {
path=item[a].thumbpath;
type = '0,1';
ext="image";
}
if (fileExt.office.includes(item[a].file_ext)) {
type = '0,1';
ext="office";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
type = '0,1';
ext="pdf";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (fileExt.video.includes(item[a].file_ext)) {
type = '0,1';
ext="video";
path='/static/home/images/icon/video.png';
}
if (fileExt.audio.includes(item[a].file_ext)) {
type = '0,1';
ext="audio";
path='/static/home/images/icon/audio.png';
}
if (fileExt.zip.includes(item[a].file_ext)) {
type = '0';
ext="zip";
path='/static/home/images/icon/rar.png';
}
if(item[a].types==1){
type = '1';
ext="article";
path='/static/home/images/icon/article.png';
}
ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
if(item[a].types==2){
ext="folder";
path='/static/home/images/icon/folder.png';
ctrl='';
}
let is_share='';
if(item[a].is_share==1){
is_share='<div class="has-share" title="已分享"><i class="iconfont icon-fenxiang"></i></div>';
}
li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
<div class="file-info">'+item[a].department+''+item[a].admin_name+'</div><div class="layui-btn-ctrl">'+ctrl+'</div>'+is_share+'</li>';
}
$('#filesBox').html(li);
$('#laypage').show();
}
else{
$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件,赶紧去上传吧!</p></div>');
$('#laypage').hide();
}
}
}
});
}
}
</script>
{/block}
<!-- /脚本 -->
+319
View File
@@ -0,0 +1,319 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
.disk-left{width:120px; float:left; height:calc(100vh - 86px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px;}
.disk-left::-webkit-scrollbar {width: 0;}
.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
.disk-types{padding:12px 0;}
.disk-types li{padding:8px; border-radius:3px; cursor:pointer;}
.disk-types li strong{margin-right:12px; font-size:18px;}
.disk-types li:hover{background-color:#F3F4F5;}
.disk-types li.on-this{background-color:#F2FAFF; color:#1E9FFF}
.disk-line{border-bottom:1px solid #eee; margin:6px 0;}
.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 56px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
.layui-btn.tool-add{padding:0 12px;}
.disk-path{height:42px;padding:0 4px 0 12px;}
.disk-breadcrumb{float:left; padding:8px 0}
.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
.layui-tab{margin:0;}
.file-item {height:calc(100vh - 216px); overflow-y: auto;}
.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
/** 文件 **/
.file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
.file-item .file-subject:hover::-webkit-scrollbar { display: block; }
.file-item .file-subject ul { display: flex; flex-wrap: wrap; }
.file-item .file-subject ul li {position: relative; height: 144px; margin:20px 10px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
.file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
.file-item .file-subject ul li.on {border: 1px solid #ff5722; }
.file-item .file-subject ul li img { width: 86px; height: 86px; padding:16px;}
.file-item .file-subject ul li img.file-image { width: 118px; height: 118px; padding:0; border-radius: 2px; }
.file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
.file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 118px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
.file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}
.file-item .file-subject ul li:hover .file-check{display: block;}
.file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; opacity: 0;}
.file-item .file-subject ul li:hover .layui-btn-ctrl{opacity: 1;}
.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
.file-item .file-subject ul li .has-star{position: absolute; width:20px; height:20px; right: 32px; top: 75px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#ffb800; border:1px solid #fff; padding:2px;}
.file-item .file-subject ul li .file-info{position: absolute; width:100%; height:23px; left: 0; top: 0; text-align:center; font-size: 12px; line-height: 23px; background-color:rgba(0,0,0,.12);border-radius:2px 2px 0 0;}
.file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
/** 无数据 **/
.file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
.file-item .empty i { font-size: 180px; }
.file-item .empty p { width: 180px; text-align: center; }
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<div class="disk-left">
<h3>回收站文件</h3>
<div id="diskTypes" class="disk-types">
<ul>
<li class="on-this" data-tab=""><strong class="iconfont icon-kaohezhibiao"></strong>全部</li>
<li data-tab="image"><strong class="iconfont icon-sucaiguanli"></strong>图片</li>
<li data-tab="video"><strong class="iconfont icon-wodekecheng"></strong>视频</li>
<li data-tab="audio"><strong class="iconfont icon-tuiguang"></strong>音频</li>
<li data-tab="office"><strong class="iconfont icon-chengjiliebiao"></strong>Office文件</li>
<li data-tab="pdf"><strong class="iconfont icon-lunwenguanli"></strong>在线文档</li>
<li data-tab="zip"><strong class="iconfont icon-xiaoshoupin"></strong>压缩文件</li>
</ul>
</div>
</div>
<div class="disk-table">
<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="输入关键字,文件名称/目录名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<input type="hidden" name="pid" value="0" />
<input type="hidden" name="ext" value="" />
<input type="hidden" name="limit" value="48" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset">清空</button>
</div>
</form>
<div class="disk-path layui-form border-b">
<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">回收站文件</a></div>
</div>
<!-- 主体 -->
<div class="file-item">
<div class="file-subject">
<ul id="filesBox"></ul>
</div>
</div>
<!-- 页脚 -->
<div class="file-footer">
<div id="laypage"></div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const fileExt={
image:['jpg','jpeg','png','gif'],
office:['doc','docx','xls','xlsx','ppt','pptx'],
pdf:['txt','pdf','article'],
zip:['zip','rar','7z','gz','tar'],
video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
audio:['mp3','wav','wma','flac','midi']
};
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage;
let ctrl_callback = function (e) {
if(e.code == 0){
layer.closeAll();
layer.msg(e.msg);
$('[lay-filter="webform"]').click();
}
else{
layer.msg(e.msg);
}
}
//左侧操作
$('#diskTypes').on('click','li',function(){
$(this).addClass('on-this').siblings().removeClass('on-this');
let tab = $(this).data('tab');
$('[name="pid"]').val(0);
$('[name="keywords"]').val('');
if(tab==''){
$('[name="ext"]').val('');
}
else{
$('[name="ext"]').val(fileExt[tab]);
}
let data = form.val('barsearchform');
get_files(data);
})
//顶部目录操作
$('#diskPath').on('click','a',function(){
let id=$(this).data('id');
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
})
//查看文件
$('#filesBox').on('click','.file-item',function(){
let id = $(this).parent().data('id');
let href = $(this).data('href');
let ext = $(this).data('ext');
if(ext == 'video'){
tool.videoView(href);
}
else if(ext == 'audio'){
tool.audioView(href);
}
else if(ext == 'image'){
tool.photoView(href);
}
else if(ext == 'pdf'){
tool.pdfView(href);
}
else if(ext == 'article'){
tool.articleView(id);
}
else if(ext == 'folder'){
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
}
else{
return false;
}
})
//单文件还原
$('#filesBox').on('click','.file-back',function(){
let id = $(this).parent().parent().data('id');
layer.confirm('确定要还原该文件吗?', { icon: 3, title: '提示' }, function (index) {
tool.delete("/disk/index/back", {ids:id}, ctrl_callback);
});
})
//单文件清除
$('#filesBox').on('click','.file-clear',function(){
let id = $(this).parent().parent().data('id');
layer.confirm('确定要清除该文件吗?清除后将不可恢复', { icon: 3, title: '提示' }, function (index) {
tool.post("/disk/index/clear", {ids:id}, ctrl_callback);
});
})
//加载数据
var data = form.val('barsearchform');
get_files(data);
form.on('submit(webform)', function (data) {
get_files(data.field);
return false;
});
$('.layui-btn-reset').click(function(){
setTimeout(function(){
$('[lay-filter="webform"]').click();
},200)
})
function get_files(param){
var loadIndex = layer.load(0);
$.ajax({
url:"/disk/index/clearlist",
data:param,
complete:function(){
layer.close(loadIndex)
},
success:function(res){
$('[name="select_all"]').prop('checked', false);
form.render('checkbox');
if(res.code==0){
laypage.render({
elem: 'laypage',
limit:param['limit'],
curr:param['page'],
count: res.count, // 数据总数
jump: function(obj, first){
//console.log(obj.curr); // 得到当前页,以便向服务端请求对应页的数据。
//console.log(obj.limit); // 得到每页显示的条数
// 首次不执行
if(!first){
var data = form.val('barsearchform');
data['page'] = obj.curr;
get_files(data);
}
}
});
let folder = res.totalRow;
let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">回收站文件</a>';
if(folder.length>0){
for(var f=0;f<folder.length;f++){
folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
}
}
$('#diskPath').html(folderHtml);
var item=res.data,li='';
if(item.length>0){
for(var a=0;a<item.length;a++){
let type = '',ext="zip";
// 判断元素是否在数组中
let path='/static/home/images/icon/file.png';
if (fileExt.image.includes(item[a].file_ext)) {
path=item[a].thumbpath;
type = '0,1,8,9';
ext="image";
}
if (fileExt.office.includes(item[a].file_ext)) {
type = '0,1,8,9';
ext="office";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
type = '0,1,8,9';
ext="pdf";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (fileExt.video.includes(item[a].file_ext)) {
type = '0,1,8,9';
ext="video";
path='/static/home/images/icon/video.png';
}
if (fileExt.audio.includes(item[a].file_ext)) {
type = '0,8,9';
ext="audio";
path='/static/home/images/icon/audio.png';
}
if (fileExt.zip.includes(item[a].file_ext)) {
type = '0,8,9';
ext="zip";
path='/static/home/images/icon/rar.png';
}
if(item[a].types==1){
type = '1,8,9';
ext="article";
path='/static/home/images/icon/article.png';
}
if(item[a].types==2){
type = '8,9';
ext="folder";
path='/static/home/images/icon/folder.png';
}
ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
<div class="layui-btn-ctrl">'+ctrl+'\
<span class="file-back" style="display:none;" id="fileBack'+item[a].id+'" title="还原"></span>\
<span class="file-clear" style="display:none;" id="fileClear'+item[a].id+'" title="清除"></span>\
</div></li>';
}
$('#filesBox').html(li);
$('#laypage').show();
}
else{
$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件,赶紧去上传吧!</p></div>');
$('#laypage').hide();
}
}
}
});
}
}
</script>
{/block}
<!-- /脚本 -->
+536
View File
@@ -0,0 +1,536 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
.disk-left{width:120px; float:left; height:calc(100vh - 86px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px;user-select: none;}
.disk-left::-webkit-scrollbar {width: 0;}
.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
.disk-types{padding:12px 0;}
.disk-types li{padding:8px; border-radius:3px; cursor:pointer;}
.disk-types li strong{margin-right:12px; font-size:18px;}
.disk-types li:hover{background-color:#F3F4F5;}
.disk-types li.on-this{background-color:#F2FAFF; color:#1E9FFF}
.disk-line{border-bottom:1px solid #eee; margin:6px 0;}
.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 56px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
.layui-btn.tool-add{padding:0 12px;}
.disk-path{height:42px;padding:0 4px 0 12px;}
.disk-breadcrumb{float:left; padding:8px 0}
.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
.layui-tab{margin:0;}
.file-item {height:calc(100vh - 216px); overflow-y: auto;}
.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
/** 文件 **/
.file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
.file-item .file-subject:hover::-webkit-scrollbar { display: block; }
.file-item .file-subject ul { display: flex; flex-wrap: wrap; }
.file-item .file-subject ul li {position: relative; height: 144px; margin:20px 10px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
.file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
.file-item .file-subject ul li.on {border: 1px solid #ff5722; }
.file-item .file-subject ul li img { width: 86px; height: 86px; padding:16px;}
.file-item .file-subject ul li img.file-image { width: 118px; height: 118px; padding:0; border-radius: 2px; }
.file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
.file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 118px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
.file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}
.file-item .file-subject ul li:hover .file-check{display: block;}
.file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; opacity: 0;}
.file-item .file-subject ul li:hover .layui-btn-ctrl{opacity: 1;}
.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
.file-item .file-subject ul li .has-star{position: absolute; width:20px; height:20px; right: 1px; top: 80px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#ffb800; border:1px solid #fff; padding:2px;}
.file-item .file-subject ul li .file-info{position: absolute; width:100%; height:23px; left: 0; top: 0; text-align:center; font-size: 12px; line-height: 23px; background-color:rgba(0,0,0,.12);border-radius:2px 2px 0 0;}
.file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
/** 无数据 **/
.file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
.file-item .empty i { font-size: 180px; }
.file-item .empty p { width: 180px; text-align: center; }
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<div class="disk-left">
<h3>我的空间</h3>
<div id="diskTypes" class="disk-types">
<ul>
<li class="on-this" data-tab=""><strong class="iconfont icon-dingdanguanli"></strong>全部</li>
<li data-tab="image"><strong class="iconfont icon-sucaiguanli"></strong>图片</li>
<li data-tab="video"><strong class="iconfont icon-wodekecheng"></strong>视频</li>
<li data-tab="audio"><strong class="iconfont icon-tuiguang"></strong>音频</li>
<li data-tab="office"><strong class="iconfont icon-chengjiliebiao"></strong>Office文件</li>
<li data-tab="pdf"><strong class="iconfont icon-lunwenguanli"></strong>在线文档</li>
<li data-tab="zip"><strong class="iconfont icon-xiaoshoupin"></strong>压缩文件</li>
</ul>
<p class="disk-line"></p>
<ul>
<li data-tab="star"><strong class="iconfont icon-pingfen" style="color:#FFB800"></strong>标星文件</li>
</ul>
</div>
</div>
<div class="disk-table">
<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:312px">
<div class="layui-btn-group">
<span class="layui-btn tool-add" id="uploadBtn"><strong class="iconfont icon-shangchuan"></strong> 上传文件</span>
<span class="layui-btn layui-btn-normal tool-add" id="addArticle"><strong class="iconfont icon-lunwenguanli"></strong> 新建文档</span>
<span class="layui-btn layui-btn-warm tool-add" id="addFolder"><strong class="iconfont icon-xiangmuguanli"></strong> 新建目录</span>
</div>
</div>
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="输入关键字,文件名称/目录名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<input type="hidden" name="pid" value="0" />
<input type="hidden" name="ext" value="" />
<input type="hidden" name="group_id" value="0" />
<input type="hidden" name="is_star" value="" />
<input type="hidden" name="limit" value="30" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset">清空</button>
</div>
</form>
<div class="disk-path layui-form border-b">
<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">我的空间</a></div>
<div class="layui-input-inline" style="width:160px; float:right; padding-top:5px;">
<div class="layui-btn-group">
<span class="layui-btn layui-btn-sm layui-btn-primary"><input type="checkbox" name="select_all" lay-filter="all" title="全选"></span>
<span class="layui-btn layui-btn-sm layui-btn-primary" id="fileDelete">删除</span>
<span class="layui-btn layui-btn-sm layui-btn-primary" id="fileMove">移动</span>
</div>
</div>
</div>
<!-- 主体 -->
<div class="file-item">
<div class="file-subject">
<ul id="filesBox"></ul>
</div>
</div>
<!-- 页脚 -->
<div class="file-footer">
<div id="laypage"></div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const fileExt={
image:['jpg','jpeg','png','gif'],
office:['doc','docx','xls','xlsx','ppt','pptx'],
pdf:['txt','pdf','article'],
zip:['zip','rar','7z','gz','tar'],
video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
audio:['mp3','wav','wma','flac','midi']
};
function isValidFileName(fileName) {
const illegalChars = /[\\\/\*\:"<>|\?]/;
return !illegalChars.test(fileName);
}
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage;
//上传文件
var attachment = new uploadPlus({
"title":'上传文件',
"target":'uploadBtn',
"attachment":{
"type":1,//0ajax多文件模式,1ajax单文件单记录模式
"ajaxSave":function(res){
$.ajax({
url: "/disk/index/add_upload",
type:'post',
data:{
'pid':$('[name="pid"]').val(),
'group_id':0,
'action_id':res.data.id,
'name':res.data.name,
'file_size':res.data.filesize,
'id':0,
'file_ext':res.data.fileext
},
success: function (e) {
layer.msg(e.msg);
if (e.code == 0) {
$('[lay-filter="webform"]').click();
}
}
})
}
}
})
let ctrl_callback = function (e) {
if(e.code == 0){
layer.closeAll();
layer.msg(e.msg);
$('[lay-filter="webform"]').click();
}
else{
layer.msg(e.msg);
}
}
//左侧操作
$('#diskTypes').on('click','li',function(){
$('#diskTypes').find('li').removeClass('on-this');
$(this).addClass('on-this');
let tab = $(this).data('tab');
$('[name="pid"]').val(0);
$('[name="keywords"]').val('');
$('[name="ext"]').val('');
$('[name="is_star"]').val('');
if(tab==''){
$('[name="ext"]').val('');
}
else{
if(tab == 'star'){
$('[name="is_star"]').val('1');
}
else{
$('[name="ext"]').val(fileExt[tab]);
}
}
let data = form.val('barsearchform');
get_files(data);
})
//顶部目录操作
$('#diskPath').on('click','a',function(){
let id=$(this).data('id');
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
})
//单文件选择操作
$('#filesBox').on('click','.file-check',function(){
$(this).parent().toggleClass("on");
})
//全选操作
form.on('checkbox(all)', function (data) {
  let val = data.value;
if(data.elem.checked){
//判断当前多选框是选中还是取消选中
$('#filesBox li').addClass('on');
}
else{
$('#filesBox li').removeClass('on');
}
});
//批量删除操作
$('#fileDelete').on('click',function(){
let select_array = [];
$('#filesBox').find('li.on').each(function(index,item){
select_array.push($(item).data('id'));
})
if(select_array.length<1){
layer.msg('请先选择文件');
return false;
}
layer.confirm('确定要删除这些文件吗?请慎重', { icon: 3, title: '提示' }, function (index) {
tool.delete("/disk/index/del", {ids:select_array.join(',')}, ctrl_callback);
});
});
//批量移动操作
$('#fileMove').on('click',function(){
let select_array = [];
$('#filesBox').find('li.on').each(function(index,item){
select_array.push($(item).data('id'));
})
if(select_array.length<1){
layer.msg('请先选择文件');
return false;
}
layer.open({
type: 2,
title: '移动到',
area: ['720px', '480px'],
content: '/disk/index/move',
maxmin: true,
btn: ['移动到此', '取消'],
btnAlign: 'c',
yes: function(index, layero){
// 获取 iframe 的窗口对象
let iframeWin = window[layero.find('iframe')[0]['name']];
let folder = iframeWin.$('#folder'); // 获得 iframe 中某个输入框元素
let val = folder.val();
tool.post("/disk/index/move", {ids:select_array.join(','),pid:val}, ctrl_callback);
}
});
})
//新增在线文档
$('#addArticle').on('click',function(){
tool.side('/disk/index/add_article?pid='+$('[name="pid"]').val());
})
//新增目录
$('#addFolder').on('click',function(){
layer.prompt({title: '请输入目录名称'}, function(val, index, elem){
if(val==''){
layer.msg('目录名称不能为空');
return false;
}
if(isValidFileName(val)==false){
layer.msg('目录名称不能包含下列任何字符:\/:*?".<>|');
return false;
}
$.ajax({
url: "/disk/index/add_folder",
type:'post',
data:{
'pid':$('[name="pid"]').val(),
'name':val,
'id':0,
'group_id':$('[name="group_id"]').val()
},
success: ctrl_callback
})
});
})
//查看文件
$('#filesBox').on('click','.file-item',function(){
let id = $(this).parent().data('id');
let href = $(this).data('href');
let ext = $(this).data('ext');
if(ext == 'video'){
tool.videoView(href);
}
else if(ext == 'audio'){
tool.audioView(href);
}
else if(ext == 'image'){
tool.photoView(href);
}
else if(ext == 'pdf'){
tool.pdfView(href);
}
else if(ext == 'article'){
tool.articleView(id);
}
else if(ext == 'folder'){
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
}
else{
return false;
}
})
//重命名文件
$('#filesBox').on('click','.name-edit',function(){
let id = $(this).parent().parent().data('id');
let title = $(this).parent().parent().data('title');
let ext = $(this).parent().parent().data('ext');
let types = $(this).parent().parent().data('types');
title = title.toString().replace(/\.[^.]+$/, "");
layer.prompt({title: '重命名',value:title}, function(val, index, elem){
if(val==''){
layer.msg('文件名不能为空');
return false;
}
if(isValidFileName(val)==false){
layer.msg('文件名不能包含下列任何字符:\/:*?".<>|');
return false;
}
if(types == 0){
val = val+'.'+ext;
}
tool.post("/disk/index/rename", {id:id,name:val,group_id:$('[name="group_id"]').val(),pid:$('[name="pid"]').val()}, ctrl_callback);
});
})
//单文件删除
$('#filesBox').on('click','.file-delete',function(){
let id = $(this).parent().parent().data('id');
layer.confirm('确定要删除该文件吗?请慎重', { icon: 3, title: '提示' }, function (index) {
tool.delete("/disk/index/del", {ids:id}, ctrl_callback);
});
})
//单文件标星
$('#filesBox').on('click','.file-star',function(){
let id = $(this).parent().parent().data('id');
layer.confirm('确定要标星该文件吗?', { icon: 3, title: '提示' }, function (index) {
tool.post("/disk/index/star", {ids:id}, ctrl_callback);
});
})
//单文件取消标星
$('#filesBox').on('click','.file-starno',function(){
let id = $(this).parent().parent().data('id');
layer.confirm('确定要取消标星该文件吗?', { icon: 3, title: '提示' }, function (index) {
tool.post("/disk/index/unstar", {ids:id}, ctrl_callback);
});
})
//单文件移动
$('#filesBox').on('click','.file-move',function(){
let ids = $(this).parent().parent().data('id');
layer.open({
type: 2,
title: '移动到',
area: ['720px', '480px'],
content: '/disk/index/move',
maxmin: true,
btn: ['移动到此', '取消'],
btnAlign: 'c',
yes: function(index, layero){
// 获取 iframe 的窗口对象
let iframeWin = window[layero.find('iframe')[0]['name']];
let folder = iframeWin.$('#folder'); // 获得 iframe 中某个输入框元素
let val = folder.val();
tool.post("/disk/index/move", {ids:ids,pid:val}, ctrl_callback);
}
});
})
//加载数据
var data = form.val('barsearchform');
get_files(data);
form.on('submit(webform)', function (data) {
get_files(data.field);
return false;
});
$('.layui-btn-reset').click(function(){
setTimeout(function(){
$('[lay-filter="webform"]').click();
},200)
})
function get_files(param){
var loadIndex = layer.load(0);
$.ajax({
url:"/disk/index/datalist",
data:param,
complete:function(){
layer.close(loadIndex)
},
success:function(res){
$('[name="select_all"]').prop('checked', false);
form.render('checkbox');
if(res.code==0){
laypage.render({
elem: 'laypage',
limit:param['limit'],
curr:param['page'],
count: res.count, // 数据总数
jump: function(obj, first){
//console.log(obj.curr); // 得到当前页,以便向服务端请求对应页的数据。
//console.log(obj.limit); // 得到每页显示的条数
// 首次不执行
if(!first){
var data = form.val('barsearchform');
data['page'] = obj.curr;
get_files(data);
}
}
});
let folder = res.totalRow;
let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">我的空间</a>';
if(folder.length>0){
for(var f=0;f<folder.length;f++){
folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
}
}
$('#diskPath').html(folderHtml);
var item=res.data,li='';
if(item.length>0){
for(var a=0;a<item.length;a++){
let type = '',ext="zip",is_star='';
// 判断元素是否在数组中
let path='/static/home/images/icon/file.png';
if (fileExt.image.includes(item[a].file_ext)) {
path=item[a].thumbpath;
type = '0,1,3,4,5';
ext="image";
}
if (fileExt.office.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="office";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
type = '0,1,3,4,5';
ext="pdf";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (fileExt.video.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="video";
path='/static/home/images/icon/video.png';
}
if (fileExt.audio.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="audio";
path='/static/home/images/icon/audio.png';
}
if (fileExt.zip.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="zip";
path='/static/home/images/icon/rar.png';
}
if(item[a].types==1){
type = '1,2,3,4,5';
ext="article";
path='/static/home/images/icon/article.png';
}
if(item[a].types==2){
type = '3,4,5';
ext="folder";
path='/static/home/images/icon/folder.png';
}
else{
if(item[a].is_star==1){
type+=',7';
is_star='<div class="has-star" title="已标星"><i class="iconfont icon-pingfen"></i></div>';
}
else{
type+=',6';
}
}
ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
<div class="layui-btn-ctrl">'+ctrl+'\
<span class="name-edit" style="display:none;" id="fileEdit'+item[a].id+'" title="重命名"></span>\
<span class="file-delete" style="display:none;" id="fileDel'+item[a].id+'" title="删除"></span>\
<span class="file-move" style="display:none;" id="fileMove'+item[a].id+'" title="移动"></span>\
<span class="file-star" style="display:none;" id="fileStar'+item[a].id+'" title="标星"></span>\
<span class="file-starno" style="display:none;" id="fileStarno'+item[a].id+'" title="取消标星"></span>\
</div>\
<div class="file-check">✔</div>'+is_star+'</li>';
}
$('#filesBox').html(li);
$('#laypage').show();
}
else{
$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件,赶紧去上传吧!</p></div>');
$('#laypage').hide();
}
}
}
});
}
}
</script>
{/block}
<!-- /脚本 -->
+81
View File
@@ -0,0 +1,81 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">新增文档</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">文档标题<font>*</font></td>
<td><input type="text" name="name" value="{$detail.name}" lay-verify="required" lay-reqText="请输入文档标题" autocomplete="off" placeholder="请输入文档标题" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray-2">
<div class="layui-input-inline">关联附件</div>
<div class="layui-input-inline">
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
</div>
</td>
<td>
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
{notempty name="$detail.file_ids"}
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
{/volist}
{/notempty}
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">文档内容<font>*</font></td>
<td><textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea></td>
</tr>
</table>
<div class="pt-3">
<input type="hidden" name="id" value="{$detail.id}">
<input type="hidden" name="disk_id" value="{$detail.disk_id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','uploadPlus','tinymce'];
function gouguInit() {
var form = layui.form,tool=layui.tool,uploadPlus = layui.uploadPlus;
//编辑器初始化
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
menubar:false,
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
height: 555
});
//相关附件上传
var attachment = new uploadPlus();
//监听提交
form.on('submit(webform)', function (data) {
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善文档的内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
tool.post("/disk/index/add_article", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+61
View File
@@ -0,0 +1,61 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.disk-table{overflow:hidden;height:372px; background-color:#fff;}
.layui-btn.tool-add{padding:0 12px;}
.disk-path{height:48px;padding:0 4px 0 12px;}
.disk-breadcrumb{float:left; padding:11px 0}
.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
.layui-tab{margin:0;}
.file-item {height:calc(100vh - 120px); overflow-y: auto;}
/** 文件 **/
.disk-folder {height:372px; overflow: hidden; overflow-y: auto; box-sizing: border-box; padding-bottom:44px;}
.disk-folder ul li { display: flex; position: relative; padding: 12px 16px; border-bottom: 1px solid rgba(0, 0, 0, 0.05);display: flex; flex-wrap: wrap; line-height:24px;}
.disk-folder ul li:hover {background-color:#f8f8f8;}
.disk-folder ul li img{margin-right:12px;}
/** 无数据 **/
.disk-folder .empty {text-align: center; color: #999; padding:48px 0}
.disk-folder .empty p{padding:12px 0}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="disk-table">
<div class="disk-path layui-form border-b">
<div class="disk-breadcrumb" id="diskPath">
<i class="layui-icon layui-icon-windows"></i> <a href="/disk/index/move?pid=0&group_id={$group_id}">根目录</a>
{volist name="$path" id="vo"}
<span></span><a href="/disk/index/move?pid={$vo.id}&group_id={$group_id}">{$vo.name}</a>
{/volist}
</div>
</div>
<div class="disk-folder">
{empty name="$folder"}
<div class="empty"><img src="/static/home/images/icon/folder.png" width="100" height="100" /><p>移动到 【{$pfolder}】 文件夹</p></div>
{/empty}
<ul>
{volist name="$folder" id="vo"}
<li><a href="/disk/index/move?pid={$vo.id}&group_id={$group_id}"><img src="/static/home/images/icon/folder.png" width="24" height="24" /> {$vo.name}</a></li>
{/volist}
</ul>
</div>
<input type="hidden" name="folder" id="folder" value="{$pid}">
<input type="hidden" name="group_id" id="group_id" value="{$group_id}">
</div>
{/block}
<!-- /主体 -->
{block name="copyright"}{/block}
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var tool = layui.tool;
}
</script>
{/block}
<!-- /脚本 -->
+558
View File
@@ -0,0 +1,558 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
::-webkit-scrollbar { display: none; width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { border-radius: 10px; background-color: #e1e1e1;}
.disk-left{width:180px; position: relative; float:left; height:calc(100vh - 86px); overflow-y: auto; border:1px solid #eeeeee; background-color:#fbfbfb; padding:15px 0; user-select: none;}
.disk-left::-webkit-scrollbar {width: 0;}
.disk-left h3{font-size:18px; height:30px; padding-left:10px; font-weight:800}
.disk-table{margin-left:120px; overflow:hidden; height:calc(100vh - 56px);border:1px solid #eeeeee; border-left:0; background-color:#fff;}
.layui-btn.tool-add{padding:0 12px;}
.disk-path{height:40px;padding:0 4px 0 12px;}
.disk-breadcrumb{float:left; padding:7px 0}
.disk-breadcrumb span{color:#666; margin:0 8px; font-size:10px;}
.layui-tab{margin:0;}
.file-item {height:calc(100vh - 206px); overflow-y: auto;}
.disk-path .layui-form-checkbox[lay-skin=primary]>div{padding-right:4px}
.layui-tabs-header li{padding:0 12px;}
/** 共享空间 **/
.disk-group {display: flex; flex-direction: column; width: 180px; border-right: 1px solid #f6f6f6; padding-top:12px;}
.disk-group ul::-webkit-scrollbar { display: block; }
.disk-group ul { flex: 1; overflow: hidden; overflow-y: auto;}
.disk-group ul li {display: flex; align-items: center; justify-content: space-between; cursor:pointer; padding-left:12px; padding-right:4px; height: 42px; color: #666666; }
.disk-group ul li i.layui-icon-component{ margin-right:4px; font-size:20px;font-weight:800;}
.disk-group ul li i.layui-icon-more-vertical{font-size:20px; padding-right12px;}
.disk-group ul li > span { display: flex; flex: 1; overflow: hidden; margin-right: 0.5rem; text-overflow: ellipsis; white-space: nowrap; }
.disk-group ul li.active { background: #F2FAFF; color:#1e9fff;}
.disk-group ul li:hover { background: #f5f7fa; color:#1e9fff;}
.disk-group ul li .dropdown:hover dl { display: block; }
.disk-group ul li .dropdown dl { position: absolute; top: 36px; right: -15px; z-index: 10000; display: none; padding: 5px 0; width: 88px; border-radius: 2px; text-align: center; background-color: #ffffff; box-shadow: #cccccc 0 0 10px; }
.disk-group ul li .dropdown dl dd { height: 32px; line-height: 32px; }
.disk-group ul li .dropdown dl dd:hover { color: #4a5dff; background-color: #edefff; }
.disk-group ul li .dropdown dl::before { position: absolute; top: -16px; left: 44px; z-index: 12; display: block; padding: 0; width: 0; height: 0; border-top: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 8px solid #ffffff; border-left: 8px solid transparent; content: ""; box-sizing: content-box; }
.group-footer { display: flex; align-items: center; justify-content: center; width: 100%; height: 50px; position:absolute;bottom:0; border-top: 1px solid #f2f2f2; border-right: 1px solid #f2f2f2; }
/** 文件 **/
.file-item .file-subject { flex: 1; overflow: hidden; overflow-y: auto; margin: 10px; box-sizing: border-box; }
.file-item .file-subject:hover::-webkit-scrollbar { display: block; }
.file-item .file-subject ul { display: flex; flex-wrap: wrap; }
.file-item .file-subject ul li {position: relative; height: 144px; margin:20px 10px; padding: 6px; border: 1px solid rgba(0, 0, 0, 0.05); border-radius: 3px; transition: all 0.2s ease-in-out; }
.file-item .file-subject ul li:hover {border: 1px solid #eee; background-color:#f8f8f8;}
.file-item .file-subject ul li.on {border: 1px solid #ff5722; }
.file-item .file-subject ul li img { width: 86px; height: 86px; padding:16px;}
.file-item .file-subject ul li img.file-image { width: 118px; height: 118px; padding:0; border-radius: 2px; }
.file-item .file-subject ul li video { width: 60px; height: 60px; border-radius: 3px; }
.file-item .file-subject ul li p {overflow: hidden; margin: 5px 0 0; width: 118px; font-size: 13px; text-align: center; text-overflow: ellipsis; white-space: nowrap; }
.file-item .file-subject ul li .file-check{position: absolute; width:20px; height:20px; left: 0; top: 0; display: none; font-size: 14px; border-radius:2px 0 4px 0; text-align: center; line-height: 20px; color: #ffffff; background-color:#fff; border-right:1px solid #eee; border-bottom:1px solid #eee; cursor:pointer;}
.file-item .file-subject ul li:hover .file-check{display: block;}
.file-item .file-subject ul li.on .file-check{ display: block; background: #ff5722; border-color:#ff5722}
.file-item .file-subject ul li .layui-btn-ctrl{position:absolute; top:0; right:0; opacity: 0;}
.file-item .file-subject ul li:hover .layui-btn-ctrl{opacity: 1;}
.file-folder,.file-image,.file-pdf,.file-video,.file-audio{cursor:pointer;}
.file-item .file-subject ul li .has-star{position: absolute; width:20px; height:20px; right: 32px; top: 75px; border-radius:50%; text-align: center; line-height: 20px; color: #ffffff; background-color:#ffb800; border:1px solid #fff; padding:2px;}
.file-item .file-subject ul li .file-info{position: absolute; width:100%; height:23px; left: 0; top: 0; text-align:center; font-size: 12px; line-height: 23px; background-color:rgba(0,0,0,.12);border-radius:2px 2px 0 0;}
.file-footer { display: flex; align-items: center; padding: 5px 15px 0; height: 45px; border-top: 1px solid #f2f2f2; text-align: center; background: #ffffff; }
/** 无数据 **/
.file-item .empty { display: flex; flex: 1; align-items: center; flex-direction: column; justify-content: center; overflow: hidden; text-align: center; color: #cccccc; }
.file-item .empty i { font-size: 180px; }
.file-item .empty p { width: 180px; text-align: center; }
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<div class="disk-left">
<h3>共享空间</h3>
<div class="disk-group">
<ul id="group">
<li data-id="1" class="active"><i class="layui-icon layui-icon-component"></i><span>公司共享</span></li>
</ul>
</div>
<div class="group-footer">
<span class="layui-btn layui-btn-primary layui-btn-sm add-new">创建共享空间</span>
</div>
</div>
<div class="disk-table">
<form class="layui-form gg-form-bar border-b" lay-filter="barsearchform">
<div class="layui-input-inline" style="width:312px">
<div class="layui-btn-group">
<span class="layui-btn tool-add" id="uploadBtn"><strong class="iconfont icon-shangchuan"></strong> 上传文件</span>
<span class="layui-btn layui-btn-normal tool-add" id="addArticle"><strong class="iconfont icon-lunwenguanli"></strong> 新建文档</span>
<span class="layui-btn layui-btn-warm tool-add" id="addFolder"><strong class="iconfont icon-xiangmuguanli"></strong> 新建目录</span>
</div>
</div>
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="输入关键字,文件名称/目录名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<input type="hidden" name="pid" value="0" />
<input type="hidden" name="ext" value="" />
<input type="hidden" name="group_id" value="1" />
<input type="hidden" name="group_name" value="公司共享" />
<input type="hidden" name="limit" value="30" />
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset">清空</button>
</div>
</form>
<div class="disk-path layui-form border-b">
<div class="disk-breadcrumb" id="diskPath"><i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="1">公司共享</a></div>
<div class="layui-input-inline" style="width:450px; float:right;">
<div class="layui-tabs layui-tab-brief" id="tab">
<ul class="layui-tabs-header">
<li class="layui-this" lay-id="">全部</li>
<li lay-id="image">图片</li>
<li lay-id="video">视频</li>
<li lay-id="audio">音频</li>
<li lay-id="office">Office文件</li>
<li lay-id="pdf">在线文档</li>
<li lay-id="zip">压缩包</li>
</ul>
</div>
</div>
</div>
<div class="file-item">
<!-- 主体 -->
<div class="file-subject">
<ul id="filesBox"></ul>
</div>
</div>
<!-- 页脚 -->
<div class="file-footer">
<div id="laypage"></div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const typeExt=['','image','video','audio','office','pdf','zip'];
const fileExt={
image:['jpg','jpeg','png','gif'],
office:['doc','docx','xls','xlsx','ppt','pptx'],
pdf:['txt','pdf','article'],
zip:['zip','rar','7z','gz','tar'],
video:['mpg','mp4','mpeg','avi','wmv','mov','flv','m4v'],
audio:['mp3','wav','wma','flac','midi']
};
function isValidFileName(fileName) {
const illegalChars = /[\\\/\*\:"<>|\?]/;
return !illegalChars.test(fileName);
}
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var tool = layui.tool,uploadPlus = layui.uploadPlus,form = layui.form,laypage = layui.laypage,tabs = layui.tabs,dropdown = layui.dropdown;
let fileGroup = [{id:0,title:'公司共享'}];
tabs.on('afterChange(tab)', function(data){
if(data.index==0){
$('[name="ext"]').val('');
}
else{
let ext = typeExt[data.index];
$('[name="ext"]').val(fileExt[ext]);
}
$('[lay-filter="webform"]').click();
return false;
});
//上传文件
var attachment = new uploadPlus({
"title":'上传文件',
"target":'uploadBtn',
"attachment":{
"type":1,//0ajax多文件模式,1ajax单文件单记录模式
"ajaxSave":function(res){
$.ajax({
url: "/disk/index/add_upload",
type:'post',
data:{
'pid':$('[name="pid"]').val(),
'group_id':$('[name="group_id"]').val(),
'action_id':res.data.id,
'name':res.data.name,
'id':0,
'file_size':res.data.filesize,
'file_ext':res.data.fileext
},
success: function (e) {
layer.msg(e.msg);
if (e.code == 0) {
$('[lay-filter="webform"]').click();
}
}
})
}
}
})
let ctrl_callback = function (e) {
if(e.code == 0){
layer.closeAll();
layer.msg(e.msg);
$('[lay-filter="webform"]').click();
}
else{
layer.msg(e.msg);
}
}
//顶部目录操作
$('#diskPath').on('click','a',function(){
let id=$(this).data('id');
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
})
//新增在线文档
$('#addArticle').on('click',function(){
tool.side('/disk/index/add_article?pid='+$('[name="pid"]').val()+'&group_id='+$('[name="group_id"]').val());
})
//新增目录
$('#addFolder').on('click',function(){
layer.prompt({title: '请输入目录名称'}, function(val, index, elem){
if(val==''){
layer.msg('目录名称不能为空');
return false;
}
if(isValidFileName(val)==false){
layer.msg('目录名称不能包含下列任何字符:\/:*?".<>|');
return false;
}
$.ajax({
url: "/disk/index/add_folder",
type:'post',
data:{
'id':0,
'pid':$('[name="pid"]').val(),
'group_id':$('[name="group_id"]').val(),
'name':val
},
success: ctrl_callback
})
});
})
//查看文件
$('#filesBox').on('click','.file-item',function(){
let id = $(this).parent().data('id');
let href = $(this).data('href');
let ext = $(this).data('ext');
if(ext == 'video'){
tool.videoView(href);
}
else if(ext == 'audio'){
tool.audioView(href);
}
else if(ext == 'image'){
tool.photoView(href);
}
else if(ext == 'pdf'){
tool.pdfView(href);
}
else if(ext == 'article'){
tool.articleView(id);
}
else if(ext == 'folder'){
$('[name="pid"]').val(id);
let data = form.val('barsearchform');
get_files(data);
}
else{
return false;
}
})
//重命名文件
$('#filesBox').on('click','.name-edit',function(){
let id = $(this).parent().parent().data('id');
let title = $(this).parent().parent().data('title');
let ext = $(this).parent().parent().data('ext');
let types = $(this).parent().parent().data('types');
title = title.toString().replace(/\.[^.]+$/, "");
layer.prompt({title: '重命名',value:title}, function(val, index, elem){
if(val==''){
layer.msg('文件名不能为空');
return false;
}
if(isValidFileName(val)==false){
layer.msg('文件名不能包含下列任何字符:\/:*?".<>|');
return false;
}
if(types == 0){
val = val+'.'+ext;
}
tool.post("/disk/index/rename", {id:id,name:val,group_id:$('[name="group_id"]').val(),pid:$('[name="pid"]').val()}, ctrl_callback);
});
})
//单文件删除
$('#filesBox').on('click','.file-delete',function(){
let id = $(this).parent().parent().data('id');
layer.confirm('确定要删除该文件吗?请慎重', { icon: 3, title: '提示' }, function (index) {
tool.delete("/disk/index/del", {ids:id}, ctrl_callback);
});
})
//单文件移动
$('#filesBox').on('click','.file-move',function(){
let ids = $(this).parent().parent().data('id');
layer.open({
type: 2,
title: '移动到',
area: ['720px', '480px'],
content: '/disk/index/move?group_id='+$('[name="group_id"]').val(),
maxmin: true,
btn: ['移动到此', '取消'],
btnAlign: 'c',
yes: function(index, layero){
// 获取 iframe 的窗口对象
let iframeWin = window[layero.find('iframe')[0]['name']];
let pid = iframeWin.$('#folder').val();
let group_id = iframeWin.$('#group_id').val();
tool.post("/disk/index/move", {ids:ids,pid:pid,group_id:group_id}, ctrl_callback);
}
});
})
$('body').on('click','.add-new',function(){
add_group(0,'');
});
$('#group').on('click','li span',function(){
let li=$(this).parent();
li.addClass('active').siblings().removeClass('active');
let id=li.data('id');
let name=li.text();
$('[name="pid"]').val(0);
$('[name="group_id"]').val(id);
$('[name="group_name"]').val(name);
$('#tab').find('li').eq(0).click();
//$('[lay-filter="webform"]').click();
});
function add_group(id,val){
var title = '创建共享空间';
if(id>0){
title = '重命名共享空间';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value!='') {
let callback = function (e) {
layer.msg(e.msg);
if(e.code==0){
location.reload();
}
}
tool.post("/disk/index/add_group", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写共享空间名称');
}
}
})
}
function del_group(id) {
layer.confirm('确定要删除该共享空间吗?请慎重', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.closeAll();
layer.msg(e.msg);
if(e.code==0){
location.reload();
}
}
tool.delete("/disk/index/del_group", {id:id}, callback);
});
}
function get_group(){
$.ajax({
url:"/disk/api/get_group",
success:function(res){
if(res.code==0){
var group=res.data,item='';
if(group.length>0){
for(var a=0;a<group.length;a++){
item+='<li data-id="'+group[a].id+'" data-title="'+group[a].title+'"><i class="layui-icon layui-icon-component"></i><span>'+group[a].title+'</span><i class="layui-icon layui-icon-more-vertical dropdown-on"></i></li>';
}
$('#group').append(item);
fileGroup = fileGroup.concat(group);
// 自定义事件
dropdown.render({
elem: '.dropdown-on',
trigger: 'hover',
align: 'right',
data: [{
title: '重命名共享空间',
id: 100
},{
title: '删除该共享空间',
id: 101
},{
title: '设置空间成员',
id: 102
},{
title: '设置空间管理员',
id: 103
}],
click: function(data, othis){
let id = $(this.elem).parent().data('id');
let title = $(this.elem).parent().data('title');
if(data.id==100){
add_group(id,title);
}else if(data.id==101){
del_group(id);
}else if(data.id==102){
tool.side('/disk/api/memberlist?id='+id);
}else if(data.id==103){
tool.side('/disk/api/adminlist?id='+id);
}
}
});
}
}
}
});
}
//加载数据
var data = form.val('barsearchform');
get_files(data);
get_group();
form.on('submit(webform)', function (data) {
get_files(data.field);
return false;
});
$('.layui-btn-reset').click(function(){
setTimeout(function(){
$('[lay-filter="webform"]').click();
},200)
})
function get_files(param){
var loadIndex = layer.load(0);
$.ajax({
url:"/disk/index/sharelist",
data:param,
complete:function(){
layer.close(loadIndex)
},
success:function(res){
$('[name="select_all"]').prop('checked', false);
form.render('checkbox');
if(res.code==0){
laypage.render({
elem: 'laypage',
limit:param['limit'],
curr:param['page'],
count: res.count, // 数据总数
jump: function(obj, first){
//console.log(obj.curr); // 得到当前页,以便向服务端请求对应页的数据。
//console.log(obj.limit); // 得到每页显示的条数
// 首次不执行
if(!first){
var data = form.val('barsearchform');
data['page'] = obj.curr;
get_files(data);
}
}
});
let folder = res.totalRow;
let folderHtml='<i class="layui-icon layui-icon-windows"></i> <a href="javascript:void(0);" data-id="0">'+$('[name="group_name"]').val()+'</a>';
if(folder.length>0){
for(var f=0;f<folder.length;f++){
folderHtml+='<span> 〉</span><a href="javascript:void(0);" data-id="'+folder[f].id+'">'+folder[f].name+'</a>';
}
}
$('#diskPath').html(folderHtml);
var item=res.data,li='';
if(item.length>0){
for(var a=0;a<item.length;a++){
let type = '',ext="zip";
// 判断元素是否在数组中
let path='/static/home/images/icon/file.png';
if (fileExt.image.includes(item[a].file_ext)) {
path=item[a].thumbpath;
type = '0,1,3,4,5';
ext="image";
}
if (fileExt.office.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="office";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (item[a].file_ext == 'pdf' || item[a].file_ext == 'txt') {
type = '0,1,3,4,5';
ext="pdf";
path='/static/home/images/icon/'+item[a].file_ext+'.png';
}
if (fileExt.video.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="video";
path='/static/home/images/icon/video.png';
}
if (fileExt.audio.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="audio";
path='/static/home/images/icon/audio.png';
}
if (fileExt.zip.includes(item[a].file_ext)) {
type = '0,1,3,4,5';
ext="zip";
path='/static/home/images/icon/rar.png';
}
if(item[a].types==1){
type = '1,2,3,4,5';
ext="article";
path='/static/home/images/icon/article.png';
}
if(item[a].types==2){
type = '3,4,5';
ext="folder";
path='/static/home/images/icon/folder.png';
}
ctrl = '<span class="layui-btn layui-btn-xs layui-btn-normal file-ctrl" data-ctrl="disk" data-fileid="'+item[a].id+'" data-actionid="'+item[a].action_id+'" data-href="'+item[a].filepath+'" data-filename="'+item[a].name+'" data-ext="'+ext+'" data-type="'+type+'">操作</span>';
li+='<li data-id="'+item[a].id+'" data-title="'+item[a].name+'" data-ext="'+item[a].file_ext+'" data-types="'+item[a].types+'"><img src="'+path+'" alt="'+item[a].name+'" style="object-fit: contain;" class="file-item file-'+ext+'" data-href="'+item[a].filepath+'" data-ext="'+ext+'"><p title="'+item[a].name+'">'+item[a].name+'</p>\
<div class="layui-btn-ctrl">'+ctrl+'\
<span class="name-edit" style="display:none;" id="fileEdit'+item[a].id+'" title="重命名"></span>\
<span class="file-delete" style="display:none;" id="fileDel'+item[a].id+'" title="删除"></span>\
<span class="file-move" style="display:none;" id="fileMove'+item[a].id+'" title="移动"></span>\
</div></li>';
}
$('#filesBox').html(li);
$('#laypage').show();
}
else{
$('#filesBox').html('<div class="empty"><i class="layui-icon layui-icon-upload"></i><p>无文件文件,赶紧去上传吧!</p></div>');
$('#laypage').hide();
}
}
}
});
}
}
</script>
{/block}
<!-- /脚本 -->
+59
View File
@@ -0,0 +1,59 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<link rel="stylesheet" href="{__GOUGU__}/third_party/prism/prism.css"/>
<style>
.text-detial-ops{line-height: 22px; color:#999; padding: 12px 0;}
.text-detial-ops span{margin-right: 20px;}
.text-detial-ops a{margin-right:10px;}
.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
.text-detial-content p{padding: 8px 0;}
.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
.text-detial-content a{color:#186AF2; font-style:italic;}
.text-detial-content a:hover{text-decoration:underline;}
.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto; word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
.text-detial-content table th {font-weight: 800;}
.text-detial-content li {list-style: initial;margin-left: 20px;}
:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-5">
<h1 style="font-size:20px">{$detail.name}</h1>
<div class="text-detial-ops">
<span>发表于:{$detail.create_time | date='Y-m-d H:i:s'}</span>
<span>发布人:{$detail.admin_name}</span>
</div>
<div class="text-detial-content">
{$detail.content|raw}
</div>
{notempty name="$detail.file_ids"}
<h3 class="py-3">相关附件</h3>
<div class="layui-row">
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4">{:file_card($vo,'view')}</div>
{/volist}
</div>
{/notempty}
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script src="{__GOUGU__}/third_party/prism/prism.js"></script>
<script>
const moduleInit = ['tool'];
function gouguInit() {
var form = layui.form,tool=layui.tool;
}
</script>
{/block}
<!-- /脚本 -->