mirror of
https://github.com/getrebuild/rebuild.git
synced 2024-09-21 07:55:56 +08:00
done
This commit is contained in:
parent
6ebd2c3c94
commit
b6b3b77e1a
|
@ -84,7 +84,8 @@
|
|||
"$countdownButton": true,
|
||||
"ChartSelect": true,
|
||||
"Share2": true,
|
||||
"$pgt": true
|
||||
"$pgt": true,
|
||||
"$stopEvent": true
|
||||
},
|
||||
"rules": {
|
||||
"strict": 0,
|
||||
|
|
|
@ -24,6 +24,7 @@ import com.rebuild.server.Application;
|
|||
import com.rebuild.server.metadata.EntityHelper;
|
||||
import com.rebuild.server.service.DataSpecificationException;
|
||||
import com.rebuild.server.service.SystemEntityService;
|
||||
import com.rebuild.server.service.bizz.UserHelper;
|
||||
|
||||
/**
|
||||
* 文件目录
|
||||
|
@ -51,6 +52,7 @@ public class AttachmentFolderService extends SystemEntityService {
|
|||
if (inFolder != null) {
|
||||
throw new DataSpecificationException("目录内有文件不能删除");
|
||||
}
|
||||
|
||||
Object parent = Application.createQueryNoFilter(
|
||||
"select parent from AttachmentFolder where parent = ?")
|
||||
.setParameter(1, recordId)
|
||||
|
@ -59,6 +61,17 @@ public class AttachmentFolderService extends SystemEntityService {
|
|||
throw new DataSpecificationException("目录内有子目录不能删除");
|
||||
}
|
||||
|
||||
ID user = Application.getCurrentUser();
|
||||
if (!UserHelper.isAdmin(user)) {
|
||||
Object[] createdBy = Application.createQueryNoFilter(
|
||||
"select createdBy from AttachmentFolder where folderId = ?")
|
||||
.setParameter(1, recordId)
|
||||
.unique();
|
||||
if (!user.equals(createdBy[0])) {
|
||||
throw new DataSpecificationException("无权删除他人目录");
|
||||
}
|
||||
}
|
||||
|
||||
return super.delete(recordId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -136,7 +136,6 @@ public class FileListControll extends BasePageControll {
|
|||
} else {
|
||||
sql += " order by modifiedOn desc";
|
||||
}
|
||||
System.out.println(sql);
|
||||
Object[][] array = Application.createQueryNoFilter(sql)
|
||||
.setLimit(pageSize, pageNo * pageSize - pageSize)
|
||||
.array();
|
||||
|
|
|
@ -25,6 +25,7 @@ import com.alibaba.fastjson.JSONArray;
|
|||
import com.rebuild.server.Application;
|
||||
import com.rebuild.server.business.files.FilesHelper;
|
||||
import com.rebuild.server.metadata.EntityHelper;
|
||||
import com.rebuild.server.service.bizz.UserHelper;
|
||||
import com.rebuild.web.BaseControll;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
@ -33,7 +34,9 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author devezhao
|
||||
|
@ -63,6 +66,27 @@ public class FileManagerControll extends BaseControll {
|
|||
writeSuccess(response);
|
||||
}
|
||||
|
||||
@RequestMapping("delete-files")
|
||||
public void deleteFiles(HttpServletRequest request, HttpServletResponse response)
|
||||
throws IOException {
|
||||
ID user = getRequestUser(request);
|
||||
String[] files = getParameter(request, "ids", "").split(",");
|
||||
|
||||
Set<ID> willDeletes = new HashSet<>();
|
||||
for (String file : files) {
|
||||
if (!ID.isId(file)) continue;
|
||||
ID fileId = ID.valueOf(file);
|
||||
if (!checkAllow(user, fileId)) {
|
||||
writeFailure(response, "无权删除他人文件");
|
||||
return;
|
||||
}
|
||||
|
||||
willDeletes.add(fileId);
|
||||
}
|
||||
Application.getCommonService().delete(willDeletes.toArray(new ID[0]));
|
||||
writeSuccess(response);
|
||||
}
|
||||
|
||||
@RequestMapping("move-files")
|
||||
public void moveFiles(HttpServletRequest request, HttpServletResponse response)
|
||||
throws IOException {
|
||||
|
@ -73,16 +97,18 @@ public class FileManagerControll extends BaseControll {
|
|||
List<Record> fileRecords = new ArrayList<>();
|
||||
for (String file : files) {
|
||||
if (!ID.isId(file)) continue;
|
||||
Record r = EntityHelper.forUpdate(ID.valueOf(file), user);
|
||||
if (inFolder == null) {
|
||||
r.setNull("inFolder");
|
||||
} else {
|
||||
r.setID("inFolder", inFolder);
|
||||
ID fileId = ID.valueOf(file);
|
||||
if (!checkAllow(user, fileId)) {
|
||||
writeFailure(response, "无权更改他人文件");
|
||||
return;
|
||||
}
|
||||
|
||||
Record r = EntityHelper.forUpdate(fileId, user);
|
||||
if (inFolder == null) r.setNull("inFolder");
|
||||
else r.setID("inFolder", inFolder);
|
||||
fileRecords.add(r);
|
||||
}
|
||||
Application.getCommonService().createOrUpdate(fileRecords.toArray(new Record[0]), false);
|
||||
|
||||
writeSuccess(response);
|
||||
}
|
||||
|
||||
|
@ -94,4 +120,17 @@ public class FileManagerControll extends BaseControll {
|
|||
boolean OK = Application.getSecurityManager().allowedR(user, record);
|
||||
writeSuccess(response, OK);
|
||||
}
|
||||
|
||||
// 是否允许操作指定文件(管理员总是允许)
|
||||
private boolean checkAllow(ID user, ID file) {
|
||||
if (UserHelper.isAdmin(user)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Object[] o = Application.createQueryNoFilter(
|
||||
"select createdBy from Attachment where attachmentId = ?")
|
||||
.setParameter(1, file)
|
||||
.unique();
|
||||
return o != null && o[0].equals(user);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,6 +79,7 @@
|
|||
border-right-color: #fff;
|
||||
}
|
||||
|
||||
.file-list-item.active>div.type .file-icon::before,
|
||||
.file-list-item:hover>div.type .file-icon::before {
|
||||
border-top-color: #f5f5f5;
|
||||
border-right-color: #f5f5f5;
|
||||
|
@ -90,6 +91,7 @@
|
|||
|
||||
.file-list-item>div.detail>.extras {
|
||||
margin-top: 1px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.file-list-item>div.detail>.extras>span {
|
||||
|
@ -98,6 +100,24 @@
|
|||
line-height: 1;
|
||||
}
|
||||
|
||||
.file-list-item>div.detail>.extras>span.op {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.file-list-item:hover>div.detail>.extras>span.op {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.file-list-item>div.detail>.extras>span.op>a {
|
||||
color: #999;
|
||||
display: inline-block;
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.file-list-item>div.detail>.extras>span.op>a:hover {
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.file-list-item>div.detail .extras>span,
|
||||
.file-list-item>div.detail .extras>span>a {
|
||||
color: #777;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* eslint-disable react/jsx-no-target-blank */
|
||||
/* eslint-disable react/prop-types */
|
||||
/* global filesList */
|
||||
// 文档
|
||||
|
@ -258,6 +259,21 @@ class FolderTree extends React.Component {
|
|||
class FilesList2 extends FilesList {
|
||||
state = { ...this.props }
|
||||
__lastEntry = __DEFAULT_ALL
|
||||
|
||||
renderExtras(item) {
|
||||
return <React.Fragment>
|
||||
{super.renderExtras(item)}
|
||||
<span className="op">
|
||||
<a title="下载" onClick={(e) => $stopEvent(e)} href={`${rb.baseUrl}/filex/download/${item.filePath}?attname=${$fileCutName(item.filePath)}`} target="_blank"><i className="icon zmdi zmdi-download fs-15 down-2"></i></a>
|
||||
<a title="分享" onClick={(e) => this._share(item, e)}><span><i className="icon zmdi zmdi-share fs-14 down-1"></i></span></a>
|
||||
</span>
|
||||
</React.Fragment>
|
||||
}
|
||||
_share(item, e) {
|
||||
$stopEvent(e)
|
||||
// eslint-disable-next-line react/jsx-no-undef
|
||||
renderRbcomp(<FileShare file={item.filePath} />)
|
||||
}
|
||||
}
|
||||
|
||||
const __findPaths = function (active, push) {
|
||||
|
@ -300,7 +316,7 @@ $(document).ready(() => {
|
|||
confirmText: '删除',
|
||||
confirm: function () {
|
||||
this.disabled(true)
|
||||
$.post(`${rb.baseUrl}/app/entity/record-delete?id=${s}`, (res) => {
|
||||
$.post(`${rb.baseUrl}/files/delete-files?ids=${s}`, (res) => {
|
||||
if (res.error_code > 0) RbHighbar.error(res.error_msg)
|
||||
this.hide()
|
||||
filesList.loadData()
|
||||
|
|
|
@ -78,6 +78,14 @@ var filesList
|
|||
|
||||
$(document).ready(() => {
|
||||
$('.side-toggle').click(() => $('.rb-aside').toggleClass('rb-aside-collapsed'))
|
||||
let $content = $('.page-aside .tab-content')
|
||||
let hold = window.resize_handler
|
||||
window.resize_handler = function () {
|
||||
typeof hold === 'function' && hold()
|
||||
$content.height($(window).height() - 147)
|
||||
$content.perfectScrollbar('update')
|
||||
}
|
||||
window.resize_handler()
|
||||
|
||||
$('.J_sort .dropdown-item').click(function () {
|
||||
let $this = $(this)
|
||||
|
|
|
@ -304,3 +304,13 @@ var $same = function (a, b) {
|
|||
// eslint-disable-next-line eqeqeq
|
||||
return a == b
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止事件传播
|
||||
* @param {Event} e
|
||||
*/
|
||||
var $stopEvent = function (e) {
|
||||
if (e && e.stopPropagation) e.stopPropagation()
|
||||
if (e && e.nativeEvent) e.nativeEvent.stopImmediatePropagation()
|
||||
return false
|
||||
}
|
|
@ -43,14 +43,14 @@
|
|||
<li class="breadcrumb-item active">全部附件</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="file-operator">
|
||||
<div class="float-left">
|
||||
<div class="file-operator row">
|
||||
<div class="col-lg-6 col-12">
|
||||
<div class="input-group input-search">
|
||||
<input class="form-control" type="text" placeholder="搜索 ..." maxlength="40">
|
||||
<span class="input-group-btn"><button class="btn btn-secondary" type="button"><i class="icon zmdi zmdi-search"></i></button></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="float-right">
|
||||
<div class="col-lg-6 col-12 text-lg-right mt-lg-0 mt-md-2 mt-sm-2">
|
||||
<div class="btn-group btn-space mb-0 mr-0 J_sort">
|
||||
<button class="btn btn-secondary dropdown-toggle" type="button" data-toggle="dropdown"><span>默认排序</span> <i class="icon zmdi zmdi-chevron-down"></i></button>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
|
@ -59,7 +59,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-viewport">
|
||||
|
|
|
@ -43,14 +43,14 @@
|
|||
<li class="breadcrumb-item active">全部文档</li>
|
||||
</ol>
|
||||
</div>
|
||||
<div class="file-operator">
|
||||
<div class="float-left">
|
||||
<div class="file-operator row">
|
||||
<div class="col-lg-6 col-12">
|
||||
<div class="input-group input-search">
|
||||
<input class="form-control" type="text" placeholder="搜索 ..." maxlength="40">
|
||||
<span class="input-group-btn"><button class="btn btn-secondary" type="button"><i class="icon zmdi zmdi-search"></i></button></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="float-right">
|
||||
<div class="col-lg-6 col-12 text-lg-right mt-lg-0 mt-md-2 mt-sm-2">
|
||||
<div class="btn-group btn-space mb-0">
|
||||
<button class="btn btn-primary J_upload-file" type="button"><i class="icon zmdi zmdi-upload"></i> 上传文件${entityLabel}</button>
|
||||
<button class="btn btn-primary dropdown-toggle auto" type="button" data-toggle="dropdown"><span class="icon zmdi zmdi-chevron-down"></span></button>
|
||||
|
@ -69,7 +69,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-viewport">
|
||||
|
|
Loading…
Reference in a new issue