mirror of
https://github.com/jumpserver/lina.git
synced 2025-09-23 12:07:38 +00:00
perf: 修改 activity
This commit is contained in:
69
src/components/ResourceActivity/index.vue
Normal file
69
src/components/ResourceActivity/index.vue
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<template>
|
||||||
|
<el-row :gutter="20">
|
||||||
|
<el-col :md="12" :sm="24">
|
||||||
|
<IBox :title="title" class="block" v-bind="$attrs">
|
||||||
|
<el-timeline>
|
||||||
|
<el-timeline-item
|
||||||
|
v-for="(activity, index) in activities"
|
||||||
|
:key="index"
|
||||||
|
:size="activity.size"
|
||||||
|
:timestamp="activity.timestamp"
|
||||||
|
:type="activity.type"
|
||||||
|
placement="bottom"
|
||||||
|
>
|
||||||
|
{{ activity.content }}
|
||||||
|
</el-timeline-item>
|
||||||
|
</el-timeline>
|
||||||
|
<div v-if="activities.length < 1">
|
||||||
|
{{ this.$t('common.NoContent') }}
|
||||||
|
</div>
|
||||||
|
</IBox>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import IBox from '@/components/IBox'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AccountActivity',
|
||||||
|
components: {
|
||||||
|
IBox
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
object: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
activityUrl: `/api/v1/audits/activities/?resource_id=${this.object.id}`,
|
||||||
|
title: `${this.$t('common.Activity')} - ${this.$t('common.Last30')}`,
|
||||||
|
activities: [
|
||||||
|
{
|
||||||
|
content: this.$t('common.Now'),
|
||||||
|
timestamp: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
|
||||||
|
type: 'primary'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getActivities()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getActivities() {
|
||||||
|
this.$axios.get(this.activityUrl).then(res => {
|
||||||
|
for (const i in res) {
|
||||||
|
this.activities.push(res[i])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
@@ -1,57 +0,0 @@
|
|||||||
<template>
|
|
||||||
<IBox :title="title" v-bind="$attrs" class="block">
|
|
||||||
<el-timeline>
|
|
||||||
<el-timeline-item
|
|
||||||
v-for="(activity, index) in activities"
|
|
||||||
:key="index"
|
|
||||||
:icon="activity.icon"
|
|
||||||
:color="activity.color"
|
|
||||||
:size="activity.size"
|
|
||||||
:timestamp="activity.timestamp"
|
|
||||||
type="primary"
|
|
||||||
placement="top"
|
|
||||||
>
|
|
||||||
{{ activity.content }}
|
|
||||||
</el-timeline-item>
|
|
||||||
</el-timeline>
|
|
||||||
<div v-if="activities.length < 1">
|
|
||||||
{{ this.$t('common.NoContent') }}
|
|
||||||
</div>
|
|
||||||
</IBox>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import IBox from '@/components/IBox'
|
|
||||||
export default {
|
|
||||||
name: 'TimelineCard',
|
|
||||||
components: {
|
|
||||||
IBox
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
title: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
activities: {
|
|
||||||
type: Array,
|
|
||||||
default: () => []
|
|
||||||
},
|
|
||||||
url: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
if (this.url) {
|
|
||||||
this.$axios.get(this.url).then(res => {
|
|
||||||
for (const i in res) {
|
|
||||||
this.activities.push(res[i])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
</style>
|
|
@@ -28,3 +28,4 @@ export { default as AssetRelationCard } from './AssetRelationCard'
|
|||||||
export { default as UserConfirmDialog } from './UserConfirmDialog'
|
export { default as UserConfirmDialog } from './UserConfirmDialog'
|
||||||
export { default as Announcement } from './Announcement'
|
export { default as Announcement } from './Announcement'
|
||||||
export { default as CronTab } from './CronTab'
|
export { default as CronTab } from './CronTab'
|
||||||
|
export { default as ResourceActivity } from './ResourceActivity'
|
||||||
|
@@ -322,6 +322,7 @@
|
|||||||
"ReLoginErr": "Login time has exceeded 5 minutes, please login again"
|
"ReLoginErr": "Login time has exceeded 5 minutes, please login again"
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
|
"Now": "Now",
|
||||||
"Activity": "Activity",
|
"Activity": "Activity",
|
||||||
"Last30": "Last 30 times",
|
"Last30": "Last 30 times",
|
||||||
"SpecificInfo": "Specific",
|
"SpecificInfo": "Specific",
|
||||||
|
@@ -325,6 +325,7 @@
|
|||||||
"ReLoginErr": "ログイン時間が 5 分を超えました。もう一度ログインしてください"
|
"ReLoginErr": "ログイン時間が 5 分を超えました。もう一度ログインしてください"
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
|
"Now": "今",
|
||||||
"Activity": "イベント",
|
"Activity": "イベント",
|
||||||
"Last30": "最近 30 回です",
|
"Last30": "最近 30 回です",
|
||||||
"SpecificInfo": "特別情報",
|
"SpecificInfo": "特別情報",
|
||||||
|
@@ -424,10 +424,11 @@
|
|||||||
"ReLoginErr": "登录时长已超过 5 分钟,请重新登录"
|
"ReLoginErr": "登录时长已超过 5 分钟,请重新登录"
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
|
"Now": "现在",
|
||||||
"SpecificInfo": "特殊信息",
|
"SpecificInfo": "特殊信息",
|
||||||
"CollectionSucceed": "收藏成功",
|
"CollectionSucceed": "收藏成功",
|
||||||
"CancelCollection": "取消收藏",
|
"CancelCollection": "取消收藏",
|
||||||
"Activity": "活动",
|
"Activity": "活动记录",
|
||||||
"Last30": "最近 30 次",
|
"Last30": "最近 30 次",
|
||||||
"Version": "版本",
|
"Version": "版本",
|
||||||
"Publish": "发布",
|
"Publish": "发布",
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<TabPage v-if="!loading" :submenu="submenu" :active-menu.sync="iActiveMenu" @tab-click="handleTabClick">
|
<TabPage v-if="!loading" :active-menu.sync="iActiveMenu" :submenu="iSubmenu" @tab-click="handleTabClick">
|
||||||
<template #title>
|
<template #title>
|
||||||
<el-button class="go-back" icon="el-icon-back" @click="handleGoBack" />
|
<el-button class="go-back" icon="el-icon-back" @click="handleGoBack" />
|
||||||
<span style="padding-left: 10px">{{ iTitle }}</span>
|
<span style="padding-left: 10px">{{ iTitle }}</span>
|
||||||
@@ -19,7 +19,11 @@ import TabPage from '../TabPage'
|
|||||||
import { flashErrorMsg } from '@/utils/request'
|
import { flashErrorMsg } from '@/utils/request'
|
||||||
import { getApiPath } from '@/utils/common'
|
import { getApiPath } from '@/utils/common'
|
||||||
import ActionsGroup from '@/components/ActionsGroup'
|
import ActionsGroup from '@/components/ActionsGroup'
|
||||||
|
import ResourceActivity from '@/components/ResourceActivity/index.vue'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
Vue.component('ResourceActivity', ResourceActivity)
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'GenericDetailPage',
|
name: 'GenericDetailPage',
|
||||||
@@ -54,6 +58,10 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: () => ''
|
default: () => ''
|
||||||
},
|
},
|
||||||
|
hasActivity: {
|
||||||
|
type: Boolean,
|
||||||
|
default: () => true
|
||||||
|
},
|
||||||
hasRightSide: {
|
hasRightSide: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
@@ -101,14 +109,18 @@ export default {
|
|||||||
const defaultActions = {
|
const defaultActions = {
|
||||||
// Delete button
|
// Delete button
|
||||||
canDelete: vm.$hasCurrentResAction('delete'),
|
canDelete: vm.$hasCurrentResAction('delete'),
|
||||||
deleteCallback: function(item) { vm.defaultDelete(item) },
|
deleteCallback: function(item) {
|
||||||
|
vm.defaultDelete(item)
|
||||||
|
},
|
||||||
deleteApiUrl: detailApiUrl,
|
deleteApiUrl: detailApiUrl,
|
||||||
deleteSuccessRoute: this.$route.name.replace('Detail', 'List'),
|
deleteSuccessRoute: this.$route.name.replace('Detail', 'List'),
|
||||||
// Update button
|
// Update button
|
||||||
canUpdate: () => {
|
canUpdate: () => {
|
||||||
return !vm.currentOrgIsRoot && vm.$hasCurrentResAction('change')
|
return !vm.currentOrgIsRoot && vm.$hasCurrentResAction('change')
|
||||||
},
|
},
|
||||||
updateCallback: function(item) { this.defaultUpdate(item) },
|
updateCallback: function(item) {
|
||||||
|
this.defaultUpdate(item)
|
||||||
|
},
|
||||||
updateRoute: this.$route.name.replace('Detail', 'Update')
|
updateRoute: this.$route.name.replace('Detail', 'Update')
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
@@ -150,6 +162,17 @@ export default {
|
|||||||
set(item) {
|
set(item) {
|
||||||
this.$emit('update:activeMenu', item)
|
this.$emit('update:activeMenu', item)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
iSubmenu() {
|
||||||
|
if (!this.hasActivity) {
|
||||||
|
return this.submenu
|
||||||
|
}
|
||||||
|
const activity = {
|
||||||
|
title: this.$t('common.Activity'),
|
||||||
|
name: 'ResourceActivity',
|
||||||
|
hidden: () => !this.$hasPerm('audits.view_operatelog')
|
||||||
|
}
|
||||||
|
return [...this.submenu, activity]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
|
18
src/main.js
18
src/main.js
@@ -1,11 +1,9 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
|
||||||
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
|
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
|
||||||
|
|
||||||
import ElementUI from 'element-ui'
|
import ElementUI from 'element-ui'
|
||||||
import locale from 'elementLocale'
|
import locale from 'elementLocale'
|
||||||
import '@/styles/index.scss' // global css
|
import '@/styles/index.scss' // global css
|
||||||
|
|
||||||
import App from './App'
|
import App from './App'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
@@ -15,6 +13,14 @@ import '@/icons' // icon
|
|||||||
import '@/guards' // permission control
|
import '@/guards' // permission control
|
||||||
import '@/directive'
|
import '@/directive'
|
||||||
import '@/filters'
|
import '@/filters'
|
||||||
|
// cookie
|
||||||
|
import VueCookie from 'vue-cookie'
|
||||||
|
import VueLogger from 'vuejs-logger'
|
||||||
|
import loggerOptions from './utils/logger'
|
||||||
|
import ECharts from 'vue-echarts'
|
||||||
|
import service from '@/utils/request'
|
||||||
|
import { Message } from '@/utils/Message'
|
||||||
|
import xss from '@/utils/xss'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If you don't want to use mock-server
|
* If you don't want to use mock-server
|
||||||
@@ -36,8 +42,6 @@ Vue.use(ElementUI, { locale })
|
|||||||
|
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
|
|
||||||
// cookie
|
|
||||||
import VueCookie from 'vue-cookie'
|
|
||||||
Vue.use(VueCookie)
|
Vue.use(VueCookie)
|
||||||
window.$cookie = VueCookie
|
window.$cookie = VueCookie
|
||||||
|
|
||||||
@@ -47,23 +51,17 @@ Vue.use(require('vue-moment'), {
|
|||||||
moment
|
moment
|
||||||
})
|
})
|
||||||
|
|
||||||
import VueLogger from 'vuejs-logger'
|
|
||||||
import loggerOptions from './utils/logger'
|
|
||||||
Vue.use(VueLogger, loggerOptions)
|
Vue.use(VueLogger, loggerOptions)
|
||||||
|
|
||||||
import ECharts from 'vue-echarts'
|
|
||||||
Vue.component('echarts', ECharts)
|
Vue.component('echarts', ECharts)
|
||||||
|
|
||||||
import service from '@/utils/request'
|
|
||||||
Vue.prototype.$axios = service
|
Vue.prototype.$axios = service
|
||||||
|
|
||||||
window._ = require('lodash')
|
window._ = require('lodash')
|
||||||
// Vue.set(Vue.prototype, '_', _)
|
// Vue.set(Vue.prototype, '_', _)
|
||||||
|
|
||||||
import { Message } from '@/utils/Message'
|
|
||||||
Vue.prototype.$message = Message
|
Vue.prototype.$message = Message
|
||||||
|
|
||||||
import xss from '@/utils/xss'
|
|
||||||
Vue.prototype.$xss = xss
|
Vue.prototype.$xss = xss
|
||||||
|
|
||||||
// 注册全局事件总线
|
// 注册全局事件总线
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage
|
<GenericDetailPage
|
||||||
:object.sync="TaskDetail"
|
|
||||||
:active-menu.sync="config.activeMenu"
|
:active-menu.sync="config.activeMenu"
|
||||||
|
:object.sync="TaskDetail"
|
||||||
v-bind="config"
|
v-bind="config"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
>
|
>
|
||||||
@@ -14,14 +14,12 @@
|
|||||||
<script>
|
<script>
|
||||||
import { GenericDetailPage, TabPage } from '@/layout/components'
|
import { GenericDetailPage, TabPage } from '@/layout/components'
|
||||||
import Detail from './Detail.vue'
|
import Detail from './Detail.vue'
|
||||||
import AssetActivity from './Activity.vue'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
GenericDetailPage,
|
GenericDetailPage,
|
||||||
TabPage,
|
TabPage,
|
||||||
Detail,
|
Detail
|
||||||
AssetActivity
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -32,11 +30,6 @@ export default {
|
|||||||
{
|
{
|
||||||
title: this.$t('common.BasicInfo'),
|
title: this.$t('common.BasicInfo'),
|
||||||
name: 'Detail'
|
name: 'Detail'
|
||||||
},
|
|
||||||
{
|
|
||||||
title: this.$t('common.Activity'),
|
|
||||||
name: 'AssetActivity',
|
|
||||||
hidden: () => !this.$hasPerm('audits.view_operatelog') || !this.$hasPerm('accounts.view_changesecretrecord')
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
actions: {
|
actions: {
|
||||||
|
@@ -1,36 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :md="12" :sm="24">
|
|
||||||
<TimelineCard :title="activityTitle" :url="activityUrl" />
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import TimelineCard from '@/components/TimelineCard'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AccountActivity',
|
|
||||||
components: {
|
|
||||||
TimelineCard
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
object: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
activityUrl: `/api/v1/audits/activities/?resource_id=${this.object.id}`,
|
|
||||||
activityTitle: `${this.$t('common.Activity')} - ${this.$t('audits.OperateRecord')} (${this.$t('common.Last30')})`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage
|
<GenericDetailPage
|
||||||
:object.sync="asset"
|
|
||||||
:active-menu.sync="config.activeMenu"
|
:active-menu.sync="config.activeMenu"
|
||||||
|
:object.sync="asset"
|
||||||
v-bind="config"
|
v-bind="config"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
>
|
>
|
||||||
@@ -16,7 +16,6 @@ import { GenericDetailPage, TabPage } from '@/layout/components'
|
|||||||
import Detail from './Detail.vue'
|
import Detail from './Detail.vue'
|
||||||
import Account from './Account.vue'
|
import Account from './Account.vue'
|
||||||
import PermUserList from './PermUser.vue'
|
import PermUserList from './PermUser.vue'
|
||||||
import AccountActivity from './components/Activity.vue'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AssetListDetail',
|
name: 'AssetListDetail',
|
||||||
@@ -25,8 +24,7 @@ export default {
|
|||||||
TabPage,
|
TabPage,
|
||||||
Detail,
|
Detail,
|
||||||
Account,
|
Account,
|
||||||
PermUserList,
|
PermUserList
|
||||||
AccountActivity
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -47,11 +45,6 @@ export default {
|
|||||||
title: this.$t('assets.PermUserList'),
|
title: this.$t('assets.PermUserList'),
|
||||||
name: 'PermUserList',
|
name: 'PermUserList',
|
||||||
hidden: () => !this.$hasPerm('perms.view_assetpermission')
|
hidden: () => !this.$hasPerm('perms.view_assetpermission')
|
||||||
},
|
|
||||||
{
|
|
||||||
title: this.$t('common.Activity'),
|
|
||||||
name: 'AccountActivity',
|
|
||||||
hidden: () => !this.$hasPerm('audits.view_operatelog') || !this.$hasPerm('terminal.view_session')
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
hasRightSide: true,
|
hasRightSide: true,
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage :object.sync="TaskDetail" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
|
<GenericDetailPage :active-menu.sync="config.activeMenu" :object.sync="TaskDetail" v-bind="config" v-on="$listeners">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
<component :is="config.activeMenu" :object="TaskDetail" />
|
<component :is="config.activeMenu" :object="TaskDetail" />
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
import { GenericDetailPage, TabPage } from '@/layout/components'
|
import { GenericDetailPage, TabPage } from '@/layout/components'
|
||||||
import Detail from './Detail.vue'
|
import Detail from './Detail.vue'
|
||||||
import GatewayList from './GatewayList.vue'
|
import GatewayList from './GatewayList.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
GenericDetailPage,
|
GenericDetailPage,
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage :object.sync="TaskDetail" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
|
<GenericDetailPage :active-menu.sync="config.activeMenu" :object.sync="TaskDetail" v-bind="config" v-on="$listeners">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
<component :is="config.activeMenu" :object="TaskDetail" />
|
<component :is="config.activeMenu" :object="TaskDetail" />
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage :object.sync="group" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
|
<GenericDetailPage :active-menu.sync="config.activeMenu" :object.sync="group" v-bind="config" v-on="$listeners">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
<component :is="config.activeMenu" :object="group" />
|
<component :is="config.activeMenu" :object="group" />
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
@@ -39,7 +39,7 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang='scss' scoped>
|
<style lang='scss' scoped>
|
||||||
>>> table.CardTable {
|
> > > table.CardTable {
|
||||||
table-layout: auto!important;
|
table-layout: auto !important;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage
|
<GenericDetailPage
|
||||||
:object.sync="role"
|
|
||||||
:active-menu.sync="config.activeMenu"
|
:active-menu.sync="config.activeMenu"
|
||||||
|
:object.sync="role"
|
||||||
v-bind="config"
|
v-bind="config"
|
||||||
v-on="$listeners"
|
v-on="$listeners"
|
||||||
>
|
>
|
||||||
|
@@ -1,36 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col :md="12" :sm="24">
|
|
||||||
<TimelineCard :title="activityTitle" :url="activityUrl" />
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import TimelineCard from '@/components/TimelineCard'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'UserActivity',
|
|
||||||
components: {
|
|
||||||
TimelineCard
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
object: {
|
|
||||||
type: Object,
|
|
||||||
default: () => {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
activityUrl: `/api/v1/audits/activities/?resource_id=${this.object.id}`,
|
|
||||||
activityTitle: `${this.$t('common.Activity')} - ${this.$t('audits.OperateRecord')} (${this.$t('common.Last30')})`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<GenericDetailPage :object.sync="user" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
|
<GenericDetailPage :active-menu.sync="config.activeMenu" :object.sync="user" v-bind="config" v-on="$listeners">
|
||||||
<keep-alive>
|
<keep-alive>
|
||||||
<component :is="config.activeMenu" :object="user" />
|
<component :is="config.activeMenu" :object="user" />
|
||||||
</keep-alive>
|
</keep-alive>
|
||||||
@@ -12,7 +12,6 @@ import UserAssetPermissionRules from './UserAssetPermissionRules'
|
|||||||
import UserGrantedAssets from './UserGrantedAssets'
|
import UserGrantedAssets from './UserGrantedAssets'
|
||||||
import UserLoginACLList from '@/views/acl/UserLoginACL/UserLoginACLList'
|
import UserLoginACLList from '@/views/acl/UserLoginACL/UserLoginACLList'
|
||||||
import UserInfo from './UserInfo'
|
import UserInfo from './UserInfo'
|
||||||
import UserActivity from './Activity.vue'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -20,8 +19,7 @@ export default {
|
|||||||
UserLoginACLList,
|
UserLoginACLList,
|
||||||
GenericDetailPage,
|
GenericDetailPage,
|
||||||
UserGrantedAssets,
|
UserGrantedAssets,
|
||||||
UserAssetPermissionRules,
|
UserAssetPermissionRules
|
||||||
UserActivity
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const vm = this
|
const vm = this
|
||||||
@@ -51,11 +49,6 @@ export default {
|
|||||||
title: this.$t('route.UserAclLists'),
|
title: this.$t('route.UserAclLists'),
|
||||||
name: 'UserLoginACLList',
|
name: 'UserLoginACLList',
|
||||||
hidden: () => !vm.$hasPerm('acls.view_loginacl')
|
hidden: () => !vm.$hasPerm('acls.view_loginacl')
|
||||||
},
|
|
||||||
{
|
|
||||||
title: this.$t('common.Activity'),
|
|
||||||
name: 'UserActivity',
|
|
||||||
hidden: () => !this.$hasPerm('audits.view_operatelog') || !this.$hasPerm('audits.view_userloginlog')
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user