123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545 |
- <template>
- <section class="content">
- <div class="box box-info">
- <div
- v-loading.body="fileLoading"
- v-loading.fullscreen="fileLoading"
- class="box-body"
- element-loading-text="请稍后..."
- >
- <!-- 表单 -->
- <el-form inline :model="formSearch">
- <el-form-item v-if="isSuperAdmin" label="学校">
- <el-select
- v-model="formSearch.rootOrgId"
- placeholder="请选择"
- style="width: 180px"
- filterable
- >
- <el-option
- v-for="item in rootSchoolSelect"
- :key="item.id"
- :label="item.name"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="名称">
- <el-input
- v-model="formSearch.name"
- placeholder="请输入名称"
- style="width: 180px"
- />
- </el-form-item>
- <el-form-item>
- <el-button
- size="small"
- type="primary"
- icon="el-icon-search"
- @click="handleSearchBtn"
- >
- 查询
- </el-button>
- </el-form-item>
- </el-form>
- <div class="block-seperator"></div>
- <span>当前目录:{{ curDir }}</span>
- <span style="float: right">
- <el-button
- size="small"
- type="primary"
- :disabled="parentDirBtn()"
- @click="parentDir"
- >
- 上一级
- </el-button>
- <el-button
- size="small"
- type="primary"
- icon="el-icon-plus"
- @click="addDir"
- >
- 新增目录
- </el-button>
- <el-button
- size="small"
- type="primary"
- icon="el-icon-plus"
- @click="addFile"
- >
- 新增文件
- </el-button>
- </span>
- <div style="width: 100%; margin-bottom: 10px"></div>
- <!-- 页面列表 -->
- <el-table :data="tableData" border resizable stripe style="width: 100%">
- <el-table-column width="50" label="ID">
- <span slot-scope="scope">{{ scope.row.id }}</span>
- </el-table-column>
- <el-table-column width="250" label="名称">
- <span slot-scope="scope">
- <span
- style="width: 30px; height: 20px; display: block; float: left"
- >
- <img
- v-if="scope.row.isFile == 0"
- src="../assets/img/dir.png"
- style="height: 20px; width: 20px"
- />
- </span>
- <span
- ><a
- v-if="scope.row.isFile == 0"
- href="javascript:void(0)"
- @click="toDir(scope.row)"
- >{{ scope.row.name }}</a
- ><a
- v-if="scope.row.isFile == 1"
- target="_blank"
- :href="scope.row.fileUrl"
- >{{ scope.row.name }}</a
- ></span
- ></span
- >
- </el-table-column>
- <el-table-column label="路径">
- <span slot-scope="scope">{{ scope.row.filePath }}</span>
- </el-table-column>
- <el-table-column width="180" label="创建时间">
- <span slot-scope="scope">{{ scope.row.creationTime }}</span>
- </el-table-column>
- <el-table-column :context="_self" label="操作" width="150">
- <div slot-scope="scope">
- <el-button
- size="mini"
- type="danger"
- plain
- @click="deleteRes(scope.row)"
- >
- <i class="el-icon-delete"></i> 删除
- </el-button>
- </div>
- </el-table-column>
- </el-table>
- <div class="page pull-right">
- <el-pagination
- v-if="paginationShow"
- :current-page="currentPage"
- :page-size="pageSize"
- :page-sizes="[10, 20, 50, 100, 200, 300]"
- layout="total, sizes, prev, pager, next, jumper"
- :total="total"
- @current-change="handleCurrentChange"
- @size-change="handleSizeChange"
- />
- </div>
- </div>
- <el-dialog
- title="新增目录"
- width="500px"
- :visible.sync="dirModel"
- :close-on-click-modal="false"
- @close="closeDirModel"
- >
- <el-form
- ref="dirForm"
- :key="dirModelKey"
- :inline="true"
- :model="dirForm"
- :rules="dirRules"
- label-width="90px"
- >
- <el-row>
- <el-form-item label="目录名称" prop="dirName">
- <el-input
- v-model="dirForm.dirName"
- class="pull-length"
- maxlength="50"
- placeholder="可输入字母,数字,-,_"
- />
- </el-form-item>
- </el-row>
- <el-row class="pull-center">
- <el-button type="primary" :loading="dirForm.loading" @click="subDir"
- >确定</el-button
- >
- <el-button @click="closeDirModel">取消</el-button>
- </el-row>
- </el-form>
- </el-dialog>
- <el-dialog
- title="新增文件"
- width="550px"
- :visible.sync="fileModel"
- :close-on-click-modal="false"
- @close="closeFileModel"
- >
- <el-form
- ref="fileForm"
- :key="fileModelKey"
- :inline="true"
- :model="fileForm"
- :rules="fileRules"
- label-width="90px"
- >
- <el-row>
- <el-form-item label="文件" prop="dataFile">
- <el-input
- v-model="fileForm.fileName"
- class="pull-length"
- :readonly="true"
- placeholder="文件最大限制10M"
- />
- </el-form-item>
- <el-form-item>
- <el-upload :before-upload="handleUploadFile" action="/upload">
- <el-button
- type="primary"
- size="small"
- icon="ios-cloud-upload-outline"
- >请选择文件
- </el-button>
- </el-upload>
- </el-form-item>
- </el-row>
- <el-row class="pull-center">
- <el-button
- type="primary"
- :loading="fileForm.loading"
- @click="subFile"
- >确定</el-button
- >
- <el-button @click="closeFileModel">取消</el-button>
- </el-row>
- </el-form>
- </el-dialog>
- </div>
- </section>
- </template>
- <script>
- import { CORE_API } from "@/constants/constants.js";
- import { mapState } from "vuex";
- export default {
- name: "ResourceList",
- data() {
- var validateFile = function (rule, value, callback) {
- if (value) {
- var upFileName = value.name;
- var reg = /^[a-zA-Z\\-_0-9\\.]{1,50}$/;
- if (!upFileName.match(reg)) {
- return callback(
- new Error("文件名长度最大为50且只能包含字母,数字,'-','_','.'")
- );
- } else if (value.size > 1024 * 1024 * 10) {
- return callback(new Error("文件大小限制为10M"));
- } else {
- callback();
- }
- } else {
- callback();
- }
- };
- return {
- fileLoading: false,
- dirModel: false,
- dirModelKey: Math.random(),
- fileModel: false,
- fileModelKey: Math.random(),
- curDir: "",
- parentIds: [],
- paginationShow: false,
- rootOrgList: [],
- formSearch: {
- parentId: -1,
- rootOrgId: null,
- code: "",
- name: "",
- },
- dirForm: {
- dirName: "",
- loading: false,
- },
- fileForm: {
- fileName: null,
- dataFile: null,
- loading: false,
- },
- loading: true,
- tableData: [],
- currentPage: 1,
- pageSize: 10,
- total: 10,
- dirRules: {
- dirName: [
- { required: true, message: "请输入目录名称", trigger: "blur" },
- {
- pattern: /^[a-zA-Z\\-_0-9]{1,50}$/,
- message: "目录名称必须为1-50位字母,数字,'-','_'组合",
- trigger: "blur",
- },
- ],
- },
- fileRules: {
- dataFile: [
- {
- required: true,
- type: "object",
- message: "请选择文件",
- trigger: "change",
- },
- {
- validator: validateFile,
- type: "object",
- trigger: "change",
- },
- ],
- },
- };
- },
- computed: {
- ...mapState({ user: (state) => state.user }),
- isSuperAdmin() {
- return this.user.roleList.some((role) => role.roleCode == "SUPER_ADMIN");
- },
- rootSchoolSelect() {
- let rootSchools = [];
- for (let i = 0; i < this.rootOrgList.length; i++) {
- let info = {
- name: this.rootOrgList[i].name + "(" + this.rootOrgList[i].id + ")",
- id: this.rootOrgList[i].id,
- };
- rootSchools.push(info);
- }
- return rootSchools;
- },
- },
- watch: {
- "formSearch.rootOrgId": {
- immediate: false,
- handler(val) {
- if (val == null) {
- this.curDir = "";
- } else {
- this.curDir = "/";
- this.formSearch.parentId = -1;
- this.handleSearchBtn();
- }
- },
- },
- },
- //初始化查询
- created() {
- this.init();
- },
- methods: {
- handleUploadFile(file) {
- this.fileForm.dataFile = file;
- this.fileForm.fileName = file.name;
- return false;
- },
- async subFile() {
- const res = await this.$refs.fileForm.validate();
- if (res === false) {
- return;
- }
- this.fileForm.loading = true;
- var params =
- "?parentId=" +
- this.formSearch.parentId +
- "&rootOrgId=" +
- this.formSearch.rootOrgId;
- var url = CORE_API + "/resource/addFile" + params;
- let formData = new FormData();
- formData.append("dataFile", this.fileForm.dataFile);
- this.$httpWithMsg
- .post(url, formData)
- .then(() => {
- this.$notify({
- type: "success",
- message: "上传成功!",
- });
- this.closeFileModel();
- this.searchForm();
- })
- .finally(() => (this.fileForm.loading = false));
- },
- closeFileModel() {
- this.fileModel = false;
- this.$refs.fileForm.resetFields();
- this.fileModelKey = Math.random();
- this.fileForm.fileName = null;
- this.fileForm.dataFile = null;
- },
- closeDirModel() {
- this.dirModel = false;
- this.dirForm.dirName = null;
- this.dirModelKey = Math.random();
- },
- async subDir() {
- let res = await this.$refs.dirForm.validate();
- if (!res) {
- return;
- }
- this.dirForm.loading = true;
- var url = CORE_API + "/resource/addDir";
- this.$httpWithMsg
- .post(url, {
- parentId: this.formSearch.parentId,
- rootOrgId: this.formSearch.rootOrgId,
- name: this.dirForm.dirName,
- })
- .then(() => {
- this.$notify({
- type: "success",
- message: "新增成功!",
- });
- this.closeDirModel();
- this.searchForm();
- })
- .finally(() => (this.dirForm.loading = false));
- },
- lastCurDir() {
- this.curDir = this.curDir.substring(0, this.curDir.length - 1);
- var index = this.curDir.lastIndexOf("/");
- this.curDir = this.curDir.substring(0, index + 1);
- },
- toDir(row) {
- this.curDir = this.curDir + row.name + "/";
- this.parentIds.push(this.formSearch.parentId);
- this.formSearch.parentId = row.id;
- this.currentPage = 1;
- this.searchForm();
- },
- parentDirBtn() {
- if (this.curDir == "/" || this.curDir == "") {
- return true;
- } else {
- return false;
- }
- },
- deleteRes(row) {
- this.$confirm("确定删除?", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- var url = CORE_API + "/resource/" + row.id;
- this.$httpWithMsg.delete(url).then(() => {
- this.$notify({
- type: "success",
- message: "删除成功!",
- });
- this.searchForm();
- });
- });
- },
- parentDir() {
- this.formSearch.parentId = this.parentIds.pop();
- this.lastCurDir();
- this.currentPage = 1;
- this.searchForm();
- },
- addFile() {
- if (this.formSearch.rootOrgId == null) {
- this.$notify({
- type: "warning",
- message: "请选择学校",
- });
- return;
- }
- this.fileModel = true;
- },
- addDir() {
- if (this.formSearch.rootOrgId == null) {
- this.$notify({
- type: "warning",
- message: "请选择学校",
- });
- return;
- }
- this.dirModel = true;
- },
- handleSearchBtn() {
- this.currentPage = 1;
- this.searchForm();
- },
- handleSizeChange(val) {
- this.pageSize = val;
- this.currentPage = 1;
- this.searchForm();
- },
- handleCurrentChange(val) {
- this.currentPage = val;
- this.searchForm();
- },
- //查询
- searchForm() {
- if (this.formSearch.rootOrgId == null) {
- this.$notify({
- type: "warning",
- message: "请选择学校",
- });
- return;
- }
- this.loading = true;
- this.fileLoading = true;
- var param = new URLSearchParams(this.formSearch);
- var url =
- CORE_API +
- "/resource/page/" +
- (this.currentPage - 1) +
- "/" +
- this.pageSize +
- "?" +
- param;
- this.$httpWithMsg
- .get(url)
- .then((response) => {
- this.tableData = response.data.list;
- this.total = response.data.total;
- this.loading = false;
- this.$nextTick(function () {
- this.paginationShow = true;
- });
- })
- .finally(() => (this.fileLoading = false));
- },
- init() {
- if (this.isSuperAdmin) {
- this.$httpWithMsg
- .get(CORE_API + "/org/getRootOrgList")
- .then((response) => {
- this.rootOrgList = response.data;
- });
- } else {
- this.formSearch.rootOrgId = this.user.rootOrgId;
- this.searchForm();
- }
- },
- },
- };
- </script>
- <style scoped>
- .page {
- margin-top: 10px;
- }
- .el-upload {
- width: 80px;
- }
- .pull-length {
- width: 300px;
- }
- .pull-center {
- margin-top: 20px;
- }
- </style>
|