style: 样式拆分.
This commit is contained in:
143
orion-ops-ui/src/assets/style/arco-extends.less
Normal file
143
orion-ops-ui/src/assets/style/arco-extends.less
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
// 内联菜单
|
||||||
|
.arco-menu-inner::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 吸顶列表
|
||||||
|
.sticky-list {
|
||||||
|
.arco-list-header {
|
||||||
|
position: sticky;
|
||||||
|
background: var(--color-fill-2);
|
||||||
|
border-bottom: none;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表头
|
||||||
|
.arco-table-td-content {
|
||||||
|
color: rgba(var(--gray-9), .95);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格
|
||||||
|
.arco-table-cell {
|
||||||
|
.circle {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 4px;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: rgb(var(--blue-6));
|
||||||
|
|
||||||
|
&.pass {
|
||||||
|
background-color: rgb(var(--green-6));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 垂直滚动
|
||||||
|
.arco-scrollbar-track-direction-vertical {
|
||||||
|
width: 9px;
|
||||||
|
|
||||||
|
.arco-scrollbar-thumb-bar {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 水平滚动
|
||||||
|
.arco-scrollbar-track-direction-horizontal {
|
||||||
|
height: 9px;
|
||||||
|
|
||||||
|
.arco-scrollbar-thumb-bar {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表头
|
||||||
|
.a-query-header-grid {
|
||||||
|
.arco-grid-item {
|
||||||
|
&:last-child {
|
||||||
|
display: flex !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标准卡片
|
||||||
|
.general-card {
|
||||||
|
border-radius: 4px;
|
||||||
|
border: none;
|
||||||
|
|
||||||
|
& > .arco-card-header {
|
||||||
|
height: auto;
|
||||||
|
padding: 16px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .arco-card-body {
|
||||||
|
padding: 0 16px 16px 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 块状树
|
||||||
|
.block-tree {
|
||||||
|
.arco-tree-node {
|
||||||
|
cursor: unset;
|
||||||
|
|
||||||
|
&-switcher {
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-fill-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&-selected {
|
||||||
|
background-color: var(--color-fill-2);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-fill-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-title {
|
||||||
|
padding: 0;
|
||||||
|
height: 32px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-fill-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
&-text {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 抽屉
|
||||||
|
.arco-drawer {
|
||||||
|
&-header {
|
||||||
|
border-bottom: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-footer {
|
||||||
|
border-top: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.arco-trigger-menu {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arco-dropdown-option-content {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
@@ -12,8 +12,6 @@ body {
|
|||||||
background-color: var(--color-bg-1);
|
background-color: var(--color-bg-1);
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
--color-scrollbar-track: var(--color-neutral-1);
|
|
||||||
--color-scrollbar-thumb: var(--color-neutral-5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- echarts
|
// -- echarts
|
||||||
@@ -68,103 +66,6 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- arco
|
|
||||||
.arco-menu-inner::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sticky-list {
|
|
||||||
.arco-list-header {
|
|
||||||
position: sticky;
|
|
||||||
background: var(--color-fill-2);
|
|
||||||
border-bottom: none;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-table-td-content {
|
|
||||||
color: rgba(var(--gray-9), .95);
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-table-cell {
|
|
||||||
.circle {
|
|
||||||
display: inline-block;
|
|
||||||
margin-right: 4px;
|
|
||||||
margin-bottom: 2px;
|
|
||||||
width: 6px;
|
|
||||||
height: 6px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: rgb(var(--blue-6));
|
|
||||||
|
|
||||||
&.pass {
|
|
||||||
background-color: rgb(var(--green-6));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-trigger-menu {
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-dropdown-option-content {
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-drawer-header {
|
|
||||||
border-bottom: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-drawer-footer {
|
|
||||||
border-top: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-drawer-container.drawer-body-padding-0 {
|
|
||||||
.arco-drawer-body {
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-scrollbar-track-direction-vertical {
|
|
||||||
width: 9px;
|
|
||||||
|
|
||||||
.arco-scrollbar-thumb-bar {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-scrollbar-track-direction-horizontal {
|
|
||||||
height: 9px;
|
|
||||||
|
|
||||||
.arco-scrollbar-thumb-bar {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.a-query-header-grid {
|
|
||||||
.arco-grid-item {
|
|
||||||
&:last-child {
|
|
||||||
display: flex !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -- card
|
|
||||||
.general-card {
|
|
||||||
border-radius: 4px;
|
|
||||||
border: none;
|
|
||||||
|
|
||||||
& > .arco-card-header {
|
|
||||||
height: auto;
|
|
||||||
padding: 16px;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .arco-card-body {
|
|
||||||
padding: 0 16px 16px 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// -- click-icon
|
// -- click-icon
|
||||||
.click-icon-wrapper {
|
.click-icon-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -309,20 +210,24 @@ body {
|
|||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-track {
|
|
||||||
background-color: var(--color-scrollbar-track);
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
width: 5px;
|
width: 6px;
|
||||||
height: 5px;
|
height: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
background-color: var(--color-neutral-1);
|
||||||
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
cursor: pointer;
|
border: 1px solid transparent;
|
||||||
|
background-clip: padding-box;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background-color: var(--color-scrollbar-thumb);
|
background-color: var(--color-neutral-5);
|
||||||
transition: color .2s ease;
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-neutral-6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<!-- 左侧固定配置按钮 -->
|
||||||
<div v-if="!appStore.navbar" class="fixed-settings" @click="open">
|
<div v-if="!appStore.navbar" class="fixed-settings" @click="open">
|
||||||
<a-button type="primary">
|
<a-button type="primary">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
@@ -6,18 +7,21 @@
|
|||||||
</template>
|
</template>
|
||||||
</a-button>
|
</a-button>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 偏好配置抽屉 -->
|
||||||
<a-drawer v-model:visible="visible"
|
<a-drawer v-model:visible="visible"
|
||||||
title="偏好设置"
|
title="偏好设置"
|
||||||
:width="300"
|
:width="300"
|
||||||
:footer="false"
|
:footer="false"
|
||||||
:unmount-on-close="true"
|
:unmount-on-close="true"
|
||||||
@cancel="() => setVisible(false)">
|
@cancel="() => setVisible(false)">
|
||||||
<!-- 布局设置 -->
|
<div class="preference-containers">
|
||||||
<Block :options="layoutOpts" title="布局设置" />
|
<!-- 布局设置 -->
|
||||||
<!-- 数据设置 -->
|
<Block :options="layoutOpts" title="布局设置" />
|
||||||
<Block :options="dataOpts" title="数据设置" />
|
<!-- 数据设置 -->
|
||||||
<!-- 页面视图 -->
|
<Block :options="dataOpts" title="数据设置" />
|
||||||
<Block :options="viewsOpts" title="页面视图" />
|
<!-- 页面视图 -->
|
||||||
|
<Block :options="viewsOpts" title="页面视图" />
|
||||||
|
</div>
|
||||||
</a-drawer>
|
</a-drawer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -151,4 +155,9 @@
|
|||||||
vertical-align: -4px;
|
vertical-align: -4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.preference-containers{
|
||||||
|
padding: 0 16px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<!-- 分组树 -->
|
<!-- 分组树 -->
|
||||||
<a-tree v-if="treeData.length"
|
<a-tree v-if="treeData.length"
|
||||||
ref="tree"
|
ref="tree"
|
||||||
class="tree-container"
|
class="tree-container block-tree"
|
||||||
:blockNode="true"
|
:blockNode="true"
|
||||||
:draggable="editable"
|
:draggable="editable"
|
||||||
:data="treeData"
|
:data="treeData"
|
||||||
@@ -359,41 +359,8 @@
|
|||||||
color: var(--color-text-3);
|
color: var(--color-text-3);
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep(.arco-tree-node) {
|
|
||||||
cursor: unset;
|
|
||||||
|
|
||||||
.arco-tree-node-switcher {
|
|
||||||
margin-left: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: var(--color-fill-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.arco-tree-node-selected) {
|
|
||||||
background-color: var(--color-fill-2);
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: var(--color-fill-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.arco-tree-node-title) {
|
:deep(.arco-tree-node-title) {
|
||||||
padding: 0 80px 0 0;
|
padding: 0 80px 0 0;
|
||||||
height: 32px;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: var(--color-fill-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.arco-tree-node-title-text {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.node-title-wrapper {
|
.node-title-wrapper {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
mask-closable
|
mask-closable
|
||||||
:closable="false"
|
:closable="false"
|
||||||
@cancel="drawerCancel">
|
@cancel="drawerCancel">
|
||||||
<Menu />
|
<Menu style="padding: 12px 16px;" />
|
||||||
</a-drawer>
|
</a-drawer>
|
||||||
<!-- body -->
|
<!-- body -->
|
||||||
<a-layout class="layout-content" :style="paddingStyle">
|
<a-layout class="layout-content" :style="paddingStyle">
|
||||||
@@ -159,24 +159,6 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
|
||||||
:deep(.arco-menu) {
|
|
||||||
::-webkit-scrollbar {
|
|
||||||
width: 12px;
|
|
||||||
height: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
border: 4px solid transparent;
|
|
||||||
background-clip: padding-box;
|
|
||||||
border-radius: 7px;
|
|
||||||
background-color: var(--color-text-4);
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:hover {
|
|
||||||
background-color: var(--color-text-3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-content {
|
.layout-content {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import App from './App.vue';
|
|||||||
// 样式通过 arco-plugin 插件导入 详见目录文件 config/plugin/arcoStyleImport.ts
|
// 样式通过 arco-plugin 插件导入 详见目录文件 config/plugin/arcoStyleImport.ts
|
||||||
import '@/assets/style/global.less';
|
import '@/assets/style/global.less';
|
||||||
import '@/assets/style/layout.less';
|
import '@/assets/style/layout.less';
|
||||||
|
import '@/assets/style/arco-extends.less';
|
||||||
import '@/api/interceptor';
|
import '@/api/interceptor';
|
||||||
|
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
:items="rolesRouter"
|
:items="rolesRouter"
|
||||||
@change="(key, item) => emits('change', key, item)" />
|
@change="(key, item) => emits('change', key, item)" />
|
||||||
<!-- 加载中 -->
|
<!-- 加载中 -->
|
||||||
<a-skeleton v-else-if="loading" class="skeleton-wrapper">
|
<a-skeleton v-else-if="loading"
|
||||||
|
class="skeleton-wrapper"
|
||||||
|
:animation="true">
|
||||||
<a-skeleton-line :rows="4" />
|
<a-skeleton-line :rows="4" />
|
||||||
</a-skeleton>
|
</a-skeleton>
|
||||||
<!-- 暂无数据 -->
|
<!-- 暂无数据 -->
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
:items="usersRouter"
|
:items="usersRouter"
|
||||||
@change="(key, item) => emits('change', key, item)" />
|
@change="(key, item) => emits('change', key, item)" />
|
||||||
<!-- 加载中 -->
|
<!-- 加载中 -->
|
||||||
<a-skeleton v-else-if="loading" class="skeleton-wrapper">
|
<a-skeleton v-else-if="loading"
|
||||||
|
class="skeleton-wrapper"
|
||||||
|
:animation="true">
|
||||||
<a-skeleton-line :rows="4" />
|
<a-skeleton-line :rows="4" />
|
||||||
</a-skeleton>
|
</a-skeleton>
|
||||||
<!-- 暂无数据 -->
|
<!-- 暂无数据 -->
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-drawer v-model:visible="visible"
|
<a-drawer v-model:visible="visible"
|
||||||
class="drawer-body-padding-0"
|
|
||||||
:title="title"
|
:title="title"
|
||||||
:width="470"
|
:width="470"
|
||||||
:mask-closable="false"
|
:mask-closable="false"
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-drawer v-model:visible="visible"
|
<a-drawer v-model:visible="visible"
|
||||||
class="drawer-body-padding-0"
|
|
||||||
:width="420"
|
:width="420"
|
||||||
:esc-to-close="false"
|
:esc-to-close="false"
|
||||||
:mask-closable="false"
|
:mask-closable="false"
|
||||||
|
|||||||
@@ -213,7 +213,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.arco-drawer-body {
|
.arco-drawer-body {
|
||||||
padding: 0;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-spin :loading="loading" class="main-container">
|
<div class="main-container">
|
||||||
<span class="extra-message">
|
<span class="extra-message">
|
||||||
<template v-if="user">
|
<template v-if="user">
|
||||||
只展示用户 <span class="user-info">{{ user.nickname }}({{ user.username }})</span> 最近登录的 30 条历史记录
|
只展示用户 <span class="user-info">{{ user.nickname }}({{ user.username }})</span> 最近登录的 30 条历史记录
|
||||||
@@ -8,8 +8,14 @@
|
|||||||
只展示最近登录的 30 条历史记录
|
只展示最近登录的 30 条历史记录
|
||||||
</template>
|
</template>
|
||||||
</span>
|
</span>
|
||||||
|
<!-- 加载中 -->
|
||||||
|
<a-skeleton v-if="loading"
|
||||||
|
style="width: 70%;"
|
||||||
|
:animation="true">
|
||||||
|
<a-skeleton-line :rows="4" />
|
||||||
|
</a-skeleton>
|
||||||
<!-- 登录历史时间线 -->
|
<!-- 登录历史时间线 -->
|
||||||
<a-timeline v-if="list.length">
|
<a-timeline v-else-if="list.length">
|
||||||
<a-timeline-item v-for="item in list"
|
<a-timeline-item v-for="item in list"
|
||||||
:key="item.id">
|
:key="item.id">
|
||||||
<!-- 图标 -->
|
<!-- 图标 -->
|
||||||
@@ -41,16 +47,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</a-timeline-item>
|
</a-timeline-item>
|
||||||
</a-timeline>
|
</a-timeline>
|
||||||
<!-- 加载中 -->
|
|
||||||
<a-space direction="vertical"
|
|
||||||
v-else-if="loading"
|
|
||||||
:style="{width: '70%'}"
|
|
||||||
size="large">
|
|
||||||
<a-skeleton-line :rows="4" />
|
|
||||||
</a-space>
|
|
||||||
<!-- 空 -->
|
<!-- 空 -->
|
||||||
<a-empty v-else />
|
<a-empty v-else />
|
||||||
</a-spin>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -64,7 +63,7 @@
|
|||||||
import type { LoginHistoryQueryResponse } from '@/api/user/operator-log';
|
import type { LoginHistoryQueryResponse } from '@/api/user/operator-log';
|
||||||
import type { PropType } from 'vue';
|
import type { PropType } from 'vue';
|
||||||
import useLoading from '@/hooks/loading';
|
import useLoading from '@/hooks/loading';
|
||||||
import { ref, onMounted } from 'vue';
|
import { ref, onBeforeMount } from 'vue';
|
||||||
import { ResultStatus } from '../types/const';
|
import { ResultStatus } from '../types/const';
|
||||||
import { getCurrentLoginHistory } from '@/api/user/mine';
|
import { getCurrentLoginHistory } from '@/api/user/mine';
|
||||||
import { getLoginHistory } from '@/api/user/operator-log';
|
import { getLoginHistory } from '@/api/user/operator-log';
|
||||||
@@ -80,7 +79,7 @@
|
|||||||
const { loading, setLoading } = useLoading();
|
const { loading, setLoading } = useLoading();
|
||||||
|
|
||||||
// 查询操作日志
|
// 查询操作日志
|
||||||
onMounted(async () => {
|
onBeforeMount(async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
if (props.user) {
|
if (props.user) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<a-spin :loading="loading" class="main-container">
|
<div class="main-container">
|
||||||
<span class="extra-message">
|
<span class="extra-message">
|
||||||
<template v-if="user">
|
<template v-if="user">
|
||||||
用户 <span class="user-info">{{ user.nickname }}({{ user.username }})</span> 所有登录设备的会话列表
|
用户 <span class="user-info">{{ user.nickname }}({{ user.username }})</span> 所有登录设备的会话列表
|
||||||
@@ -8,8 +8,14 @@
|
|||||||
所有登录设备的会话列表
|
所有登录设备的会话列表
|
||||||
</template>
|
</template>
|
||||||
</span>
|
</span>
|
||||||
|
<!-- 加载中 -->
|
||||||
|
<a-skeleton v-if="loading"
|
||||||
|
style="width: 70%;"
|
||||||
|
:animation="true">
|
||||||
|
<a-skeleton-line :rows="4" />
|
||||||
|
</a-skeleton>
|
||||||
<!-- 登录会话时间线 -->
|
<!-- 登录会话时间线 -->
|
||||||
<a-timeline v-if="list.length">
|
<a-timeline v-else-if="list.length">
|
||||||
<template v-for="item in list"
|
<template v-for="item in list"
|
||||||
:key="item.loginTime">
|
:key="item.loginTime">
|
||||||
<a-timeline-item v-if="item.visible">
|
<a-timeline-item v-if="item.visible">
|
||||||
@@ -48,16 +54,9 @@
|
|||||||
</a-timeline-item>
|
</a-timeline-item>
|
||||||
</template>
|
</template>
|
||||||
</a-timeline>
|
</a-timeline>
|
||||||
<!-- 加载中 -->
|
|
||||||
<a-space direction="vertical"
|
|
||||||
v-else-if="loading"
|
|
||||||
:style="{width: '70%'}"
|
|
||||||
size="large">
|
|
||||||
<a-skeleton-line :rows="4" />
|
|
||||||
</a-space>
|
|
||||||
<!-- 空 -->
|
<!-- 空 -->
|
||||||
<a-empty v-else />
|
<a-empty v-else />
|
||||||
</a-spin>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -71,7 +70,7 @@
|
|||||||
import type { UserSessionQueryResponse } from '@/api/user/user';
|
import type { UserSessionQueryResponse } from '@/api/user/user';
|
||||||
import type { PropType } from 'vue';
|
import type { PropType } from 'vue';
|
||||||
import useLoading from '@/hooks/loading';
|
import useLoading from '@/hooks/loading';
|
||||||
import { ref, onMounted } from 'vue';
|
import { ref, onBeforeMount } from 'vue';
|
||||||
import { getCurrentUserSessionList, offlineCurrentUserSession } from '@/api/user/mine';
|
import { getCurrentUserSessionList, offlineCurrentUserSession } from '@/api/user/mine';
|
||||||
import { dateFormat } from '@/utils';
|
import { dateFormat } from '@/utils';
|
||||||
import { isMobile } from '@/utils/is';
|
import { isMobile } from '@/utils/is';
|
||||||
@@ -104,7 +103,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 查询登录会话
|
// 查询登录会话
|
||||||
onMounted(async () => {
|
onBeforeMount(async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
let sessions: UserSessionQueryResponse[];
|
let sessions: UserSessionQueryResponse[];
|
||||||
|
|||||||
Reference in New Issue
Block a user