文件管理器
|
|
@ -14,23 +14,31 @@ body.page-filemanager .filemanager-wrap {
|
||||||
body.page-filemanager .filemanager-wrap .filemanager-navbar {
|
body.page-filemanager .filemanager-wrap .filemanager-navbar {
|
||||||
width: 20%;
|
width: 20%;
|
||||||
}
|
}
|
||||||
body.page-filemanager .filemanager-wrap .filemanager-divider {
|
body.page-filemanager .filemanager-wrap .filemanager-navbar .tree-wrap .el-tree-node__content {
|
||||||
position: absolute;
|
height: 36px;
|
||||||
top: 0;
|
}
|
||||||
height: 100%;
|
body.page-filemanager .filemanager-wrap .filemanager-navbar .tree-wrap .custom-tree-node {
|
||||||
left: 20%;
|
width: 100%;
|
||||||
width: 10px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
cursor: move;
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
body.page-filemanager .filemanager-wrap .filemanager-navbar .tree-wrap .custom-tree-node .right span {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
body.page-filemanager .filemanager-wrap .filemanager-navbar .tree-wrap .custom-tree-node .right span:hover {
|
||||||
|
color: #fd560f;
|
||||||
|
}
|
||||||
|
body.page-filemanager .filemanager-wrap .filemanager-divider {
|
||||||
|
top: 0;
|
||||||
|
width: 3px;
|
||||||
|
cursor: col-resize;
|
||||||
}
|
}
|
||||||
body.page-filemanager .filemanager-wrap .filemanager-divider:hover {
|
body.page-filemanager .filemanager-wrap .filemanager-divider:hover {
|
||||||
background: red;
|
background: #fd560f;
|
||||||
}
|
}
|
||||||
body.page-filemanager .filemanager-wrap .filemanager-content {
|
body.page-filemanager .filemanager-wrap .filemanager-content {
|
||||||
width: 80%;
|
flex: 1;
|
||||||
padding-left: 10px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
@ -39,6 +47,7 @@ body.page-filemanager .filemanager-wrap .filemanager-content .content-head {
|
||||||
height: 56px;
|
height: 56px;
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
background-color: #fff;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
|
|
@ -54,16 +63,16 @@ body.page-filemanager .filemanager-wrap .filemanager-content .content-center {
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
background: #f9fafa;
|
background: #f9fafa;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
margin-right: -10px;
|
margin-right: -20px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
body.page-filemanager .filemanager-wrap .filemanager-content .content-center .image-list {
|
body.page-filemanager .filemanager-wrap .filemanager-content .content-center .image-list {
|
||||||
width: calc(20% - 10px);
|
width: calc(20% - 20px);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
margin-right: 10px;
|
margin-right: 20px;
|
||||||
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
@ -91,8 +100,9 @@ body.page-filemanager .filemanager-wrap .filemanager-content .content-center .im
|
||||||
body.page-filemanager .filemanager-wrap .filemanager-content .content-footer {
|
body.page-filemanager .filemanager-wrap .filemanager-content .content-footer {
|
||||||
height: 56px;
|
height: 56px;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
|
background-color: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 788 KiB |
|
After Width: | Height: | Size: 410 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 357 KiB |
|
After Width: | Height: | Size: 498 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 357 KiB |
|
|
@ -17,28 +17,44 @@ body.page-filemanager {
|
||||||
|
|
||||||
.filemanager-navbar {
|
.filemanager-navbar {
|
||||||
width: 20%;
|
width: 20%;
|
||||||
|
|
||||||
|
.tree-wrap {
|
||||||
|
.el-tree-node__content {
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-tree-node {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center; // flex-start | center
|
||||||
|
justify-content: space-between; // flex-end | center | space-between
|
||||||
|
|
||||||
|
.right {
|
||||||
|
span {
|
||||||
|
margin-right: 8px;
|
||||||
|
&:hover {
|
||||||
|
color: $primary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.filemanager-divider {
|
.filemanager-divider {
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
top: 0;
|
||||||
height: 100%;
|
width: 3px;
|
||||||
left: 20%;
|
cursor: col-resize;
|
||||||
width: 10px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
// cursor: col-resize;
|
|
||||||
cursor: move;
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: red;
|
background: $primary;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.filemanager-content {
|
.filemanager-content {
|
||||||
width: 80%;
|
// width: 80%;
|
||||||
padding-left: 10px;
|
flex: 1;
|
||||||
|
// padding-left: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
@ -47,6 +63,7 @@ body.page-filemanager {
|
||||||
height: 56px;
|
height: 56px;
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
background-color: #fff;
|
||||||
align-items: center; // flex-start | center
|
align-items: center; // flex-start | center
|
||||||
justify-content: space-between; // flex-end | center | space-between
|
justify-content: space-between; // flex-end | center | space-between
|
||||||
// flex-wrap: wrap;
|
// flex-wrap: wrap;
|
||||||
|
|
@ -70,17 +87,17 @@ body.page-filemanager {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
// justify-content: space-between; // flex-end | center | space-between
|
// justify-content: space-between; // flex-end | center | space-between
|
||||||
// flex-wrap: wrap;
|
// flex-wrap: wrap;
|
||||||
margin-right: -10px;
|
margin-right: -20px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|
||||||
.image-list {
|
.image-list {
|
||||||
width: calc(20% - 10px);
|
width: calc(20% - 20px);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
// align-items: center;
|
// align-items: center;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
margin-right: 10px;
|
margin-right: 20px;
|
||||||
box-shadow: 0 0 2px 1px rgba(0, 0, 0, .1);
|
box-shadow: 0 0 2px 1px rgba(0, 0, 0, .1);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
// border: 1px solid transparent;
|
// border: 1px solid transparent;
|
||||||
|
|
@ -114,10 +131,11 @@ body.page-filemanager {
|
||||||
.content-footer {
|
.content-footer {
|
||||||
height: 56px;
|
height: 56px;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
|
background-color: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
box-shadow: 0 -2px 4px rgba(0, 0, 0, .1);
|
box-shadow: 0 -2px 4px rgba(0, 0, 0, .1);
|
||||||
align-items: center; // flex-start | center
|
align-items: center; // flex-start | center
|
||||||
justify-content: center; // flex-end | center | space-between
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,19 +15,39 @@
|
||||||
<title>beike filemanager</title>
|
<title>beike filemanager</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="page-filemanager">
|
<body class="page-filemanager">
|
||||||
<div class="filemanager-wrap" id="filemanager-wrap-app" v-cloak>
|
<div class="filemanager-wrap" id="filemanager-wrap-app" v-cloak ref="splitPane">
|
||||||
<div class="filemanager-navbar" ref='letfDom'>
|
<div class="filemanager-navbar" :style="'width:' + paneLengthValue">
|
||||||
<el-tree :data="tree" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
|
<el-tree
|
||||||
|
:data="tree"
|
||||||
|
:props="defaultProps"
|
||||||
|
@node-click="handleNodeClick"
|
||||||
|
class="tree-wrap">
|
||||||
|
<div class="custom-tree-node" slot-scope="{ node, data }">
|
||||||
|
<div>@{{ node.label }}</div>
|
||||||
|
<div class="right">
|
||||||
|
<el-tooltip class="item" effect="dark" content="创建文件夹" placement="top">
|
||||||
|
<span><i class="el-icon-circle-plus-outline"></i></span>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
|
<el-tooltip class="item" effect="dark" content="重命名" placement="top">
|
||||||
|
<span><i class="el-icon-edit"></i></span>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
|
<el-tooltip class="item" effect="dark" content="删除" placement="top">
|
||||||
|
<span><i class="el-icon-delete"></i></span>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-tree>
|
||||||
</div>
|
</div>
|
||||||
<div class="filemanager-divider" draggable="true" @dragstart="myFunction(event)" ref='moveDom'></div>
|
<div class="filemanager-divider" @mousedown="handleMouseDown"></div>
|
||||||
<div class="filemanager-content">
|
<div class="filemanager-content" v-loading="loading" element-loading-background="rgba(255, 255, 255, 0.5)">
|
||||||
<div class="content-head">
|
<div class="content-head">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<el-link :underline="false" icon="el-icon-edit">下载</el-link>
|
<el-link :underline="false" :disabled="editingFileIndex === null" icon="el-icon-edit">下载</el-link>
|
||||||
<el-link :underline="false" icon="el-icon-edit">删除</el-link>
|
<el-link :underline="false" :disabled="editingFileIndex === null" icon="el-icon-edit">删除</el-link>
|
||||||
<el-link :underline="false" icon="el-icon-edit">重命名</el-link>
|
<el-link :underline="false" :disabled="editingFileIndex === null" icon="el-icon-edit">重命名</el-link>
|
||||||
{{-- <el-link :underline="false" icon="el-icon-edit">无下划线</el-link> --}}
|
|
||||||
{{-- <el-link :underline="false" icon="el-icon-edit">无下划线</el-link> --}}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="right"><el-button size="mini" type="primary">上传文件</el-button></div>
|
<div class="right"><el-button size="mini" type="primary">上传文件</el-button></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -41,12 +61,14 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="content-footer">
|
<div class="content-footer">
|
||||||
|
<div class="right"></div>
|
||||||
<div class="pagination-wrap">
|
<div class="pagination-wrap">
|
||||||
<el-pagination
|
<el-pagination
|
||||||
layout="prev, pager, next"
|
layout="prev, pager, next"
|
||||||
:total="50">
|
:total="50">
|
||||||
</el-pagination>
|
</el-pagination>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="right"><el-button size="mini" type="primary" @click="fileChecked" :disabled="editingFileIndex === null">选择</el-button></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -56,8 +78,14 @@
|
||||||
el: '#filemanager-wrap-app',
|
el: '#filemanager-wrap-app',
|
||||||
components: {},
|
components: {},
|
||||||
data: {
|
data: {
|
||||||
letfDom: null,
|
min: 10,
|
||||||
clientStartX: 0,
|
max: 40,
|
||||||
|
paneLengthPercent: 20,
|
||||||
|
triggerLength: 10,
|
||||||
|
|
||||||
|
loading: false,
|
||||||
|
|
||||||
|
editingFileIndex: null,
|
||||||
|
|
||||||
tree: [
|
tree: [
|
||||||
{
|
{
|
||||||
|
|
@ -99,6 +127,8 @@
|
||||||
label: 'label'
|
label: 'label'
|
||||||
},
|
},
|
||||||
|
|
||||||
|
triggerLeftOffset: 0,
|
||||||
|
|
||||||
files: [
|
files: [
|
||||||
{type: 'image', src: 'https://via.placeholder.com/140x140.png/eeeeee', name: '文件名称', selected: false},
|
{type: 'image', src: 'https://via.placeholder.com/140x140.png/eeeeee', name: '文件名称', selected: false},
|
||||||
{type: 'image', src: 'https://via.placeholder.com/140x140.png/eeeeee', name: '文件名称', selected: false},
|
{type: 'image', src: 'https://via.placeholder.com/140x140.png/eeeeee', name: '文件名称', selected: false},
|
||||||
|
|
@ -131,36 +161,71 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
// 计算属性
|
// 计算属性
|
||||||
computed: {},
|
computed: {
|
||||||
|
// isFileSelected() {
|
||||||
|
// return this.files.some(file => file.selected);
|
||||||
|
// },
|
||||||
|
|
||||||
|
paneLengthValue() {
|
||||||
|
return `calc(${this.paneLengthPercent}% - ${this.triggerLength / 2 + 'px'})`
|
||||||
|
},
|
||||||
|
},
|
||||||
// 侦听器
|
// 侦听器
|
||||||
watch: {},
|
watch: {},
|
||||||
// 组件方法
|
// 组件方法
|
||||||
methods: {
|
methods: {
|
||||||
handleNodeClick(e) {
|
handleNodeClick(e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
|
this.loading = true
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
this.loading = false
|
||||||
|
},1000)
|
||||||
},
|
},
|
||||||
|
|
||||||
moveHandle(nowClientX, letfDom) {
|
loadNode(node, resolve) {
|
||||||
let computedX = nowClientX - this.clientStartX;
|
console.log(node, resolve)
|
||||||
let leftBoxWidth = parseInt(letfDom.style.width);
|
resolve(this.tree)
|
||||||
let changeWidth = leftBoxWidth + computedX;
|
},
|
||||||
|
|
||||||
if (changeWidth < 280) {
|
// 按下滑动器
|
||||||
changeWidth = 280;
|
handleMouseDown(e) {
|
||||||
|
document.addEventListener('mousemove', this.handleMouseMove)
|
||||||
|
document.addEventListener('mouseup', this.handleMouseUp)
|
||||||
|
|
||||||
|
this.triggerLeftOffset = e.pageX - e.srcElement.getBoundingClientRect().left
|
||||||
|
},
|
||||||
|
|
||||||
|
// 按下滑动器后移动鼠标
|
||||||
|
handleMouseMove(e) {
|
||||||
|
const clientRect = this.$refs.splitPane.getBoundingClientRect()
|
||||||
|
let paneLengthPercent = 0
|
||||||
|
|
||||||
|
const offset = e.pageX - clientRect.left - this.triggerLeftOffset + this.triggerLength / 2
|
||||||
|
paneLengthPercent = (offset / clientRect.width) * 100
|
||||||
|
|
||||||
|
if (paneLengthPercent < this.min) {
|
||||||
|
paneLengthPercent = this.min
|
||||||
}
|
}
|
||||||
|
if (paneLengthPercent > this.max) {
|
||||||
if (changeWidth > 400) {
|
paneLengthPercent = this.max
|
||||||
changeWidth = 400;
|
|
||||||
}
|
}
|
||||||
|
this.paneLengthPercent = paneLengthPercent;
|
||||||
|
},
|
||||||
|
|
||||||
letfDom.style.width = changeWidth + "px";
|
// 松开滑动器
|
||||||
|
handleMouseUp() {
|
||||||
this.clientStartX = nowClientX;
|
document.removeEventListener('mousemove', this.handleMouseMove)
|
||||||
},
|
},
|
||||||
|
|
||||||
checkedImage(index) {
|
checkedImage(index) {
|
||||||
|
this.editingFileIndex = index;
|
||||||
this.files.map(e => !e.index ? e.selected = false : '')
|
this.files.map(e => !e.index ? e.selected = false : '')
|
||||||
this.files[index].selected = !this.files[index].selected
|
this.files[index].selected = !this.files[index].selected
|
||||||
|
},
|
||||||
|
|
||||||
|
fileChecked() {
|
||||||
|
console.log(this.editingFileIndex)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 在实例初始化之后,组件属性计算之前,如data属性等
|
// 在实例初始化之后,组件属性计算之前,如data属性等
|
||||||
|
|
@ -174,27 +239,17 @@
|
||||||
},
|
},
|
||||||
// 实例被挂载后调用
|
// 实例被挂载后调用
|
||||||
mounted () {
|
mounted () {
|
||||||
this.letfDom = this.$refs.letfDom;
|
|
||||||
let moveDom = this.$refs.moveDom;
|
|
||||||
|
|
||||||
moveDom.onmousedown = e => {
|
|
||||||
this.clientStartX = e.clientX;
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
document.onmousemove = e => {
|
|
||||||
this.moveHandle(e.clientX, this.letfDom);
|
|
||||||
};
|
|
||||||
|
|
||||||
document.onmouseup = e => {
|
|
||||||
document.onmouseup = null;
|
|
||||||
document.onmousemove = null;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
document.ondragover=function(e){
|
|
||||||
e.preventDefault();
|
$(document).ready(function() {
|
||||||
}
|
$(document).on('click', function (e) {
|
||||||
|
if ($(e.target).closest('.content-center .image-list').length === 0) {
|
||||||
|
app.editingFileIndex = null;
|
||||||
|
app.files.map(e => e.selected = false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||