jmal 3dd67a1e1c refactor(store): 重构应用状态管理
- 将 app 和 user 模块的状态持久化从 sessionStorage 改为 localStorage
- 移除 auth.js 中的 Cookie 操作,改为使用 Vuex store
- 更新 getters、actions 和 mutations 以适应新的状态管理方式
-调整 logo、path 等工具类中的数据存储逻辑
- 修改请求拦截器中的 token 设置方式
2025-05-22 16:23:11 +08:00

224 lines
8.3 KiB
Vue

<template>
<div>
<el-popover
v-if="hasHistoryVersion"
style="margin-right: 15px"
:visible-arrow="false"
:popper-class="(lightTheme ? 'file-history-popover' : 'dark-file-history-popover') + ' history-popover'"
placement="bottom"
@show="popoverShow"
@hide="popoverHide"
v-model="historyListPopoverVisible"
trigger="manual">
<el-table :data="fileHistoryList" height="300" row-class-name="file-history-row" :class="lightTheme? 'file-history-list' : 'dark-file-history-list'">
<el-table-column show-overflow-tooltip width="200" property="metadata.filename" label="文件名"></el-table-column>
<el-table-column width="190" property="metadata.time" label="版本日期"></el-table-column>
<el-table-column label="操作" width="210">
<template slot-scope="scope">
<div style="display: flex">
<el-button round
size="mini"
:class="lightTheme?'':'dark-button'"
@click="viewHistoryFile(scope.row, true, false)" :loading="historyOperationLoading">预览</el-button>
<el-popover
placement="bottom"
width="310"
:popper-class="(lightTheme ? 'file-history-popover' : 'dark-file-history-popover') + ' delete-' + scope.row.id"
style="margin: 0 10px;"
:visible-arrow="false"
trigger="click">
<p class="el-popconfirm__main">
<i class="el-popconfirm__icon el-icon-question" style="color: rgb(255, 153, 0);"></i>
{{'确定要恢复到'+ scope.row.metadata.time +'吗?当前内容将被覆盖!'}}
</p>
<div style="text-align: right; margin: 0">
<el-button round size="mini" type="text" @click="cancelRecovery(scope.row.id)">取消</el-button>
<el-button round type="primary" size="mini" @click="confirmRecoveryHistoryFile(scope.row)">确定</el-button>
</div>
<el-button round slot="reference" size="mini" :id="'recoveryVersionBtn-'+scope.row.id" type="warning" :loading="historyOperationLoading">恢复</el-button>
</el-popover>
<el-popover
placement="bottom"
width="310"
:popper-class="(lightTheme ? 'file-history-popover' : 'dark-file-history-popover') + ' delete-' + scope.row.id"
:visible-arrow="false"
trigger="click">
<p class="el-popconfirm__main">
<i class="el-popconfirm__icon el-icon-question" style="color: rgb(255, 153, 0);"></i>
{{'确定要删除'+ scope.row.metadata.time +'吗?这将永久删除该历史版本!'}}
</p>
<div style="text-align: right; margin: 0">
<el-button round size="mini" type="text" @click="cancelDelete(scope.row.id)">取消</el-button>
<el-button round type="primary" size="mini" @click="confirmDeleteHistoryFile(scope.row.id)">确定</el-button>
</div>
<el-button round slot="reference" size="mini" :id="'deleteVersionBtn-'+scope.row.id" type="danger" :loading="historyOperationLoading">删除</el-button>
</el-popover>
</div>
</template>
</el-table-column>
</el-table>
<el-button round slot="reference" :style="versionBtnStyle" ref="versionBtn" :size="buttonSize" :class="lightTheme?' history-version-btn':'dark-button history-version-btn'" @click="showOrHidePopover">历史版本</el-button>
</el-popover>
</div>
</template>
<script>
import historyApi from "@/api/file-history"
export default {
name: "history-popover",
props: {
hasHistoryVersion: {
type: Object,
default: function () {
return {metadata: {}}
}
},
lightTheme: {
type: Boolean,
default: true
},
historyListPopoverVisible: {
type: Boolean,
default: false
},
historyOperationLoading: {
type: Boolean,
default: false
},
saved: {
type: Boolean,
default: true
},
buttonSize: {
type: String,
default: 'mini'
},
transparent: {
type: Boolean,
default: false
}
},
computed: {
versionBtnStyle() {
if (this.transparent) {
return 'background: #00000000;border: 0;'
} else {
return ''
}
}
},
data() {
return {
fileHistoryList: [],
recoveryHistoryListenerMap: new Map(),
deleteHistoryListenerMap: new Map(),
historyPageIndex: 1,
historyPageSize: 50
}
},
watch: {
historyListPopoverVisible(value) {
if (value) {
document.getElementById('app').addEventListener('click', this.onGlobalClick)
} else {
// destroy elementListeners
document.getElementById('app').removeEventListener('click', this.onGlobalClick)
}
},
},
methods: {
loadHistoryList(id) {
if (!this.$store.state.user.token || !this.$store.state.user.name) {
return
}
historyApi.fileHistoryList({fileId: id, username: this.$store.state.user.name, pageIndex: this.historyPageIndex, pageSize: this.historyPageSize}).then((res) => {
if (res.count && res.count > 0) {
this.fileHistoryList = res.data
this.$emit('update:hasHistoryVersion', true)
} else {
this.$emit('update:hasHistoryVersion', false)
}
})
},
loadHistoryPathList(pathname) {
if (!this.$store.getters.token) {
return
}
historyApi.fileHistoryPathList({path: encodeURI(pathname), username: this.$store.state.user.name, pageIndex: this.historyPageIndex, pageSize: this.historyPageSize}).then((res) => {
this.fileHistoryList = res.data
this.$emit('loadHistoryPathListSuccess', {res: res, pathname: pathname})
})
},
onGlobalClick(event) {
let eventClass = event.target.getAttribute('class') || event.target.parentElement.getAttribute('class')
if (eventClass && eventClass.indexOf('history-version-btn') > -1) {
return
}
if (this.historyListPopoverVisible) {
this.$emit('update:historyListPopoverVisible', false)
}
if (event.target.getAttribute("data-tab") === "file") {
setTimeout(() => {
let parentDoc = document.querySelector('.component-only-office')
let doc = parentDoc.getElementsByTagName('iframe')[0].contentWindow.document
doc.getElementById('fm-btn-history').style.display = 'none'
})
}
},
popoverShow() {
this.$emit('update:historyListPopoverVisible', true)
},
showOrHidePopover() {
if (this.historyListPopoverVisible) {
this.$emit('update:historyListPopoverVisible', false)
} else {
this.$emit('update:historyListPopoverVisible', true)
}
},
popoverHide() {
this.$emit('update:historyListPopoverVisible', false)
},
viewHistoryFile(historyInfo, diff, recovery) {
this.$emit('viewHistoryFile', {historyInfo: historyInfo, diff: diff, recovery: recovery})
},
cancelDelete(id) {
document.getElementById('deleteVersionBtn-'+id).click()
},
cancelRecovery(id) {
document.getElementById('recoveryVersionBtn-'+id).click()
},
confirmRecoveryHistoryFile(historyInfo) {
if (!this.saved) {
this.$message({type: 'info', message: "请先保存当前修改的内容"})
return
}
this.cancelRecovery(historyInfo.id)
this.$emit('update:historyOperationLoading', true)
historyApi.recoveryHistory({id: historyInfo.id}).then((res) => {
this.$emit('recoverySuccess', {historyInfo: historyInfo, result: res})
})
},
confirmDeleteHistoryFile(id) {
this.cancelDelete(id)
this.$emit('update:historyOperationLoading', true)
historyApi.deleteHistory({id: id}).then(() => {
this.$emit('update:historyOperationLoading', false)
this.$message({message: '删除成功',type: 'success'})
let deleteIndex = this.fileHistoryList.findIndex(fileHistory => fileHistory.id === id)
this.fileHistoryList.splice(deleteIndex, 1)
if (this.fileHistoryList.length < 1) {
this.$emit('update:hasHistoryVersion', false)
}
})
}
}
}
</script>
<style scoped>
</style>