From 38270b3ee920d80ad57e8f60dea8232887861a02 Mon Sep 17 00:00:00 2001 From: TreeWish <1131093754@qq.com> Date: 星期五, 03 三月 2023 22:02:12 +0800 Subject: [PATCH] 数据库管理-信息管理&综合展示-资料馆实现文件预览功能 --- src/views/datamanage/metadataManage.vue | 909 ++++++++++++++++++++++++-------------------------- src/assets/lang/zh.js | 3 src/views/Archive/index.vue | 28 + src/utils/validata.js | 3 src/assets/lang/en.js | 3 src/api/screen.js | 5 src/components/FilePreview/ImagePreview.vue | 90 +++++ 7 files changed, 569 insertions(+), 472 deletions(-) diff --git a/src/api/screen.js b/src/api/screen.js index 98f9b44..ad360d9 100644 --- a/src/api/screen.js +++ b/src/api/screen.js @@ -109,3 +109,8 @@ export function selectPipelines(params) { return request.get("/comprehensive/selectPipelines", { params: params }) } + +// 鏂囦欢棰勮鎺ュ彛 +export function dataLibView(params) { + return request.get("/dataLib/downloadForView", { params: params }) +} diff --git a/src/assets/lang/en.js b/src/assets/lang/en.js index 2537614..02f347a 100644 --- a/src/assets/lang/en.js +++ b/src/assets/lang/en.js @@ -49,7 +49,8 @@ pleaseInputPassworld: 'Please input a password', passworld: 'Passworld', language: "涓枃", - title: 'Title' + title: 'Title', + preview: 'preview' }, dataManage: { diff --git a/src/assets/lang/zh.js b/src/assets/lang/zh.js index 2a26512..61d065e 100644 --- a/src/assets/lang/zh.js +++ b/src/assets/lang/zh.js @@ -49,7 +49,8 @@ pleaseInputPassworld: '璇疯緭鍏ュ瘑鐮�', passworld: '瀵嗙爜', language: "English", - title: '鏍囬' + title: '鏍囬', + preview: '棰勮' }, dataManage: { dataManage: '鏁版嵁绠$悊', diff --git a/src/components/FilePreview/ImagePreview.vue b/src/components/FilePreview/ImagePreview.vue new file mode 100644 index 0000000..2916f51 --- /dev/null +++ b/src/components/FilePreview/ImagePreview.vue @@ -0,0 +1,90 @@ +<template> + <el-image + :src="`${realSrc}`" + fit="cover" + :style="`width:${realWidth};height:${realHeight};`" + :preview-src-list="realSrcList" + > + <div slot="error" class="image-slot"> + <i class="el-icon-picture-outline"></i> + </div> + </el-image> +</template> + +<script> +import { isExternal } from "@/utils/validate"; + +export default { + name: "ImagePreview", + props: { + src: { + type: String, + default: "" + }, + width: { + type: [Number, String], + default: "" + }, + height: { + type: [Number, String], + default: "" + } + }, + computed: { + realSrc() { + if (!this.src) { + return; + } + let real_src = this.src.split(",")[0]; + if (isExternal(real_src)) { + return real_src; + } + return BASE_URL + real_src; + }, + realSrcList() { + if (!this.src) { + return; + } + let real_src_list = this.src.split(","); + let srcList = []; + real_src_list.forEach(item => { + if (isExternal(item)) { + return srcList.push(item); + } + return srcList.push(process.env.VUE_APP_BASE_API + item); + }); + return srcList; + }, + realWidth() { + return typeof this.width == "string" ? this.width : `${this.width}px`; + }, + realHeight() { + return typeof this.height == "string" ? this.height : `${this.height}px`; + } + }, +}; +</script> + +<style lang="scss" scoped> +.el-image { + border-radius: 5px; + background-color: #ebeef5; + box-shadow: 0 0 5px 1px #ccc; + ::v-deep .el-image__inner { + transition: all 0.3s; + cursor: pointer; + &:hover { + transform: scale(1.2); + } + } + ::v-deep .image-slot { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + color: #909399; + font-size: 30px; + } +} +</style> diff --git a/src/utils/validata.js b/src/utils/validata.js new file mode 100644 index 0000000..c5e1ab2 --- /dev/null +++ b/src/utils/validata.js @@ -0,0 +1,3 @@ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} \ No newline at end of file diff --git a/src/views/Archive/index.vue b/src/views/Archive/index.vue index 745f391..9c28b0f 100644 --- a/src/views/Archive/index.vue +++ b/src/views/Archive/index.vue @@ -181,6 +181,13 @@ <span v-show="formInline.dataType !='type2'">{{item.tabDesc}}</span> <div style="float: right; padding: 3px 0"> <i + v-show="!showView(item.type) && formInline.dataType=='type2'" + class="el-icon-view" + :title="$t('common.preview')" + @click="setAttatchFileView(index, item)" + ></i> + <i + style="margin-left:10px" class="el-icon-tickets" :title="$t('common.details')" @click="setCardDetails(item)" @@ -1069,6 +1076,7 @@ dataLib_selectFiles, dataLib_deletes } from '../../api/api'; +import {dataLibView } from '@/api/screen.js' export default { components: { MyBread, MapSdk @@ -1200,6 +1208,7 @@ } }; }, + mounted() { this.getDepTreeData(); this.getCategorySelectData(); @@ -1247,7 +1256,6 @@ }, //闄勪欢鏌ョ湅 setAttatchDetail(index, row) { - this.refreshAttatchDetail() var name = row.name; if (name.indexOf('.pdf') != -1) { @@ -1260,7 +1268,25 @@ this.dialog.isJpg = true; var url = BASE_URL + "/res/downloadForView?guid=" + row.guid + "&token=" + getToken(); this.dialog.src = url + } + }, + + setAttatchFileView(index, row) { + this.refreshAttatchDetail() + var name = `${row.name}.${row.type}`; + if (name.indexOf('.pdf') != -1) { + this.dialog.isPdf = true; + } else if (name.indexOf('.jpg') != -1 || name.indexOf('.gif') != -1 || name.indexOf('.png') != -1 || name.indexOf('.jpeg') != -1) { + this.dialog.isJpg = true; } + this.dialog.dialogVisible = true; + this.dialog.isPdf = true; + var url = BASE_URL + "/dataLib/downloadForView?guid=" + row.guid + "&token=" + getToken(); + this.dialog.src = url; + }, + showView(name) { + if (!name) return false + return name.indexOf('pdf') || name.indexOf('jpg') != -1 || name.indexOf('gif') != -1 || name.indexOf('png') != -1 || name.indexOf('jpeg') != -1 }, //闄勪欢鍒櫎 async setAttachDel() { diff --git a/src/views/datamanage/metadataManage.vue b/src/views/datamanage/metadataManage.vue index 43a95cb..91b6153 100644 --- a/src/views/datamanage/metadataManage.vue +++ b/src/views/datamanage/metadataManage.vue @@ -1,19 +1,14 @@ <template> <div class="authorityManagement_box"> - <My-bread :list="[ + <My-bread + :list="[ `${$t('dataManage.dataManage')}`, `${$t('dataManage.metadataManage')}`, - ]"></My-bread> + ]" + ></My-bread> <el-divider /> - <div - class="inquire subpage_Div" - ref="container" - > - <el-form - ref="queryForm" - :model="queryForm" - :inline="true" - > + <div class="inquire subpage_Div" ref="container"> + <el-form ref="queryForm" :model="queryForm" :inline="true"> <div class="flex_box"> <div style="margin-right: auto"> <el-form-item size="small"> @@ -98,25 +93,22 @@ </el-option> </el-select> </el-form-item> - <el-form-item - prop="name" - size="small" - > + <el-form-item prop="name" size="small"> <!-- suffix-icon="el-icon-edit" :placeholder="$t('common.pleaseInput')"--> <el-input v-model="queryForm.name" :placeholder="$t('shuJuGuanLi.lable2')" style="width: 200px" - ><i + ><i slot="suffix" class="el-icon-search" @click="queryInfo()" style="padding-right: 8px" - ></i></el-input> + ></i + ></el-input> </el-form-item> </div> <div> - <!-- <el-form-item> <el-button @click="queryInfo()" @@ -133,7 +125,7 @@ size="small" @click="deleteMetaInfo" icon="el-icon-delete" - >{{ $t("common.delete") }} + >{{ $t("common.delete") }} </el-button> </el-form-item> <el-form-item v-if="btnStatus.download"> @@ -142,7 +134,7 @@ icon="el-icon-download" type="success" size="small" - >{{ $t("common.download") }} + >{{ $t("common.download") }} </el-button> </el-form-item> @@ -152,10 +144,9 @@ icon="el-icon-refresh" type="info" size="small" - >{{ $t("common.reset") }} + >{{ $t("common.reset") }} </el-button> </el-form-item> - </div> </div> @@ -204,10 +195,7 @@ </el-form> </div> <div class="dividing-line"></div> - <div - class="table_box subpage_Div" - :style="styleVar" - > + <div class="table_box subpage_Div" :style="styleVar"> <el-table :data="tableData" style="width: 100%" @@ -215,10 +203,7 @@ @selection-change="handleSelectionChange" height="calc(100% - 57px)" > - <el-table-column - type="selection" - width="55" - /> + <el-table-column type="selection" width="55" /> <el-table-column :label="$t('dataManage.dictionaryManageObj.number')" type="index" @@ -233,22 +218,23 @@ title="婧愭暟鎹煡璇�" @click="setQueryMetaData(scope.row)" target="_blank" - >{{ scope.row.name }}</el-link> + >{{ scope.row.name }}</el-link + > </span> - <span v-else-if="scope.row.metaid > 0"> <el-link + <span v-else-if="scope.row.metaid > 0"> + <el-link style="color: #409eff" title="鍏冩暟鎹煡璇�" @click="setMetaDataQuery(scope.row)" target="_blank" - >{{ scope.row.name }}</el-link></span> + >{{ scope.row.name }}</el-link + ></span + > <span v-else>{{ scope.row.name }}</span> </template> </el-table-column> - <el-table-column - prop="type" - :label="$t('dataManage.vmobj.format')" - /> + <el-table-column prop="type" :label="$t('dataManage.vmobj.format')" /> <el-table-column prop="sizes" :label="$t('dataManage.vmobj.size')" @@ -271,10 +257,9 @@ <template slot-scope="scope"> <!-- <span ></span> --> <el-link></el-link> - <el-link - :underline="false" - @click="detail(scope.row)" - >{{ scope.row.tab }}</el-link> + <el-link :underline="false" @click="detail(scope.row)">{{ + scope.row.tab + }}</el-link> </template> </el-table-column> @@ -283,10 +268,7 @@ :label="$t('dataManage.vmobj.tab')" :formatter="formatData" /> --> - <el-table-column - prop="rows" - :label="$t('dataManage.vmobj.row')" - /> + <el-table-column prop="rows" :label="$t('dataManage.vmobj.row')" /> <el-table-column prop="uname" :label="$t('dataManage.vmobj.createonuser')" @@ -296,17 +278,14 @@ :label="$t('dataManage.vmobj.createontime')" :formatter="formatData" /> - <el-table-column - min-width="180" - :label="$t('common.operate')" - > + <el-table-column min-width="180" :label="$t('common.operate')"> <template slot-scope="scope"> <el-button @click="showDetail(scope.row)" type="primary" plain size="small" - >{{ $t("common.details") }} + >{{ $t("common.details") }} </el-button> <el-button type="warning" @@ -315,15 +294,20 @@ v-if="btnStatus.update" @click="editInfo(scope.row)" style="margin-left: 10px" - >{{ $t("common.edit") }} + >{{ $t("common.edit") }} + </el-button> + <el-button + plain + size="small" + v-if="showPreview(scope.row)" + @click="handlePreview(scope.row)" + style="margin-left: 10px" + >{{ $t("common.preview") }} </el-button> </template> </el-table-column> </el-table> - <div - class="pagination_box" - style="margin-top: 15px" - > + <div class="pagination_box" style="margin-top: 15px"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" @@ -336,28 +320,16 @@ </el-pagination> </div> </div> - <div - class="infoBox_box" - v-show="showinfoBox" - > + <div class="infoBox_box" v-show="showinfoBox"> <div class="infoBox box_div"> - <div - slot="header" - class="clearfix" - > + <div slot="header" class="clearfix"> <span>{{ $t("common.details") }}</span> - <div - style="float: right; cursor: pointer" - @click="closeDetial" - > + <div style="float: right; cursor: pointer" @click="closeDetial"> <i class="el-icon-close"></i> </div> </div> <el-divider></el-divider> - <div - class="contentBox" - style="padding: 1%" - > + <div class="contentBox" style="padding: 1%"> <p>{{ $t("dataManage.vmobj.name") }}锛歿{ itemdetail.name }}</p> <el-divider></el-divider> <p>{{ $t("dataManage.vmobj.format") }}锛歿{ itemdetail.type }}</p> @@ -412,36 +384,24 @@ :visible.sync="dialogFormVisible" :before-close="handleClose" > - <el-form - :model="editForm" - ref="editForm" - > + <el-form :model="editForm" ref="editForm"> <el-form-item :label="$t('dataManage.vmobj.name')" :label-width="formLabelWidth" > - <el-input - v-model="editForm.name" - autocomplete="off" - ></el-input> + <el-input v-model="editForm.name" autocomplete="off"></el-input> </el-form-item> <el-form-item :label="$t('dataManage.vmobj.format')" :label-width="formLabelWidth" > - <el-input - v-model="editForm.type" - autocomplete="off" - ></el-input> + <el-input v-model="editForm.type" autocomplete="off"></el-input> </el-form-item> <el-form-item :label="$t('dataManage.vmobj.size')" :label-width="formLabelWidth" > - <el-input - v-model="editForm.sizes" - autocomplete="off" - ></el-input> + <el-input v-model="editForm.sizes" autocomplete="off"></el-input> </el-form-item> <el-form-item :label="$t('dataManage.vmobj.depName')" @@ -507,10 +467,7 @@ :label="$t('dataManage.vmobj.describe')" :label-width="formLabelWidth" > - <el-input - v-model="editForm.describe" - autocomplete="off" - ></el-input> + <el-input v-model="editForm.describe" autocomplete="off"></el-input> </el-form-item> <!-- <el-form-item :label="$t('dataManage.vmobj.gather')" @@ -519,44 +476,28 @@ <el-input v-model="editForm.gather" autocomplete="off"></el-input> </el-form-item> --> </el-form> - <div - v-if="behavior == '淇敼淇℃伅'" - slot="footer" - class="dialog-footer" - > - <el-button - size="small" - @click="cancelEdit()" - >{{ - $t("common.reset") - }} + <div v-if="behavior == '淇敼淇℃伅'" slot="footer" class="dialog-footer"> + <el-button size="small" @click="cancelEdit()" + >{{ $t("common.reset") }} </el-button> <el-button size="small" type="primary" @click="sendEdit('editForm')" v-loading.fullscreen.lock="fullscreenLoading" - >{{ $t("common.submit") }} + >{{ $t("common.submit") }} </el-button> </div> - <div - v-else - slot="footer" - class="dialog-footer" - > - <el-button - size="small" - @click="cancelAdd('editForm')" - >{{ - $t("common.reset") - }} + <div v-else slot="footer" class="dialog-footer"> + <el-button size="small" @click="cancelAdd('editForm')" + >{{ $t("common.reset") }} </el-button> <el-button size="small" type="primary" @click="sendAdd('editForm')" v-loading.fullscreen.lock="fullscreenLoading" - >{{ $t("common.submit") }} + >{{ $t("common.submit") }} </el-button> </div> </el-dialog> @@ -588,10 +529,7 @@ align="center" ></el-table-column> </el-table> - <div - style="margin-top: 10px" - class="pagination_box" - > + <div style="margin-top: 10px" class="pagination_box"> <el-pagination @size-change="handleLoaderSizeChange" @current-change="handleLoaderCurrentChange" @@ -605,10 +543,7 @@ </div> </div> </el-dialog> - <div - class="downloadBox box_div subpage_Div" - v-if="showCodeBox" - > + <div class="downloadBox box_div subpage_Div" v-if="showCodeBox"> <h4 style="padding: 20px">{{ $t("common.passworld") }}</h4> <el-form :model="codeForm" @@ -617,20 +552,14 @@ label-width="100px" class="codeForm" > - <el-form-item - :label="$t('common.passworld')" - prop="password" - > + <el-form-item :label="$t('common.passworld')" prop="password"> <el-input type="password" v-model="codeForm.password" show-password ></el-input> </el-form-item> - <el-form-item - :label="$t('common.SPassword')" - prop="repassword" - > + <el-form-item :label="$t('common.SPassword')" prop="repassword"> <el-input type="password" v-model="codeForm.repassword" @@ -638,19 +567,11 @@ ></el-input> </el-form-item> <el-form-item> - <el-button - class="primary" - size="small" - @click="download('codeForm')" - >{{ $t("common.confirm") }} + <el-button class="primary" size="small" @click="download('codeForm')" + >{{ $t("common.confirm") }} </el-button> - <el-button - type="info" - size="small" - @click="closeDown('codeForm')" - >{{ - $t("common.cancel") - }} + <el-button type="info" size="small" @click="closeDown('codeForm')" + >{{ $t("common.cancel") }} </el-button> </el-form-item> </el-form> @@ -661,30 +582,17 @@ width="70%" > <div style="height: 65vh; width: 100%"> - <el-form - :inline="true" - :model="fromQueryMeta" - class="demo-form-inline" - > + <el-form :inline="true" :model="fromQueryMeta" class="demo-form-inline"> <el-form-item> - <el-input - size="small" - v-model="fromQueryMeta.name" - ></el-input> + <el-input size="small" v-model="fromQueryMeta.name"></el-input> </el-form-item> <el-form-item> - <el-button - type="primary" - size="small" - @click="setSearchMetaData()" - >鏌ヨ + <el-button type="primary" size="small" @click="setSearchMetaData()" + >鏌ヨ </el-button> - <el-button - type="info" - size="small" - @click="setRestMetaData()" - >閲嶇疆 + <el-button type="info" size="small" @click="setRestMetaData()" + >閲嶇疆 </el-button> </el-form-item> </el-form> @@ -740,12 +648,9 @@ :label="$t('dataManage.dataUpObj.tableName')" > <template slot-scope="scope"> - <a - class="scopeRowColor" - @click="detail(scope.row)" - >{{ - scope.row.tab - }}</a> + <a class="scopeRowColor" @click="detail(scope.row)">{{ + scope.row.tab + }}</a> </template> </el-table-column> <el-table-column @@ -759,10 +664,7 @@ :label="$t('dataManage.dataUpObj.describe')" /> </el-table> - <div - class="pagination_box" - style="margin-top: 15px" - > + <div class="pagination_box" style="margin-top: 15px"> <el-pagination @size-change="handleMetaSizeChange" @current-change="handMetaCurrentChange" @@ -782,7 +684,6 @@ width="70%" > <div style="height: 65vh; width: 100%"> - <el-table ref="filterTable" :data="metaDataTable1" @@ -835,12 +736,9 @@ :label="$t('dataManage.dataUpObj.tableName')" > <template slot-scope="scope"> - <a - class="scopeRowColor" - @click="detail(scope.row)" - >{{ - scope.row.tab - }}</a> + <a class="scopeRowColor" @click="detail(scope.row)">{{ + scope.row.tab + }}</a> </template> </el-table-column> <el-table-column @@ -854,9 +752,30 @@ :label="$t('dataManage.dataUpObj.describe')" /> </el-table> - </div> </el-dialog> + <el-dialog + custom-class="preview-dialog" + title="棰勮" + :append-to-body="false" + :visible.sync="dialog.dialogVisible" + width="70%" + :close-on-click-modal="false" + > + <div v-if="dialog.isPdf" class="pdfClass"> + <iframe + :src="dialog.src" + type="application/x-google-chrome-pdf" + width="100%" + height="100%" + > + </iframe> + </div> + <div v-if="dialog.isJpg" class="pdfClass"> + <img style="width: 100%; height: 100%" :src="dialog.src" alt="" /> + </div> + </el-dialog> + <iframe id="downFrame" src="" @@ -866,8 +785,8 @@ </template> <script> -import $ from "jquery"; -import { getToken } from "@/utils/auth"; +import $ from "jquery" +import { getToken } from "@/utils/auth" import { deleteMeta, insertMeta, @@ -882,10 +801,10 @@ selectdirTab, sign_getPublicKey, updateMeta, - meta_selectById -} from "../../api/api"; + meta_selectById, +} from "../../api/api" -import MyBread from "../../components/MyBread.vue"; +import MyBread from "../../components/MyBread.vue" export default { name: "metadataManage", @@ -893,22 +812,22 @@ data() { var repasswordValidator = (rule, value, callback) => { if (value === "") { - callback(new Error("璇峰啀娆¤緭鍏ュ瘑鐮�")); + callback(new Error("璇峰啀娆¤緭鍏ュ瘑鐮�")) } else if (value !== this.codeForm.password) { - callback(new Error("涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�!")); + callback(new Error("涓ゆ杈撳叆瀵嗙爜涓嶄竴鑷�!")) } else { - callback(); + callback() } - }; + } var passwordValidator = (rule, value, callback) => { var passwordreg = - /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![a-z0-9]+$)(?![a-z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![0-9\W!@#$%^&*`~()\\-_+=,.?;<>]+$)[a-zA-Z0-9\W!@#$%^&*`~()\\-_+=,.?;<>]{12,20}$/; + /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![a-z0-9]+$)(?![a-z\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![0-9\W!@#$%^&*`~()\\-_+=,.?;<>]+$)[a-zA-Z0-9\W!@#$%^&*`~()\\-_+=,.?;<>]{12,20}$/ if (!passwordreg.test(value)) { - callback(new Error("瀵嗙爜蹇呴』鐢辨暟瀛椼�佸瓧姣嶃�佺壒娈婂瓧绗︾粍鍚�,璇疯緭鍏�13-20浣�")); + callback(new Error("瀵嗙爜蹇呴』鐢辨暟瀛椼�佸瓧姣嶃�佺壒娈婂瓧绗︾粍鍚�,璇疯緭鍏�13-20浣�")) } else { - callback(); + callback() } - }; + } return { verOptions: [], defaultProps: { @@ -1007,276 +926,281 @@ metaDataTable: [], queryMetaFlag1: false, metaDataTable1: [], - }; + dialog: { + dialogVisible: false, + isPdf: false, + isJpg: false, + src: "", + }, + } }, created() { // this.getSelectDictTab(); - this.showPermsBtn(); - this.getQueryDepTree(); + this.showPermsBtn() + this.getQueryDepTree() - this.signGetPublicKey(); + this.signGetPublicKey() }, beforeDestroy() { - this.timer && clearTimeout(this.timer); - window.removeEventListener("resize", this.onResize); + this.timer && clearTimeout(this.timer) + window.removeEventListener("resize", this.onResize) }, mounted() { - window.addEventListener("resize", this.onResize); - this.calHeight(); + window.addEventListener("resize", this.onResize) + this.calHeight() }, methods: { //澶у皬鍊兼敼鍙� changeSizeFile(row, column, cellValue, index) { if (cellValue >= 1024) { - return parseFloat(cellValue / 1204).toFixed(3) + "GB"; + return parseFloat(cellValue / 1204).toFixed(3) + "GB" } else { - return cellValue + "MB"; + return cellValue + "MB" } }, setRestMetaData() { - this.fromQueryMeta.name = ""; - this.listMetaData.name = this.fromQueryMeta.name; - this.listMetaData.pageIndex = 1; - this.listMetaData.pageSize = 10; + this.fromQueryMeta.name = "" + this.listMetaData.name = this.fromQueryMeta.name + this.listMetaData.pageIndex = 1 + this.listMetaData.pageSize = 10 - this.startQueryMetaData(); + this.startQueryMetaData() }, setSearchMetaData() { - this.listMetaData.name = this.fromQueryMeta.name; - this.listMetaData.pageIndex = 1; - this.listMetaData.pageSize = 10; + this.listMetaData.name = this.fromQueryMeta.name + this.listMetaData.pageIndex = 1 + this.listMetaData.pageSize = 10 - this.startQueryMetaData(); + this.startQueryMetaData() }, //婧愭暟鎹〉闈㈠垏鎹� handleMetaSizeChange(val) { - this.listMetaData.pageIndex = 1; - this.listMetaData.pageSize = val; - this.startQueryMetaData(); + this.listMetaData.pageIndex = 1 + this.listMetaData.pageSize = val + this.startQueryMetaData() }, //婧愭暟鎹〉闈㈠垏鎹� handMetaCurrentChange(val) { - this.listMetaData.pageIndex = val; - this.startQueryMetaData(); + this.listMetaData.pageIndex = val + this.startQueryMetaData() }, //鍏冩暟鎹煡璇� async setMetaDataQuery(row) { - - this.fromQueryMeta.title = row.name; + this.fromQueryMeta.title = row.name this.listMetaData = { id: row.metaid, // name: "", // pageIndex: 1, // pageSize: 10, // count: 0, - }; - const data = await meta_selectById(this.listMetaData); + } + const data = await meta_selectById(this.listMetaData) if (data.code != 200) { - return; + return } - this.queryMetaFlag1 = true; - this.metaDataTable1 = [data.result]; + this.queryMetaFlag1 = true + this.metaDataTable1 = [data.result] // this.listMetaData.count = data.count; }, //婧愭暟鎹煡璇� setQueryMetaData(row) { - this.fromQueryMeta.title = row.name; + this.fromQueryMeta.title = row.name this.listMetaData = { metaid: row.id, name: "", pageIndex: 1, pageSize: 10, count: 0, - }; - this.startQueryMetaData(); - this.queryMetaFlag = true; + } + this.startQueryMetaData() + this.queryMetaFlag = true }, async startQueryMetaData() { - const data = await meta_selectPageAndCountByPid(this.listMetaData); + const data = await meta_selectPageAndCountByPid(this.listMetaData) if (data.code != 200) { - return; + return } - this.metaDataTable = data.result; - this.listMetaData.count = data.count; + this.metaDataTable = data.result + this.listMetaData.count = data.count }, onResize() { - this.timer && clearTimeout(this.timer); + this.timer && clearTimeout(this.timer) this.timer = setTimeout(() => { - this.calHeight(); - }, 500); + this.calHeight() + }, 500) }, calHeight() { this.$nextTick(() => { - const rect = this.$refs.container.getBoundingClientRect(); - this.tableHeight = `${rect.height + 97}px`; - this.styleVar["height"] = `calc(100% - ${rect.height + 28}px)`; - }); + const rect = this.$refs.container.getBoundingClientRect() + this.tableHeight = `${rect.height + 97}px` + this.styleVar["height"] = `calc(100% - ${rect.height + 28}px)` + }) }, async detail(res) { - var val = res.tab.split("."); + var val = res.tab.split(".") const data = await meta_selectFields({ ns: val[0], tab: val[1], - }); + }) if (data.code != 200) { - this.$message.error("瀛楁鍒楄〃璋冪敤澶辫触"); - return; + this.$message.error("瀛楁鍒楄〃璋冪敤澶辫触") + return } - this.dialogVisible = true; + this.dialogVisible = true - this.attributeData = data.result; + this.attributeData = data.result this.listLoader = { id: res.id, pageIndex: 1, pageSize: 10, - }; - this.getDataLoaderSelectDbData(); + } + this.getDataLoaderSelectDbData() }, async getDataLoaderSelectDbData() { - const data1 = await meta_selectByPageForUpload(this.listLoader); + const data1 = await meta_selectByPageForUpload(this.listLoader) if (data1.code != 200) { - this.$message.error("瀛楁鍒楄〃璋冪敤澶辫触"); - return; + this.$message.error("瀛楁鍒楄〃璋冪敤澶辫触") + return } - var option = data1.result; + var option = data1.result for (var i in option) { - option[i].dirid = option[i].dirName; - option[i].depid = option[i].depName; - option[i].createuser = option[i].createName; - option[i].updateuser = option[i].updateName; - option[i].verid = option[i].verName; + option[i].dirid = option[i].dirName + option[i].depid = option[i].depName + option[i].createuser = option[i].createName + option[i].updateuser = option[i].updateName + option[i].verid = option[i].verName if (option[i].createtime != null) { - option[i].createtime = this.setInfoBoxTime(option[i].createtime); + option[i].createtime = this.setInfoBoxTime(option[i].createtime) } if (option[i].updatetime != null) { - option[i].updatetime = this.setInfoBoxTime(option[i].updatetime); + option[i].updatetime = this.setInfoBoxTime(option[i].updatetime) } } - this.dbTableData = data1.result; - this.count1 = data1.count; + this.dbTableData = data1.result + this.count1 = data1.count }, handleLoaderSizeChange(val) { - this.listLoader.pageIndex = 1; - this.listLoader.pageSize = val; - this.getDataLoaderSelectDbData(); + this.listLoader.pageIndex = 1 + this.listLoader.pageSize = val + this.getDataLoaderSelectDbData() }, handleLoaderCurrentChange(val) { - this.listLoader.pageIndex = val; - this.getDataLoaderSelectDbData(); + this.listLoader.pageIndex = val + this.getDataLoaderSelectDbData() }, async signGetPublicKey() { - const res = await sign_getPublicKey(); + const res = await sign_getPublicKey() if (res && res.code == 200) { - window.encrypt = new JSEncrypt(); - encrypt.setPublicKey(res.result); + window.encrypt = new JSEncrypt() + encrypt.setPublicKey(res.result) } }, //鍗曚綅鍒楄〃鑾峰彇 async getQueryDepTree() { - const res = await selectdepTab(); + const res = await selectdepTab() if (res.code != 200) { - this.$message.error("鍗曚綅鍒楄〃鑾峰彇澶辫触"); - return; + this.$message.error("鍗曚綅鍒楄〃鑾峰彇澶辫触") + return } - this.companyOption1 = this.treeData(res.result); - this.queryForm.depcode = this.companyOption1[0].code; - this.queryForm.depName = this.companyOption1[0].name; - this.getQueryDirTree(); + this.companyOption1 = this.treeData(res.result) + this.queryForm.depcode = this.companyOption1[0].code + this.queryForm.depName = this.companyOption1[0].name + this.getQueryDirTree() }, async getQueryDirTree() { - const res = await selectdirTab(); + const res = await selectdirTab() if (res.code != 200) { - this.$message.error("鍗曚綅鍒楄〃鑾峰彇澶辫触"); - return; + this.$message.error("鍗曚綅鍒楄〃鑾峰彇澶辫触") + return } - this.companyOption = this.treeData(res.result); - this.queryForm.dirid = this.companyOption[0].id; - this.queryForm.dircode = this.companyOption[0].code; - this.queryForm.dirName = this.companyOption[0].name; - this.getQueryVerList(); + this.companyOption = this.treeData(res.result) + this.queryForm.dirid = this.companyOption[0].id + this.queryForm.dircode = this.companyOption[0].code + this.queryForm.dirName = this.companyOption[0].name + this.getQueryVerList() }, async getQueryVerList() { - const data = await meta_selectVerByDirid({ dirid: this.queryForm.dirid }); + const data = await meta_selectVerByDirid({ dirid: this.queryForm.dirid }) if (data.code != 200) { - this.$message.error("鐗堟湰鍒楄〃鑾峰彇澶辫触"); - return; + this.$message.error("鐗堟湰鍒楄〃鑾峰彇澶辫触") + return } - this.verOptions = data.result; - this.queryForm.verid = data.result[0].id; - this.getMetaData(); + this.verOptions = data.result + this.queryForm.verid = data.result[0].id + this.getMetaData() }, verHandleChange(val) { - this.queryForm.verid = val; - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.getMetaData(); + this.queryForm.verid = val + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.getMetaData() }, handleChange(data, node, nodeData) { - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.queryForm.dircode = data.code; - this.queryForm.dirid = data.id; - this.queryForm.dirName = data.name; - this.getQueryVerList(); + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.queryForm.dircode = data.code + this.queryForm.dirid = data.id + this.queryForm.dirName = data.name + this.getQueryVerList() }, handleChange1(data, node, nodeData) { - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.queryForm.depcode = data.code; - this.queryForm.depName = data.name; - this.getMetaData(); + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.queryForm.depcode = data.code + this.queryForm.depName = data.name + this.getMetaData() }, handleChange2(data, node, nodeData) { - this.editForm.depid = data.id; - this.editForm.depcode = data.code; - this.editForm.depName = data.name; + this.editForm.depid = data.id + this.editForm.depcode = data.code + this.editForm.depName = data.name }, handleChange3(data, node, nodeData) { - this.editForm.dirid = data.id; - this.editForm.dircode = data.code; - this.editForm.dirName = data.name; + this.editForm.dirid = data.id + this.editForm.dircode = data.code + this.editForm.dirName = data.name }, //鏍煎紡鍖栧垪琛� formatData(row, column) { - let data = row[column.property]; + let data = row[column.property] if (data == null) { - return data; + return data } - return this.format(data); + return this.format(data) }, setInfoBoxTime(res) { if (res == null) { - return res; + return res } - return this.format(res); + return this.format(res) }, setInfoBoxSize(res) { if (res >= 1024) { - return parseFloat(res / 1024).toFixed(3) + " GB"; + return parseFloat(res / 1024).toFixed(3) + " GB" } else { - return res + " MB"; + return res + " MB" } }, //鏍煎紡鍖栨椂闂� format(shijianchuo) { //shijianchuo鏄暣鏁帮紝鍚﹀垯瑕乸arseInt杞崲 - var time = new Date(shijianchuo); - var y = time.getFullYear(); - var m = time.getMonth() + 1; - var d = time.getDate(); - var h = time.getHours(); - var mm = time.getMinutes(); - var s = time.getSeconds(); + var time = new Date(shijianchuo) + var y = time.getFullYear() + var m = time.getMonth() + 1 + var d = time.getDate() + var h = time.getHours() + var mm = time.getMinutes() + var s = time.getSeconds() return ( y + "-" + @@ -1289,47 +1213,47 @@ mm + ":" + s - ); + ) }, //鏍煎紡鍖栨椂闂� add0(m) { - return m < 10 ? "0" + m : m; + return m < 10 ? "0" + m : m }, //鍗曚綅杞崲 stateFormatSizes(row, column) { if (row.sizes >= 1024) { - const val = parseFloat(row.sizes / 1024).toFixed(3); - return val + " GB"; + const val = parseFloat(row.sizes / 1024).toFixed(3) + return val + " GB" } else { - return row.sizes + " MB"; + return row.sizes + " MB" } }, //鐩綍鏍戣幏鍙� async getSelectDictTab() { - const res = await selectdirTab(); + const res = await selectdirTab() if (res.code != 200) { - this.$message.error("鍒楄〃璋冪敤澶辫触"); + this.$message.error("鍒楄〃璋冪敤澶辫触") } - this.optionCount = this.treeData(res.result); - this.dirComPanyOption = this.treeData(res.result); - this.listData.depcode = this.optionCount[0].code; + this.optionCount = this.treeData(res.result) + this.dirComPanyOption = this.treeData(res.result) + this.listData.depcode = this.optionCount[0].code }, handleNodeClick(data) { - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.listData.dirid = data.id; - this.getMetaData(); + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.listData.dirid = data.id + this.getMetaData() }, getTableDesc(res) { - this.activeName = res.tab; + this.activeName = res.tab }, //鏄剧ず鏉冮檺鎸夐挳 showPermsBtn() { - let currentPerms = this.$store.state.currentPerms; - let permsEntity = this.$store.state.permsEntity; + let currentPerms = this.$store.state.currentPerms + let permsEntity = this.$store.state.permsEntity permsEntity - .filter((item) => item.perms == currentPerms) - .map((item) => (this.btnStatus[item.tag.substr(1)] = true)); + .filter(item => item.perms == currentPerms) + .map(item => (this.btnStatus[item.tag.substr(1)] = true)) }, // ShowWindowFly(res) { // console.log(res); @@ -1365,83 +1289,83 @@ // }, // 璇锋眰鏁版嵁鍐呭 getMetaData() { - this.listData.depcode = this.queryForm.depcode; - this.listData.dircode = this.queryForm.dircode; + this.listData.depcode = this.queryForm.depcode + this.listData.dircode = this.queryForm.dircode - this.listData.verid = this.queryForm.verid; + this.listData.verid = this.queryForm.verid // this.listData.dirid = 57 - select_meta_ByPageAndCount(this.listData).then((res) => { - this.tableData = res.result; - this.count = res.count; - }); + select_meta_ByPageAndCount(this.listData).then(res => { + this.tableData = res.result + this.count = res.count + }) }, // 鏌ヨ queryInfo() { - this.listData.name = this.queryForm.name.trim(); - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.getMetaData(); + this.listData.name = this.queryForm.name.trim() + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.getMetaData() }, // 閲嶇疆鏌ヨ resetInfo(formName) { - this.$refs[formName].resetFields(); - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.listData.name = null; - this.queryForm.dirid = this.companyOption[0].id; - this.queryForm.depid = this.companyOption1[0].id; - this.queryForm.dircode = this.companyOption[0].code; - this.queryForm.depcode = this.companyOption1[0].code; - this.queryForm.dirName = this.companyOption[0].name; - this.queryForm.depName = this.companyOption1[0].name; - this.getQueryVerList(); - this.getMetaData(); + this.$refs[formName].resetFields() + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.listData.name = null + this.queryForm.dirid = this.companyOption[0].id + this.queryForm.depid = this.companyOption1[0].id + this.queryForm.dircode = this.companyOption[0].code + this.queryForm.depcode = this.companyOption1[0].code + this.queryForm.dirName = this.companyOption[0].name + this.queryForm.depName = this.companyOption1[0].name + this.getQueryVerList() + this.getMetaData() }, //鏂板鎸夐挳 showAddDialog() { - this.behavior = "鏂板鐢ㄦ埛"; - this.editForm = {}; - this.dialogFormVisible = true; + this.behavior = "鏂板鐢ㄦ埛" + this.editForm = {} + this.dialogFormVisible = true }, cancelAdd(formName) { - this.editForm = {}; - this.$refs[formName].resetFields(); + this.editForm = {} + this.$refs[formName].resetFields() }, sendAdd(formName) { - this.$refs[formName].validate((valid) => { + this.$refs[formName].validate(valid => { if (valid) { - this.fullscreenLoading = true; + this.fullscreenLoading = true insertMeta(this.editForm) - .then((res) => { + .then(res => { setTimeout(() => { - this.fullscreenLoading = false; + this.fullscreenLoading = false if (res.code == 200) { - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.getMetaData(); + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.getMetaData() this.$message({ message: "娣诲姞鎴愬姛", type: "success", - }); - this.editForm = {}; - this.dialogFormVisible = false; + }) + this.editForm = {} + this.dialogFormVisible = false } - }, 500); + }, 500) }) - .catch((res) => { - alert("淇敼澶辫触锛岃閲嶈瘯锛�"); - this.fullscreenLoading = false; - }); + .catch(res => { + alert("淇敼澶辫触锛岃閲嶈瘯锛�") + this.fullscreenLoading = false + }) } else { - console.log("error submit!!"); - return false; + console.log("error submit!!") + return false } - }); + }) }, // 鑾峰彇澶氶�夐�変腑鐨勫璞� handleSelectionChange(val) { - this.multipleSelection = val; + this.multipleSelection = val }, // 鍒犻櫎澶氭潯 deleteMetaInfo() { @@ -1451,63 +1375,62 @@ type: "warning", }) .then(() => { - var std = []; + var std = [] for (var i in this.multipleSelection) { - std.push(this.multipleSelection[i].id); + std.push(this.multipleSelection[i].id) } - deleteMeta({ ids: std.toString() }).then((res) => { + deleteMeta({ ids: std.toString() }).then(res => { if (res.code == 200) { this.$message({ type: "success", message: "鍒犻櫎鎴愬姛!", - }); - this.multipleSelection = []; - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.getMetaData(); + }) + this.multipleSelection = [] + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.getMetaData() } else { - this.$message.error("鍒犻櫎澶辫触"); - this.multipleSelection = []; + this.$message.error("鍒犻櫎澶辫触") + this.multipleSelection = [] } - }); + }) }) .catch(() => { - this.$message("宸插彇娑堝垹闄�"); - }); + this.$message("宸插彇娑堝垹闄�") + }) }, // 鏌ョ湅鐣岄潰 showDetail(row) { // console.log(index, row); - this.showinfoBox = true; - this.itemdetail = row; + this.showinfoBox = true + this.itemdetail = row }, // 鍏抽棴鏌ョ湅 closeDetial() { - this.showinfoBox = false; - this.itemdetail = {}; + this.showinfoBox = false + this.itemdetail = {} }, // 淇敼鐣岄潰 editInfo(row) { // console.log(row); - delete row.createTime; - delete row.createUser; - delete row.updateUser; - delete row.updateUser; - this.initialForm = JSON.stringify(row); //澶囦唤 - this.behavior = "淇敼淇℃伅"; - this.editForm = JSON.parse(JSON.stringify(row)); - this.dialogFormVisible = true; - this.getSelectDictTab(); + delete row.createTime + delete row.createUser + delete row.updateUser + delete row.updateUser + this.initialForm = JSON.stringify(row) //澶囦唤 + this.behavior = "淇敼淇℃伅" + this.editForm = JSON.parse(JSON.stringify(row)) + this.dialogFormVisible = true + this.getSelectDictTab() }, handleClose(done) { this.$confirm("纭鍏抽棴锛�") - .then((_) => { - this.editForm = {}; - done(); + .then(_ => { + this.editForm = {} + done() }) - .catch((_) => { - }); + .catch(_ => {}) }, // 鎻愪氦淇敼 @@ -1518,61 +1441,61 @@ type: "warning", }) .then(() => { - this.dialogFormVisible = false; - updateMeta(this.editForm).then((res) => { + this.dialogFormVisible = false + updateMeta(this.editForm).then(res => { setTimeout(() => { - this.fullscreenLoading = false; + this.fullscreenLoading = false if (res.code == 200) { - this.listData.pageSize = 10; - this.listData.pageIndex = 1; - this.getMetaData(); + this.listData.pageSize = 10 + this.listData.pageIndex = 1 + this.getMetaData() this.$message({ message: "淇敼鎴愬姛", type: "success", - }); - this.editForm = {}; - this.dialogFormVisible = false; + }) + this.editForm = {} + this.dialogFormVisible = false } - }, 500); - }); + }, 500) + }) }) .catch(() => { - alert("淇敼澶辫触锛岃閲嶈瘯锛�"); - this.fullscreenLoading = false; - }); + alert("淇敼澶辫触锛岃閲嶈瘯锛�") + this.fullscreenLoading = false + }) }, cancelEdit() { this.$nextTick(() => { - this.editForm = JSON.parse(this.initialForm); - }); + this.editForm = JSON.parse(this.initialForm) + }) }, async download() { - var std = []; + var std = [] for (var i in this.multipleSelection) { - std.push(this.multipleSelection[i].id); + std.push(this.multipleSelection[i].id) } var obj = { pwd: encrypt.encrypt(this.codeForm.repassword), ids: std, - }; - const res = await meta_downloadReq(JSON.stringify(obj)); + } + const res = await meta_downloadReq(JSON.stringify(obj)) if (res.code != 200) { - this.$message.error("涓嬭浇璇锋眰澶辫触"); - return; + this.$message.error("涓嬭浇璇锋眰澶辫触") + return } var downObj = { guid: res.result, pwd: encodeURIComponent(encrypt.encrypt(this.codeForm.repassword)), - }; - const data = await meta_selectDownloadFile(downObj); + } + const data = await meta_selectDownloadFile(downObj) if (data.code != 200) { - this.$message.error("涓嬭浇璇锋眰澶辫触"); - return; + this.$message.error("涓嬭浇璇锋眰澶辫触") + return } - var token = getToken(); + var token = getToken() var url = BASE_URL + "/meta/downloadFile?token=" + @@ -1580,45 +1503,86 @@ "&guid=" + res.result + "&pwd=" + - encodeURIComponent(encrypt.encrypt(this.codeForm.repassword)); + encodeURIComponent(encrypt.encrypt(this.codeForm.repassword)) - $("#downFrame").attr("src", url).click(); - this.closeDown(); + $("#downFrame").attr("src", url).click() + this.closeDown() }, closeDown() { - this.showCodeBox = false; - this.codeForm.password = ""; - this.codeForm.repassword = ""; + this.showCodeBox = false + this.codeForm.password = "" + this.codeForm.repassword = "" }, downFormData() { if (this.multipleSelection.length == 0) { - alert("璇峰厛閫夋嫨瑕佷笅杞界殑鏂囦欢"); - return; + alert("璇峰厛閫夋嫨瑕佷笅杞界殑鏂囦欢") + return } - this.showCodeBox = true; + this.showCodeBox = true }, handleSizeChange(val) { - this.listData.pageSize = val; - this.listData.pageIndex = 1; - this.getMetaData(); + this.listData.pageSize = val + this.listData.pageIndex = 1 + this.getMetaData() }, handleCurrentChange(val) { - this.listData.pageIndex = val; - this.getMetaData(); + this.listData.pageIndex = val + this.getMetaData() }, //鏍戝垪琛ㄧ敓鎴� treeData(source) { - let cloneData = JSON.parse(JSON.stringify(source)); // 瀵规簮鏁版嵁娣卞害鍏嬮殕 - return cloneData.filter((father) => { + let cloneData = JSON.parse(JSON.stringify(source)) // 瀵规簮鏁版嵁娣卞害鍏嬮殕 + return cloneData.filter(father => { // 寰幆鎵�鏈夐」 - let branchArr = cloneData.filter((child) => father.id == child.pid); // 瀵规瘮ID锛屽垎鍒笂涓嬬骇鑿滃崟锛屽苟杩斿洖鏁版嵁 - branchArr.length > 0 ? (father.children = branchArr) : ""; // 缁欑埗绾ф坊鍔犱竴涓猚hildren灞炴�э紝骞惰祴鍊� - return father.pid == 0; // 杩斿洖涓�绾ц彍鍗� - }); + let branchArr = cloneData.filter(child => father.id == child.pid) // 瀵规瘮ID锛屽垎鍒笂涓嬬骇鑿滃崟锛屽苟杩斿洖鏁版嵁 + branchArr.length > 0 ? (father.children = branchArr) : "" // 缁欑埗绾ф坊鍔犱竴涓猚hildren灞炴�э紝骞惰祴鍊� + return father.pid == 0 // 杩斿洖涓�绾ц彍鍗� + }) + }, + showPreview(row) { + let name = row.name + if (!name) return false + return ( + name.indexOf("pdf") != -1 || + name.indexOf("jpg") != -1 || + name.indexOf("gif") != -1 || + name.indexOf("png") != -1 || + name.indexOf("jpeg") != -1 + ) + }, + handlePreview(row) { + let name = row.name + this.refreshAttatchDetail() + + if (name.indexOf(".pdf") != -1) { + this.dialog.isPdf = true + } else if ( + name.indexOf(".jpg") != -1 || + name.indexOf(".gif") != -1 || + name.indexOf(".png") != -1 || + name.indexOf(".jpeg") != -1 + ) { + this.dialog.isJpg = true + } + this.dialog.dialogVisible = true + this.dialog.isPdf = true + var url = + BASE_URL + + "/inquiry/downloadForView?guid=" + + row.guid + + "&token=" + + getToken() + this.dialog.src = url + }, + refreshAttatchDetail() { + this.dialog.src = "" + this.dialog.dialogVisible = false + this.dialog.isPdf = false + this.dialog.isJpg = false }, }, -}; +} </script> <style lang="less" scoped> //@import url(); 寮曞叆鍏叡css绫� @@ -1657,5 +1621,12 @@ border-radius: 10px; } + .preview-dialog { + .pdfClass { + height: 70vh; + width: 100%; + position: relative; + } + } } </style> -- Gitblit v1.9.3