tianyi 3 weeks ago
parent
commit
320075660a
  1. 375
      src/views/sys/file/file.vue
  2. 132
      src/views/sys/file/fileCategory.vue
  3. 102
      src/views/sys/file/trash.vue
  4. 102
      src/views/sys/upApp/upApp.vue

375
src/views/sys/file/file.vue

@ -1,7 +1,7 @@
<style lang="less"> <style lang="less">
@import "@/styles/tree&table-common.less"; @import "@/styles/tree&table-common.less";
@import "@/styles/table-common.less"; @import "@/styles/table-common.less";
@import "./file.less"; @import "./file.less";
</style> </style>
<template> <template>
<div class="search"> <div class="search">
@ -12,123 +12,59 @@
<fileCategory @on-select="selectCategory" /> <fileCategory @on-select="selectCategory" />
</Col> </Col>
<div class="expand"> <div class="expand">
<Icon <Icon :type="expandIcon" size="16" class="icon" @click="changeExpand" />
:type="expandIcon"
size="16"
class="icon"
@click="changeExpand"
/>
</div> </div>
<Col :span="span"> <Col :span="span">
<Row v-show="openSearch" @keydown.enter.native="handleSearch"> <Row v-show="openSearch" @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70"> <Form ref="searchForm" :model="searchForm" inline :label-width="70">
<FormItem label="文件名" prop="title"> <FormItem label="文件名" prop="title">
<Input <Input type="text" v-model="searchForm.title" placeholder="请输入文件名" clearable
type="text" style="width: 200px" />
v-model="searchForm.title"
placeholder="请输入文件名"
clearable
style="width: 200px"
/>
</FormItem> </FormItem>
<FormItem label="创建时间"> <FormItem label="创建时间">
<DatePicker <DatePicker :options="options" v-model="selectDate" type="daterange" format="yyyy-MM-dd"
:options="options" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 200px">
v-model="selectDate" </DatePicker>
type="daterange"
format="yyyy-MM-dd"
clearable
@on-change="selectDateRange"
placeholder="选择起始时间"
style="width: 200px"
></DatePicker>
</FormItem> </FormItem>
<FormItem style="margin-left: -35px" class="br"> <FormItem style="margin-left: -35px" class="br">
<Button @click="handleSearch" type="primary" icon="ios-search" <Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
>搜索</Button
>
<Button @click="handleReset">重置</Button> <Button @click="handleReset">重置</Button>
</FormItem> </FormItem>
</Form> </Form>
</Row> </Row>
<Row class="operation" align="middle" justify="space-between"> <Row class="operation" align="middle" justify="space-between">
<div class="br"> <div class="br">
<Button <Button :disabled="!searchForm.categoryId" @click="uploadVisible = true" type="primary"
:disabled="!searchForm.categoryId" icon="md-cloud-upload">上传文件</Button>
@click="uploadVisible = true"
type="primary"
icon="md-cloud-upload"
>上传文件</Button
>
<Dropdown @on-click="handleDropdown"> <Dropdown @on-click="handleDropdown">
<Button> <Button>
更多操作 更多操作
<Icon type="md-arrow-dropdown" /> <Icon type="md-arrow-dropdown" />
</Button> </Button>
<DropdownMenu slot="list"> <DropdownMenu slot="list">
<DropdownItem v-show="showType == 'list'" name="moveAll" <DropdownItem v-show="showType == 'list'" name="moveAll">移动</DropdownItem>
>移动</DropdownItem <DropdownItem v-show="showType == 'list'" name="removeAll">批量删除</DropdownItem>
> <DropdownItem v-show="showType == 'thumb'" name="title">原名称排序</DropdownItem>
<DropdownItem v-show="showType == 'list'" name="removeAll" <DropdownItem v-show="showType == 'thumb'" name="size">文件大小排序</DropdownItem>
>批量删除</DropdownItem <DropdownItem v-show="showType == 'thumb'" name="type">文件类型排序</DropdownItem>
> <DropdownItem v-show="showType == 'thumb'" name="time">创建时间排序</DropdownItem>
<DropdownItem v-show="showType == 'thumb'" name="title"
>原名称排序</DropdownItem
>
<DropdownItem v-show="showType == 'thumb'" name="size"
>文件大小排序</DropdownItem
>
<DropdownItem v-show="showType == 'thumb'" name="type"
>文件类型排序</DropdownItem
>
<DropdownItem v-show="showType == 'thumb'" name="time"
>创建时间排序</DropdownItem
>
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
<Button @click="showTrash = true" type="dashed" icon="md-trash" <Button @click="showTrash = true" type="dashed" icon="md-trash">回收站</Button>
>回收站</Button
>
</div> </div>
<div class="icons"> <div class="icons">
<Tooltip content="刷新" placement="top" transfer> <Tooltip content="刷新" placement="top" transfer>
<Icon <Icon type="md-refresh" size="18" class="item" @click="getDataList" />
type="md-refresh"
size="18"
class="item"
@click="getDataList"
/>
</Tooltip> </Tooltip>
<Tooltip <Tooltip :content="openSearch ? '关闭搜索' : '开启搜索'" placement="top" transfer>
:content="openSearch ? '关闭搜索' : '开启搜索'" <Icon type="ios-search" size="18" class="item tip" @click="openSearch = !openSearch" />
placement="top"
transfer
>
<Icon
type="ios-search"
size="18"
class="item tip"
@click="openSearch = !openSearch"
/>
</Tooltip> </Tooltip>
<Tooltip <Tooltip :content="openTip ? '关闭提示' : '开启提示'" placement="top" transfer>
:content="openTip ? '关闭提示' : '开启提示'" <Icon type="md-bulb" size="18" class="item tip" @click="openTip = !openTip" />
placement="top"
transfer
>
<Icon
type="md-bulb"
size="18"
class="item tip"
@click="openTip = !openTip"
/>
</Tooltip> </Tooltip>
<Select <Select v-model="fileType" style="width: 150px; margin: 0 25px 0 15px"
v-model="fileType" @on-change="changeFileType">
style="width: 150px; margin: 0 25px 0 15px"
@on-change="changeFileType"
>
<Option value="all">所有文件</Option> <Option value="all">所有文件</Option>
<Option value="word">Word</Option> <Option value="word">Word</Option>
<Option value="excel">Excel</Option> <Option value="excel">Excel</Option>
@ -141,11 +77,7 @@
<Option value="zip">ZIP</Option> <Option value="zip">ZIP</Option>
<Option value="rar">RAR</Option> <Option value="rar">RAR</Option>
</Select> </Select>
<RadioGroup <RadioGroup v-model="showType" type="button" @on-change="changeShowType">
v-model="showType"
type="button"
@on-change="changeShowType"
>
<Radio title="列表" label="list"> <Radio title="列表" label="list">
<Icon type="md-list"></Icon> <Icon type="md-list"></Icon>
</Radio> </Radio>
@ -161,39 +93,21 @@
已选择 已选择
<span class="select-count">{{ selectList.length }}</span> <span class="select-count">{{ selectList.length }}</span>
<a class="select-clear" @click="clearSelectAll">清空</a> <a class="select-clear" @click="clearSelectAll">清空</a>
<span v-if="selectList.length > 0" style="margin-left: 15px" <span v-if="selectList.length > 0" style="margin-left: 15px">共计 {{ totalSize }} 存储量</span>
>共计 {{ totalSize }} 存储量</span
>
</Alert> </Alert>
<Table <Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom"
:loading="loading" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
></Table>
</div> </div>
<Row type="flex" :gutter="30" v-show="showType == 'thumb'"> <Row type="flex" :gutter="30" v-show="showType == 'thumb'">
<Col :lg="6" :md="12" :xs="12" v-for="(item, i) in data" :key="i"> <Col :lg="6" :md="12" :xs="12" v-for="(item, i) in data" :key="i">
<Card class="oss-card"> <Card class="oss-card">
<div class="content"> <div class="content">
<div class="collect-icon" v-if="item.isCollect"> <div class="collect-icon" v-if="item.isCollect">
<Icon type="md-star" color="#ffc60a" size="18"/> <Icon type="md-star" color="#ffc60a" size="18" />
</div> </div>
<img <img @click="showPic(item)" v-if="item.type.indexOf('image') >= 0" class="img"
@click="showPic(item)" :src="item.url" />
v-if="item.type.indexOf('image') >= 0" <div v-else-if="item.type.indexOf('video') >= 0" class="video" @click="showVideo(item)">
class="img"
:src="item.url"
/>
<div
v-else-if="item.type.indexOf('video') >= 0"
class="video"
@click="showVideo(item)"
>
<video class="cover"> <video class="cover">
<source :src="item.url + '#t=1'" preload="metadata" /> <source :src="item.url + '#t=1'" preload="metadata" />
</video> </video>
@ -212,11 +126,7 @@
<div class="actions"> <div class="actions">
<div class="btn"> <div class="btn">
<Tooltip content="下载" placement="top"> <Tooltip content="下载" placement="top">
<Icon <Icon @click="download(item)" type="md-download" size="16" />
@click="download(item)"
type="md-download"
size="16"
/>
</Tooltip> </Tooltip>
</div> </div>
<div class="btn"> <div class="btn">
@ -226,11 +136,7 @@
</div> </div>
<div class="btn"> <div class="btn">
<Tooltip content="重命名" placement="top"> <Tooltip content="重命名" placement="top">
<Icon <Icon @click="rename(item)" type="md-create" size="16" />
@click="rename(item)"
type="md-create"
size="16"
/>
</Tooltip> </Tooltip>
</div> </div>
<div class="btn-no"> <div class="btn-no">
@ -251,42 +157,18 @@
</Col> </Col>
</Row> </Row>
<Row type="flex" justify="end" class="page"> <Row type="flex" justify="end" class="page">
<Page <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize"
:current="searchForm.pageNumber" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="pageSizeOpts"
:total="total" size="small" show-total show-elevator show-sizer></Page>
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="pageSizeOpts"
size="small"
show-total
show-elevator
show-sizer
></Page>
</Row> </Row>
</Col> </Col>
</Row> </Row>
</Card> </Card>
<Drawer <Drawer :title="`上传文件至:${currCate}`" closable v-model="uploadVisible" width="500">
:title="`上传文件至:${currCate}`" <Upload :action="uploadFileUrl" :headers="accessToken" :data="uploadData" :on-success="handleSuccess"
closable :on-error="handleError" :max-size="5120" :on-exceeded-size="handleMaxSize" :before-upload="beforeUpload"
v-model="uploadVisible" multiple type="drag" ref="up">
width="500"
>
<Upload
:action="uploadFileUrl"
:headers="accessToken"
:data="uploadData"
:on-success="handleSuccess"
:on-error="handleError"
:max-size="5120"
:on-exceeded-size="handleMaxSize"
:before-upload="beforeUpload"
multiple
type="drag"
ref="up"
>
<div style="padding: 20px 0"> <div style="padding: 20px 0">
<Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon> <Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
<p>点击这里或将文件拖拽到这里上传</p> <p>点击这里或将文件拖拽到这里上传</p>
@ -297,12 +179,7 @@
</div> </div>
</Drawer> </Drawer>
<Modal <Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500">
:title="modalTitle"
v-model="modalVisible"
:mask-closable="false"
:width="500"
>
<Form ref="form" :model="form" inline :rules="formValidate"> <Form ref="form" :model="form" inline :rules="formValidate">
<FormItem label="文件名" prop="title" style="width: 100%"> <FormItem label="文件名" prop="title" style="width: 100%">
<Input v-model="form.title" /> <Input v-model="form.title" />
@ -310,56 +187,32 @@
</Form> </Form>
<div slot="footer"> <div slot="footer">
<Button type="text" @click="handleCancel">取消</Button> <Button type="text" @click="handleCancel">取消</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit" <Button type="primary" :loading="submitLoading" @click="handleSubmit">提交</Button>
>提交</Button
>
</div> </div>
</Modal> </Modal>
<Modal <Modal title="移动至" v-model="moveVisible" :mask-closable="false" :width="500">
title="移动至" <fileCategory showOnly @on-select="selectMoveCategory" class="fileMoveModal" />
v-model="moveVisible"
:mask-closable="false"
:width="500"
>
<fileCategory
showOnly
@on-select="selectMoveCategory"
class="fileMoveModal"
/>
<div slot="footer"> <div slot="footer">
<Button type="text" @click="moveVisible = false">取消</Button> <Button type="text" @click="moveVisible = false">取消</Button>
<Button <Button type="primary" :loading="submitLoading" @click="handleSubmitMove">移动至此</Button>
type="primary"
:loading="submitLoading"
@click="handleSubmitMove"
>移动至此</Button
>
</div> </div>
</Modal> </Modal>
<Modal <Modal v-model="videoVisible" :title="videoTitle" :width="800" @on-cancel="closeVideo" draggable>
v-model="videoVisible"
:title="videoTitle"
:width="800"
@on-cancel="closeVideo"
draggable
>
<div id="dplayer" style="height: 500px"></div> <div id="dplayer" style="height: 500px"></div>
<div slot="footer"> <div slot="footer">
<span <span>文件类型{{ util.ellipsis(file.type, 30) }} 文件大小{{
>文件类型{{ util.ellipsis(file.type, 30) }} 文件大小{{
file.msize file.msize
}} }}
创建时间{{ file.createTime }}</span 创建时间{{ file.createTime }}</span>
>
</div> </div>
</Modal> </Modal>
</div> </div>
</template> </template>
<script> <script>
import { import {
uploadFile, uploadFile,
checkOssSet, checkOssSet,
getUserFileListData, getUserFileListData,
@ -368,14 +221,16 @@ import {
renameUserFile, renameUserFile,
trashFile, trashFile,
collectFile, collectFile,
} from "@/api/index"; } from "@/api/index";
import fileCategory from "@/views/sys/file/fileCategory"; import fileCategory from "@/views/sys/file/fileCategory";
import trash from "./trash.vue"; import trash from "./trash.vue";
import DPlayer from "dplayer"; import DPlayer from "dplayer";
import "viewerjs/dist/viewer.css"; import "viewerjs/dist/viewer.css";
import Viewer from "viewerjs"; import Viewer from "viewerjs";
import { shortcuts } from "@/libs/shortcuts"; import {
export default { shortcuts
} from "@/libs/shortcuts";
export default {
name: "file", name: "file",
components: { components: {
fileCategory, fileCategory,
@ -431,8 +286,16 @@ export default {
file: {}, file: {},
// //
formValidate: { formValidate: {
title: [{ required: true, message: "请输入", trigger: "blur" }], title: [{
fkey: [{ required: true, message: "请输入", trigger: "blur" }], required: true,
message: "请输入",
trigger: "blur"
}],
fkey: [{
required: true,
message: "请输入",
trigger: "blur"
}],
}, },
submitLoading: false, // submitLoading: false, //
selectList: [], // selectList: [], //
@ -499,8 +362,7 @@ export default {
}); });
} else if (params.row.type.includes("video") > 0) { } else if (params.row.type.includes("video") > 0) {
return h( return h(
"video", "video", {
{
style: { style: {
cursor: "pointer", cursor: "pointer",
width: "80px", width: "80px",
@ -710,8 +572,7 @@ export default {
render: (h, params) => { render: (h, params) => {
return h("div", [ return h("div", [
h( h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.download(params.row); this.download(params.row);
@ -726,9 +587,10 @@ export default {
}, },
}), }),
h( h(
"Dropdown", "Dropdown", {
{ props: {
props: { transfer: true }, transfer: true
},
on: { on: {
"on-click": (v) => { "on-click": (v) => {
this.changeDropDown(params.row, v); this.changeDropDown(params.row, v);
@ -744,17 +606,42 @@ export default {
}, },
}), }),
]), ]),
h("DropdownMenu", { slot: "list" }, [ h("DropdownMenu", {
h("DropdownItem", { props: { name: "share" } }, "分享"), slot: "list"
}, [
h("DropdownItem", {
props: {
name: "share"
}
}, "分享"),
h( h(
"DropdownItem", "DropdownItem", {
{ props: { name: "collect" } }, props: {
name: "collect"
}
},
params.row.isCollect ? "取消收藏" : "收藏" params.row.isCollect ? "取消收藏" : "收藏"
), ),
h("DropdownItem", { props: { name: "rename" } }, "重命名"), h("DropdownItem", {
h("DropdownItem", { props: { name: "move" } }, "移动"), props: {
h("DropdownItem", { props: { name: "copy" } }, "复制"), name: "rename"
h("DropdownItem", { props: { name: "remove" } }, "删除"), }
}, "重命名"),
h("DropdownItem", {
props: {
name: "move"
}
}, "移动"),
h("DropdownItem", {
props: {
name: "copy"
}
}, "复制"),
h("DropdownItem", {
props: {
name: "remove"
}
}, "删除"),
]), ]),
] ]
), ),
@ -799,7 +686,9 @@ export default {
onOk: () => { onOk: () => {
this.$router.push({ this.$router.push({
name: "setting", name: "setting",
query: { name: "oss" }, query: {
name: "oss"
},
}); });
}, },
}); });
@ -836,7 +725,7 @@ export default {
let image = new Image(); let image = new Image();
image.src = v.url; image.src = v.url;
let viewer = new Viewer(image, { let viewer = new Viewer(image, {
hidden: function () { hidden: function() {
viewer.destroy(); viewer.destroy();
}, },
}); });
@ -1045,7 +934,7 @@ export default {
return; return;
} }
let ids = ""; let ids = "";
this.selectList.forEach(function (e) { this.selectList.forEach(function(e) {
ids += e.id + ","; ids += e.id + ",";
}); });
ids = ids.substring(0, ids.length - 1); ids = ids.substring(0, ids.length - 1);
@ -1058,7 +947,10 @@ export default {
}, },
handleSubmitMove() { handleSubmitMove() {
this.submitLoading = true; this.submitLoading = true;
moveFile({ ids: this.moveFileIds, categoryId: this.moveCategoryId }).then( moveFile({
ids: this.moveFileIds,
categoryId: this.moveCategoryId
}).then(
(res) => { (res) => {
this.submitLoading = false; this.submitLoading = false;
if (res.success) { if (res.success) {
@ -1076,7 +968,10 @@ export default {
content: "您确认要复制文件 " + v.title + " ?", content: "您确认要复制文件 " + v.title + " ?",
loading: true, loading: true,
onOk: () => { onOk: () => {
copyUserFile({ id: v.id, key: v.fkey }).then((res) => { copyUserFile({
id: v.id,
key: v.fkey
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("复制文件成功,新文件名为 副本_" + v.title); this.$Message.success("复制文件成功,新文件名为 副本_" + v.title);
@ -1087,7 +982,9 @@ export default {
}); });
}, },
collect(v) { collect(v) {
collectFile({ id: v.id }).then((res) => { collectFile({
id: v.id
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success(v.isCollect ? "取消收藏成功" : "收藏成功"); this.$Message.success(v.isCollect ? "取消收藏成功" : "收藏成功");
@ -1102,18 +999,19 @@ export default {
} }
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认删除", title: "确认删除",
content: content: "您确认要将所选的 " +
"您确认要将所选的 " +
this.selectList.length + this.selectList.length +
" 个文件移入回收站, 7天内后自动彻底删除", " 个文件移入回收站, 7天内后自动彻底删除",
loading: true, loading: true,
onOk: () => { onOk: () => {
let ids = ""; let ids = "";
this.selectList.forEach(function (e) { this.selectList.forEach(function(e) {
ids += e.id + ","; ids += e.id + ",";
}); });
ids = ids.substring(0, ids.length - 1); ids = ids.substring(0, ids.length - 1);
trashFile({ ids: ids }).then((res) => { trashFile({
ids: ids
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("批量删除文件成功"); this.$Message.success("批量删除文件成功");
@ -1127,11 +1025,12 @@ export default {
remove(v) { remove(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认删除", title: "确认删除",
content: content: "您确认要将文件 " + v.title + " 移入回收站, 7天内后自动彻底删除",
"您确认要将文件 " + v.title + " 移入回收站, 7天内后自动彻底删除",
loading: true, loading: true,
onOk: () => { onOk: () => {
trashFile({ ids: v.id }).then((res) => { trashFile({
ids: v.id
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.clearSelectAll(); this.clearSelectAll();
@ -1191,5 +1090,5 @@ export default {
mounted() { mounted() {
this.init(); this.init();
}, },
}; };
</script> </script>

132
src/views/sys/file/fileCategory.vue

@ -8,16 +8,8 @@
<Icon type="md-arrow-dropdown" /> <Icon type="md-arrow-dropdown" />
</Button> </Button>
<DropdownMenu slot="list"> <DropdownMenu slot="list">
<DropdownItem <DropdownItem name="edit" :disabled="selectNode.id == 0 || selectNode.id == -1">编辑文件夹</DropdownItem>
name="edit" <DropdownItem name="del" :disabled="selectNode.id == 0 || selectNode.id == -1">删除文件夹</DropdownItem>
:disabled="selectNode.id == 0 || selectNode.id == -1"
>编辑文件夹</DropdownItem
>
<DropdownItem
name="del"
:disabled="selectNode.id == 0 || selectNode.id == -1"
>删除文件夹</DropdownItem
>
<DropdownItem name="refresh">刷新</DropdownItem> <DropdownItem name="refresh">刷新</DropdownItem>
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
@ -25,98 +17,55 @@
<Alert show-icon v-if="!showOnly"> <Alert show-icon v-if="!showOnly">
当前选择 当前选择
<span class="select-title">{{ editTitle }}</span> <span class="select-title">{{ editTitle }}</span>
<a <a class="select-clear" v-if="editTitle && selectNode.id != '0'" @click="cancelEdit">取消选择</a>
class="select-clear"
v-if="editTitle && selectNode.id != '0'"
@click="cancelEdit"
>取消选择</a
>
</Alert> </Alert>
<Input <Input v-model="searchKey" suffix="ios-search" @on-change="search" placeholder="输入搜索文件夹名称" clearable />
v-model="searchKey"
suffix="ios-search"
@on-change="search"
placeholder="输入搜索文件夹名称"
clearable
/>
<div style="position: relative"> <div style="position: relative">
<div class="tree-bar" :style="{ maxHeight: maxHeight }"> <div class="tree-bar" :style="{ maxHeight: maxHeight }">
<Tree <Tree ref="tree" :data="data" :load-data="loadData" :render="renderContent"
ref="tree" @on-check-change="changeSelect" @on-select-change="selectTree"></Tree>
:data="data"
:load-data="loadData"
:render="renderContent"
@on-check-change="changeSelect"
@on-select-change="selectTree"
></Tree>
</div> </div>
<Spin size="large" fix v-if="loading"></Spin> <Spin size="large" fix v-if="loading"></Spin>
</div> </div>
<Modal <Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500">
:title="modalTitle"
v-model="modalVisible"
:mask-closable="false"
:width="500"
>
<Form ref="form" :model="form" :label-width="85" :rules="formValidate"> <Form ref="form" :model="form" :label-width="85" :rules="formValidate">
<FormItem label="上级节点:" <FormItem label="上级节点:">{{ form.parentTitle }}
>{{ form.parentTitle }} <Tooltip :content="
<Tooltip
:content="
selectNode.id == '0' selectNode.id == '0'
? '若需添加子目录,请先点击选择一个文件夹' ? '若需添加子目录,请先点击选择一个文件夹'
: '若需添加一级目录,请先取消选择当前文目录' : '若需添加一级目录,请先取消选择当前文目录'
" " placement="right" transfer max-width="290" style="display: inline-block !important">
placement="right" <Icon type="md-help-circle" size="20" color="#c5c5c5"
transfer style="margin-left: 10px; cursor: pointer" />
max-width="290"
style="display: inline-block !important"
>
<Icon
type="md-help-circle"
size="20"
color="#c5c5c5"
style="margin-left: 10px; cursor: pointer"
/>
</Tooltip> </Tooltip>
</FormItem> </FormItem>
<FormItem label="文件夹名" prop="title"> <FormItem label="文件夹名" prop="title">
<Input v-model="form.title" /> <Input v-model="form.title" />
</FormItem> </FormItem>
<FormItem label="排序值" prop="sortOrder"> <FormItem label="排序值" prop="sortOrder">
<Tooltip <Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
trigger="hover" <InputNumber :max="1000" :min="0" v-model="form.sortOrder"></InputNumber>
placement="right"
content="值越小越靠前,支持小数"
>
<InputNumber
:max="1000"
:min="0"
v-model="form.sortOrder"
></InputNumber>
</Tooltip> </Tooltip>
</FormItem> </FormItem>
</Form> </Form>
<div slot="footer"> <div slot="footer">
<Button type="text" @click="modalVisible = false">取消</Button> <Button type="text" @click="modalVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="handelSubmit" <Button type="primary" :loading="submitLoading" @click="handelSubmit">提交</Button>
>提交</Button
>
</div> </div>
</Modal> </Modal>
</div> </div>
</template> </template>
<script> <script>
import { import {
getFileCate, getFileCate,
addFileCate, addFileCate,
editFileCate, editFileCate,
trashFileCate, trashFileCate,
searchFileCate, searchFileCate,
} from "@/api/index"; } from "@/api/index";
export default { export default {
name: "fileCategory", name: "fileCategory",
props: { props: {
showOnly: { showOnly: {
@ -142,15 +91,17 @@ export default {
}, },
formValidate: { formValidate: {
// //
title: [{ required: true, message: "请输入", trigger: "blur" }], title: [{
sortOrder: [ required: true,
{ message: "请输入",
trigger: "blur"
}],
sortOrder: [{
required: true, required: true,
type: "number", type: "number",
message: "请输入排序值", message: "请输入排序值",
trigger: "change", trigger: "change",
}, }, ],
],
}, },
data: [], data: [],
editData: {}, editData: {},
@ -166,7 +117,11 @@ export default {
}; };
this.$emit("on-select", this.selectNode); this.$emit("on-select", this.selectNode);
}, },
renderContent(h, { root, node, data }) { renderContent(h, {
root,
node,
data
}) {
let icon = "md-folder-open"; let icon = "md-folder-open";
if (data.id == "0") { if (data.id == "0") {
icon = "md-pricetags"; icon = "md-pricetags";
@ -201,7 +156,7 @@ export default {
getFileCate(param).then((res) => { getFileCate(param).then((res) => {
this.loading = false; this.loading = false;
if (res.success) { if (res.success) {
res.result.forEach(function (e) { res.result.forEach(function(e) {
if (e.isParent) { if (e.isParent) {
e.loading = false; e.loading = false;
e.children = []; e.children = [];
@ -209,18 +164,15 @@ export default {
} }
}); });
this.data = res.result; this.data = res.result;
this.data.unshift( this.data.unshift({
{
id: "0", id: "0",
title: "未归档", title: "未归档",
selected: true, selected: true,
}, }, {
{
id: "-1", id: "-1",
title: "收藏夹", title: "收藏夹",
selected: false, selected: false,
} });
);
} }
}); });
}, },
@ -231,7 +183,7 @@ export default {
}; };
getFileCate(param).then((res) => { getFileCate(param).then((res) => {
if (res.success) { if (res.success) {
res.result.forEach(function (e) { res.result.forEach(function(e) {
if (e.isParent) { if (e.isParent) {
e.loading = false; e.loading = false;
e.children = []; e.children = [];
@ -246,7 +198,9 @@ export default {
// //
if (this.searchKey) { if (this.searchKey) {
this.loading = true; this.loading = true;
searchFileCate({ title: this.searchKey }).then((res) => { searchFileCate({
title: this.searchKey
}).then((res) => {
this.loading = false; this.loading = false;
if (res.success) { if (res.success) {
this.data = res.result; this.data = res.result;
@ -383,13 +337,14 @@ export default {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认删除", title: "确认删除",
loading: true, loading: true,
content: content: "您确认要将文件夹 " +
"您确认要将文件夹 " +
this.selectNode.title + this.selectNode.title +
" 及其所有文件移入回收站, 7天内后自动彻底删除", " 及其所有文件移入回收站, 7天内后自动彻底删除",
onOk: () => { onOk: () => {
// //
trashFileCate({ id: this.selectNode.id }).then((res) => { trashFileCate({
id: this.selectNode.id
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("操作成功"); this.$Message.success("操作成功");
@ -406,9 +361,8 @@ export default {
this.maxHeight = Number(height - 287) + "px"; this.maxHeight = Number(height - 287) + "px";
this.init(); this.init();
}, },
}; };
</script> </script>
<style lang="less"> <style lang="less">
</style> </style>

102
src/views/sys/file/trash.vue

@ -1,5 +1,5 @@
<style lang="less"> <style lang="less">
@import "@/styles/single-common.less"; @import "@/styles/single-common.less";
</style> </style>
<template> <template>
<div> <div>
@ -18,38 +18,16 @@
</div> </div>
<Row class="operation" align="middle" justify="space-between"> <Row class="operation" align="middle" justify="space-between">
<div class="br"> <div class="br">
<Button @click="clear" type="error" icon="md-trash" <Button @click="clear" type="error" icon="md-trash">清空回收站</Button>
>清空回收站</Button <Input v-model="searchForm.title" suffix="ios-search" @on-change="getDataList" placeholder="输入文件名搜索"
> clearable style="width: 250px" />
<Input
v-model="searchForm.title"
suffix="ios-search"
@on-change="getDataList"
placeholder="输入文件名搜索"
clearable
style="width: 250px"
/>
</div> </div>
<div class="icons"> <div class="icons">
<Tooltip content="刷新" placement="top" transfer> <Tooltip content="刷新" placement="top" transfer>
<Icon <Icon type="md-refresh" size="18" class="item" @click="getDataList" />
type="md-refresh"
size="18"
class="item"
@click="getDataList"
/>
</Tooltip> </Tooltip>
<Tooltip <Tooltip :content="openTip ? '关闭提示' : '开启提示'" placement="top" transfer>
:content="openTip ? '关闭提示' : '开启提示'" <Icon type="md-bulb" size="18" class="item tip" @click="openTip = !openTip" />
placement="top"
transfer
>
<Icon
type="md-bulb"
size="18"
class="item tip"
@click="openTip = !openTip"
/>
</Tooltip> </Tooltip>
</div> </div>
</Row> </Row>
@ -58,33 +36,18 @@
<span class="select-count">{{ selectList.length }}</span> <span class="select-count">{{ selectList.length }}</span>
<a class="select-clear" @click="clearSelectAll">清空</a> <a class="select-clear" @click="clearSelectAll">清空</a>
</Alert> </Alert>
<Table <Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom"
:loading="loading" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
></Table>
<Row type="flex" justify="end" class="page"> <Row type="flex" justify="end" class="page">
<Page <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize"
:current="searchForm.pageNumber" @on-change="changePage" size="small" show-total show-elevator></Page>
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
size="small"
show-total
show-elevator
></Page>
</Row> </Row>
</Card> </Card>
</div> </div>
</template> </template>
<script> <script>
import { import {
getFileCate, getFileCate,
getUserFileListData, getUserFileListData,
trashFileCate, trashFileCate,
@ -93,9 +56,11 @@ import {
clearTrashFile, clearTrashFile,
deleteFileCate, deleteFileCate,
clearTrashFileCate, clearTrashFileCate,
} from "@/api/index"; } from "@/api/index";
import { vi } from "date-fns/locale"; import {
export default { vi
} from "date-fns/locale";
export default {
name: "trash", name: "trash",
data() { data() {
return { return {
@ -130,8 +95,7 @@ export default {
sortable: true, sortable: true,
render: (h, params) => { render: (h, params) => {
return h( return h(
"div", "div", {
{
style: { style: {
display: "flex", display: "flex",
"align-items": "center", "align-items": "center",
@ -203,8 +167,7 @@ export default {
render: (h, params) => { render: (h, params) => {
return h("div", [ return h("div", [
h( h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.revert(params.row); this.revert(params.row);
@ -219,8 +182,7 @@ export default {
}, },
}), }),
h( h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.delete(params.row); this.delete(params.row);
@ -346,14 +308,18 @@ export default {
}, },
revert(v) { revert(v) {
if (!v.isFolder) { if (!v.isFolder) {
trashFile({ ids: v.id }).then((res) => { trashFile({
ids: v.id
}).then((res) => {
if (res.success) { if (res.success) {
this.getDataList(); this.getDataList();
this.$Message.success("操作成功"); this.$Message.success("操作成功");
} }
}); });
} else { } else {
trashFileCate({ id: v.id }).then((res) => { trashFileCate({
id: v.id
}).then((res) => {
if (res.success) { if (res.success) {
this.getDataList(); this.getDataList();
this.$Message.success("操作成功"); this.$Message.success("操作成功");
@ -364,13 +330,15 @@ export default {
delete(v) { delete(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认彻底删除", title: "确认彻底删除",
content: v.isFolder content: v.isFolder ?
? "确定彻底删除文件夹 " + v.title "确定彻底删除文件夹 " + v.title :
: "确定彻底删除文件 " + v.title, "确定彻底删除文件 " + v.title,
loading: true, loading: true,
onOk: () => { onOk: () => {
if (!v.isFolder) { if (!v.isFolder) {
deleteUserFile({ ids: v.id }).then((res) => { deleteUserFile({
ids: v.id
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.getDataList(); this.getDataList();
@ -378,7 +346,9 @@ export default {
} }
}); });
} else { } else {
deleteFileCate({ ids: v.id }).then((res) => { deleteFileCate({
ids: v.id
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.getDataList(); this.getDataList();
@ -399,5 +369,5 @@ export default {
mounted() { mounted() {
this.init(); this.init();
}, },
}; };
</script> </script>

102
src/views/sys/upApp/upApp.vue

@ -0,0 +1,102 @@
<template>
<div >
<Upload :action="uploadFileUrl" :headers="accessToken" :data="uploadData" :on-success="handleSuccess"
:on-error="handleError" :max-size="100000000" :before-upload="beforeUpload"
multiple type="drag" ref="up">
<div style="padding: 20px 0">
<Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
<p>点击这里或将文件拖拽到这里上传</p>
</div>
</Upload>
<Form ref="form" :model="form" :label-width="85" :rules="formValidate">
<FormItem label="版本号" prop="title">
<Input v-model="form.version" />
</FormItem>
</Form>
<div slot="footer">
<Button type="primary" :loading="submitLoading" @click="handelSubmit">提交</Button>
</div>
</div>
</template>
<script>
import {
getFileCate,
addFileCate,
editFileCate,
uploadFile,
trashFileCate,
searchFileCate,
checkOssSet,
} from "@/api/index";
export default {
name: "fileCategory",
props: {
showOnly: {
type: Boolean,
default: false,
},
},
data() {
return {
uploadFileUrl: uploadFile,
submitLoading: false,
accessToken: {},
uploadData: {},
form:{
path:'',
version:''
}
};
},
methods: {
init() {
this.accessToken = {
accessToken: this.getStore("accessToken"),
};
checkOssSet().then((res) => {
if (!res.success) {
this.$Modal.confirm({
title: "系统还未配置OSS",
content: "管理员还未配置第三方OSS服务,是否现在立即去配置?",
onOk: () => {
this.$router.push({
name: "setting",
query: {
name: "oss"
},
});
},
});
}
});
},
beforeUpload() {
return true;
},
handleSuccess(res, file, fileList) {
if (res.success) {
this.$Message.success("上传文件 " + file.name + " 成功");
this.form.path = res.result
} else {
file.percentage = 0;
file.status = "fail";
file.name += "(上传失败)";
this.$Message.error(res.message);
}
},
handleError(error, file, fileList) {
this.$Message.error(error.toString());
},
handelSubmit() {
console.log(this.form)
}
},
mounted() {
this.init();
},
};
</script>
<style lang="less">
</style>
Loading…
Cancel
Save