From 9c094a1fe3e1ae3dadef6433f8401818fe2b8304 Mon Sep 17 00:00:00 2001
From: lzhe <lzhe@example.com>
Date: 星期五, 21 六月 2024 10:53:43 +0800
Subject: [PATCH] 1

---
 src/views/dnc/document/index.vue |  451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 446 insertions(+), 5 deletions(-)

diff --git a/src/views/dnc/document/index.vue b/src/views/dnc/document/index.vue
index 036843e..a88a9d7 100644
--- a/src/views/dnc/document/index.vue
+++ b/src/views/dnc/document/index.vue
@@ -1,19 +1,460 @@
 <!--
  * @Date: 2024-05-16 22:40:01
  * @LastEditors: Sneed
- * @LastEditTime: 2024-05-16 22:40:07
+ * @LastEditTime: 2024-06-18 21:51:57
  * @FilePath: /belleson-frontend/Users/mache/Documents/demo/cps-web/src/views/dnc/document/index.vue
 -->
 <template>
-    <div>
-        鎴戠殑鏂囨。
-    </div>
+    <el-main style="height: 100%;">
+        <el-card shadow="never" style="height: 100%;" body-style="height: 100%">
+            <el-container>
+                <el-aside width="200px">
+                    <el-container>
+                        <el-main>
+                            <el-tree :expand-on-click-node="false" default-expand-all ref="tree" node-key="id"
+                                :data="treeData" :props="{
+                                    label: 'name',
+                                }" @node-click="nodeClick" highlight-current :current-node-key="selectNode.id">
+                                <template #default="{ node, data }">
+                                    <span :class="data.isGroup ? 'active' : ''" class="custom-tree-node">
+                                        <span>{{
+                                            node.label || data.code }}</span>
+                                    </span>
+                                </template>
+                            </el-tree>
+                        </el-main>
+                        <!-- <el-footer>
+                            <el-button type="primary" round @click="addFolder">鏂板鏂囦欢澶�</el-button>
+                        </el-footer> -->
+                    </el-container>
+                </el-aside>
+                <el-container>
+                    <el-header>
+                        <el-button type="" @click="back">杩斿洖涓婁竴绾�</el-button>
+                        <el-dropdown style="margin-left: 8px;">
+                            <el-button type="primary">
+                                鏂板缓<el-icon class="el-icon--right"><el-icon-arrow-down /></el-icon>
+                            </el-button>
+                            <template #dropdown>
+                                <el-dropdown-menu>
+                                    <el-dropdown-item @click="addFolder">鏂囦欢澶�</el-dropdown-item>
+                                    <el-dropdown-item @click="addFile">鏂囦欢</el-dropdown-item>
+                                </el-dropdown-menu>
+                            </template>
+                        </el-dropdown>
+                        <!-- <el-upload style="margin-left: 8px;" :show-file-list="false" class="upload"
+                            action="/api/blade-resource/oss/endpoint/put-file">
+                            <el-button type="primary">涓婁紶鏂囦欢</el-button>
+                        </el-upload> -->
+                        <el-upload style="margin-left: 8px;" :show-file-list="false" class="upload"
+                            :http-request="request">
+                            <el-button type="primary">涓婁紶鏂囦欢</el-button>
+                        </el-upload>
+                        <!-- <el-button type="primary" style="margin-left: 8px;">涓婁紶鏂囦欢</el-button> -->
+                        <el-dropdown style="margin-left: 8px;" :disabled="selection.length == 0">
+                            <el-button type="primary">
+                                鏇村鎿嶄綔<el-icon class="el-icon--right"><el-icon-arrow-down /></el-icon>
+                            </el-button>
+                            <template #dropdown>
+                                <el-dropdown-menu>
+                                    <el-dropdown-item @click="action(1)">澶嶅埗</el-dropdown-item>
+                                    <el-dropdown-item @click="action(2)">绉诲姩</el-dropdown-item>
+                                </el-dropdown-menu>
+                            </template>
+                        </el-dropdown>
+                        <el-button style="margin-left: 8px;" type="danger" plain :disabled="selection.length == 0"
+                            @click="del(selection)">鍒犻櫎</el-button>
+                        <!-- <el-button-group style="margin-left: auto;">
+                            <el-button :type="type === 'list' ? 'primary' : ''" @click="type = 'list'">
+                                <el-icon>
+                                    <el-icon-fold />
+                                </el-icon>
+                            </el-button>
+                            <el-button :type="type !== 'list' ? 'primary' : ''" @click="type = 'card'">
+                                <el-icon>
+                                    <el-icon-grid />
+                                </el-icon>
+                            </el-button>
+                        </el-button-group> -->
+                        <el-input v-model="params.searchKey" style="margin-left: auto;max-width: 240px"
+                            placeholder="璇疯緭鍏ュ叧閿瘝" class="input-with-select">
+                            <template #append>
+                                <el-button type="primary" class="header-search" @click="search">
+                                    <el-icon>
+                                        <el-icon-search />
+                                    </el-icon>
+                                </el-button>
+                            </template>
+                        </el-input>
+                    </el-header>
+                    <el-main>
+                        <scTable highlight-current-row @dataChange="dataChange" @row-click="rowClick" ref="table"
+                            :params="params" :apiObj="apiObj" @selection-change="selectionChange" stripe>
+                            <el-table-column type="selection" width="50"></el-table-column>
+                            <el-table-column label="鏂囦欢鍚嶇О" prop="name">
+                                <template #default="scope">
+                                    <el-icon style="margin-right: 4px;">
+                                        <el-icon-folder v-if="scope.row.fileType === 1" />
+                                        <el-icon-document v-else />
+                                    </el-icon>
+                                    <a v-if="scope.row.fileType === 1" @click="goCurrent(scope.row)"
+                                        style="color: var(--el-color-primary);cursor: pointer;">{{ scope.row.name }}</a>
+                                    <a v-else @click="viewHis(scope.row)"
+                                        style="color: var(--el-color-primary);cursor: pointer;">{{ scope.row.name }}</a>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="鏂囦欢璺緞" prop="allPathName"></el-table-column>
+                            <el-table-column label="澶у皬" prop="contentLength"></el-table-column>
+                            <el-table-column label="鏂囦欢绫诲瀷" prop="suffix"></el-table-column>
+                            <el-table-column label="鏇存柊鏃堕棿" prop="updateTime"></el-table-column>
+                            <el-table-column label="鎿嶄綔" fixed="right" align="right" width="160">
+                                <template #default="scope">
+                                    <el-button-group>
+                                        <el-button text type="primary" size="small"
+                                            @click="table_edit(scope.row, scope.$index)">閲嶅懡鍚�</el-button>
+                                        <el-popconfirm width="220" title="纭畾灏嗛�夋嫨鐨勬暟鎹垹闄�" @confirm="del([scope.row], '0')">
+                                            <template #reference>
+                                                <el-button text type="primary" size="small">鍒犻櫎</el-button>
+                                            </template>
+                                        </el-popconfirm>
+                                        <!-- <el-button text type="primary" size="small"
+                                            @click="del([scope.row])">鍒犻櫎</el-button> -->
+                                    </el-button-group>
+                                </template>
+                            </el-table-column>
+                        </scTable>
+                    </el-main>
+                </el-container>
+            </el-container>
+        </el-card>
+        <el-dialog v-model="visible" :title="form.id ? '閲嶅懡鍚�' : '鏂板缓鏂囦欢澶�'" width="500">
+            <el-form :model="form" :rules="rules" ref="dialogForm" label-width="120px" label-position="center">
+                <el-form-item v-if="form.fileType == 1 || !form.id" label="鏂囦欢澶瑰悕绉�" prop="name">
+                    <el-input v-model="form.name" />
+                </el-form-item>
+                <el-form-item v-else label="鏂囦欢鍚嶇О" prop="name">
+                    <el-input v-model="form.name" />
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="saveFolder">
+                        纭畾
+                    </el-button>
+                </div>
+            </template>
+        </el-dialog>
+        <el-dialog v-model="visibleFile" title="鏂板缓鏂囦欢澶�" width="500">
+            <el-form :model="formFile" :rules="rulesFile" ref="dialogForm" label-width="120px" label-position="center">
+                <el-form-item label="鏂囦欢浣嶇疆" prop="id">
+                    <el-tree-select v-model="formFile.id" :props="{
+                        label: 'name',
+                    }" :data="treeData" filter style="width: 240px" @node-click="clickNode" node-key="id" />
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="saveFile">
+                        纭畾
+                    </el-button>
+                </div>
+            </template>
+        </el-dialog>
+        <scDialog v-model="visible1">
+            <scForm ref="form" :config="config" :rules="rules1" v-model="form1" @submit="submit1">
+            </scForm>
+        </scDialog>
+    </el-main>
 </template>
 
 <script>
 export default {
+    data() {
+        return {
+            visible: false,
+            rules1: {
+                name: [{
+                    required: true, message: '蹇呭~'
+                }],
+                content: [{
+                    required: true, message: '蹇呭~'
+                }]
+            },
+            form1: {},
+            config: {
+                labelWidth: 120,
+                formItems: [
+                    {
+                        component: 'input',
+                        label: '鏂囦欢鍚嶇О',
+                        name: 'name',
+                        options: {
+                            placeholder: '',
+                            maxlength: 100,
+                        }
+                    },
+                    {
+                        component: 'input',
+                        label: '鏂囦欢鍐呭',
+                        type: 'textarea',
+                        name: 'content',
+                        options: {
+                            multiple: false,
+                            data: []
+                        },
+                        disabled: false
+                    }
+                ]
+            },
+            treeData: [],
+            selectNode: {},
+            visible1: false,
+            form: {},
+            rules: {
+                name: [{
+                    required: true, message: '蹇呭~'
+                }]
+            },
+            params: {
+                searchKey: '',
+            },
+            apiObj: {
+                get: async (data) => {
+                    let params = {
+                        ...data,
+                        parent: this.selectNode.id,
+                        ...this.params
+                    }
+                    return await this.$HTTP.get(`/api/blade-dnc/folder/page`, {}, { params }).then(res => {
+                        return res
+                    })
+                }
+            },
+            selection: [],
+            type: 'list',
+            visibleFile: false,
+            formFile: {},
+            rulesFile: {
+                id: [{
+                    required: true, message: '蹇呭~'
+                }]
+            }
+        }
+    },
+    watch: {
+        'selectNode.id': function () {
+            this.search()
+        }
+    },
+    mounted() {
+        this.init()
+    },
+    methods: {
+        request(options) {
+            const formData = new FormData()
+            formData.append('file', options.file)
+            console.log(options)
+            this.$HTTP.post(`/api/blade-resource/oss/endpoint/put-file`, formData).then(resFile => {
+                if (resFile.success) {
+                    this.$HTTP.post(`/api/blade-dnc/file/batch-save`, [{
+                        name: options.file.name,
+                        targetId: this.selectNode.id,
+                        ossFile: {
+                            attachId: resFile.data.attachId,
+                            domain: resFile.data.domain,
+                            link: resFile.data.link,
+                            name: resFile.data.name,
+                            originalName: resFile.data.originalName
+                        }
+                    }]).then(res => {
+                        if (res.success) {
+                            this.visible = false
+                            this.search()
+                        } else {
+                            this.$message.error(res.msg)
+                        }
+                    })
+                } else {
+                    this.$message.error(res.msg)
+                }
 
+            })
+        },
+        addFile() {
+            this.form1 = {}
+            this.$refs?.form?.resetFields()
+            this.visible1 = true
+        },
+        submit1() {
+            // 鍒涘缓鏂囨湰鍐呭
+            const textContent = "杩欓噷鏄枃鏈唴瀹�";
+
+            // 鍒涘缓Blob瀵硅薄
+            const blob = new Blob([this.form1.content], { type: 'text/plain' });
+            // 鍒涘缓File瀵硅薄
+            const file = new File([blob], this.form1.name, { type: 'text/plain', lastModified: new Date().getTime() });
+            const data = new FormData()
+            data.append("file", file);
+            this.$HTTP.post(`/api/blade-resource/oss/endpoint/put-file`, data).then(res => {
+                if (res.success) {
+                    this.$HTTP.post(`/api/blade-dnc/file/batch-save`, [{
+                        name: `${this.form1.name}.txt`,
+                        targetId: this.selectNode.id,
+                        ossFile: {
+                            attachId: res.data.attachId,
+                            domain: res.data.domain,
+                            link: res.data.link,
+                            name: res.data.name,
+                            originalName: res.data.originalName
+                        }
+                    }]).then(res => {
+                        if (res.success) {
+                            this.visible = false
+                            this.search()
+                        } else {
+                            this.$message.error(res.msg)
+                        }
+                    })
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        init() {
+            this.selectNode = {
+                id: ''
+            }
+            this.$HTTP.get(`/api/blade-dnc/folder/folder-tree`).then(res => {
+                this.treeData = [{
+                    group: true,
+                    id: 0,
+                    name: '鎴戠殑鏂囨。',
+                    children: res.data
+                }]
+                this.selectNode = {
+                    group: true,
+                    id: 0,
+                    name: '鎴戠殑鏂囨。',
+                }
+            })
+        },
+        nodeClick(node) {
+            this.selectNode = node
+        },
+        goCurrent(row) {
+            this.selectNode = { id: row.id }
+            console.log(row)
+        },
+        viewHis(row) {
+            window.open(row.link)
+            // this.$HTTP.get(`/api/blade-dnc/file/history?name=${row.name}&pid=${row.parentId}`)
+        },
+        back() {
+            console.log(this.$refs.tree.getCurrentNode())
+            this.selectNode = { id: this.$refs.tree.getCurrentNode().parentId }
+        },
+        search() {
+            this.$refs?.table?.reload()
+        },
+        // 鏂板鏂囦欢澶�
+        addFolder() {
+            this.visible = true
+            this.form = { fileType: 1 }
+        },
+        saveFolder() {
+            if (this.form.id) {
+                return this.$HTTP.put(`/api/blade-dnc/file/${this.form.id}/rename`, { fileType: this.form.fileType, newName: this.form.name, parentId: this.form.parentId }).then(res => {
+                    this.visible = false
+                    this.search()
+                })
+            }
+            let data = {
+                ...this.form,
+                parent: this.selectNode.id
+            }
+            try {
+                Reflect.deleteProperty(data, 'fileType')
+            } catch (error) {
+
+            }
+            this.$HTTP.post(`/api/blade-dnc/folder`, data).then(res => {
+                this.visible = false
+                this.init()
+            })
+        },
+        selectionChange(selection) {
+            this.selection = selection
+        },
+        action(type) {
+            this.visibleFile = true
+            this.formFile.move = type
+        },
+        clickNode(node) {
+            this.formFile.id = node.id
+        },
+        saveFile() {
+            if (this.formFile.move === 1) {
+                this.copy()
+            } else {
+                this.move()
+            }
+        },
+        copy() {
+            this.$HTTP.post(`/api/blade-dnc/file/copy`, { parentId: this.formFile.id, sourceIdList: this.selection.map(v => v.id) }).then(res => {
+                this.visibleFile = false
+            })
+        },
+        move() {
+            this.$HTTP.put(`/api/blade-dnc/file/move`, { parentId: this.formFile.id, sourceIdList: this.selection.map(v => v.id) }).then(res => {
+                this.visibleFile = false
+            })
+        },
+        table_edit(row) {
+            this.form = {
+                id: row.id,
+                name: row.name,
+                fileType: row.fileType,
+                parentId: row.parentId
+            }
+            this.visible = true
+        },
+        async del(selection) {
+            let sourceIdList = selection.filter(v => v.fileType === 1).map(v => v.id)
+            let tip = false
+            let delFlag = true
+            if (sourceIdList.length > 0) {
+                tip = await this.$HTTP.post(`/api/blade-dnc/file/exists-file`, { sourceIdList }).then(res => {
+                    if (res.data) {
+                        return res.data
+                    }
+                })
+            }
+
+            if (tip) {
+                delFlag = await this.$confirm(`姝ゆ搷浣滀細灏嗗綋鍓嶆枃浠跺す涓嬬殑鎵�鏈夋枃浠跺垹闄わ紝鏄惁缁х画??`, '鎻愮ず', {
+                    type: 'warning',
+                }).then(() => {
+                    return true
+                }).catch(() => {
+                    return false
+                })
+            }
+            console.log(delFlag, '>>>>>')
+            if (!delFlag) {
+                return
+            }
+            console.log('------')
+            // return
+            this.$HTTP.delete(`/api/blade-dnc/file`, { sourceIdList: selection.map(v => v.id) }).then(res => {
+                this.init()
+            })
+        }
+    }
 }
 </script>
 
-<style lang="scss" scoped></style>
\ No newline at end of file
+<style lang="scss" scoped>
+.header-search {
+    cursor: pointer;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3