perf: code

This commit is contained in:
pan 2024-03-18 18:03:11 +08:00
parent 27ae6a0ec7
commit a539faeb42
5 changed files with 246 additions and 0 deletions

View File

@ -45,6 +45,7 @@ menus:
hsLoginLog: Login Log
hsOperationLog: Operation Log
hsSystemLog: System Log
hsGenerator: code generation
status:
hsLoad: Loading...
login:

View File

@ -45,6 +45,7 @@ menus:
hsLoginLog: 登录日志
hsOperationLog: 操作日志
hsSystemLog: 系统日志
hsGenerator: 代码生成
status:
hsLoad: 加载中...
login:

View File

@ -72,6 +72,16 @@ const systemMonitorRouter = {
rank: monitor
},
children: [
{
path: "/monitor/generator",
component: "monitor/generator/index",
name: "Generator",
meta: {
icon: "ri:user-voice-line",
title: "menus.hsGenerator",
roles: ["admin"]
}
},
{
path: "/monitor/online-user",
component: "monitor/online/index",

View File

@ -0,0 +1,109 @@
import dayjs from "dayjs";
import { message } from "@/utils/message";
import { CRUD } from "@/api/utils";
import { reactive, ref, onMounted, toRaw } from "vue";
import type { PaginationProps } from "@pureadmin/table";
export function useRole() {
const form = reactive({
username: "",
tableName: "",
size: 999
});
const dataList = ref([]);
const loading = ref(true);
const pagination = reactive<PaginationProps>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
label: "表名",
prop: "tableName",
minWidth: 100
},
{
label: "数据库引擎",
prop: "engine",
minWidth: 140
},
{
label: "字符编码集",
prop: "coding",
minWidth: 140
},
{
label: "备注",
prop: "remark",
minWidth: 100
},
{
label: "创建日期",
prop: "createTime",
minWidth: 180,
formatter: ({ createTime }) =>
dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
},
{
label: "操作",
fixed: "right",
slot: "operation"
}
];
function handleSizeChange(val: number) {
console.log(`${val} items per page`);
}
function handleCurrentChange(val: number) {
console.log(`current page: ${val}`);
}
function handleSelectionChange(val) {
console.log("handleSelectionChange", val);
}
function handleOffline(row) {
message(`${row.username}已被强制下线`, { type: "success" });
onSearch();
}
async function onSearch() {
loading.value = true;
const { data } = await CRUD.get("generator/tables", {
params: toRaw(form)
});
dataList.value = data.content;
pagination.total = data.totalElements;
setTimeout(() => {
loading.value = false;
}, 500);
}
const resetForm = formEl => {
if (!formEl) return;
formEl.resetFields();
onSearch();
};
onMounted(() => {
onSearch();
});
return {
form,
loading,
columns,
dataList,
pagination,
onSearch,
resetForm,
handleOffline,
handleSizeChange,
handleCurrentChange,
handleSelectionChange
};
}

View File

@ -0,0 +1,125 @@
<script setup lang="ts">
import { ref } from "vue";
import { useRole } from "./hook";
import { PureTableBar } from "@/components/RePureTableBar";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import Plane from "@iconify-icons/ri/plane-line";
import Refresh from "@iconify-icons/ep/refresh";
defineOptions({
name: "OnlineUser"
});
const formRef = ref();
const {
form,
loading,
columns,
dataList,
pagination,
onSearch,
resetForm,
handleOffline,
handleSizeChange,
handleCurrentChange,
handleSelectionChange
} = useRole();
</script>
<template>
<div class="main">
<el-form
ref="formRef"
:inline="true"
:model="form"
class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px]"
>
<el-form-item label="表名" prop="tableName">
<el-input
v-model="form.tableName"
placeholder="请输入表名"
clearable
class="!w-[180px]"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
:icon="useRenderIcon('ri:search-line')"
:loading="loading"
@click="onSearch"
>
搜索
</el-button>
<el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)">
重置
</el-button>
</el-form-item>
</el-form>
<PureTableBar
title="在线用户(仅演示,操作后不生效)"
:columns="columns"
@refresh="onSearch"
>
<template v-slot="{ size, dynamicColumns }">
<pure-table
align-whole="center"
showOverflowTooltip
table-layout="auto"
:loading="loading"
:size="size"
adaptive
:adaptiveConfig="{ offsetBottom: 108 }"
:data="dataList"
:columns="dynamicColumns"
:pagination="pagination"
:paginationSmall="size === 'small' ? true : false"
:header-cell-style="{
background: 'var(--el-fill-color-light)',
color: 'var(--el-text-color-primary)'
}"
@selection-change="handleSelectionChange"
@page-size-change="handleSizeChange"
@page-current-change="handleCurrentChange"
>
<template #operation="{ row }">
<el-popconfirm
:title="`是否强制下线${row.username}`"
@confirm="handleOffline(row)"
>
<template #reference>
<el-button
class="reset-margin"
link
type="primary"
:size="size"
:icon="useRenderIcon(Plane)"
>
强退
</el-button>
</template>
</el-popconfirm>
</template>
</pure-table>
</template>
</PureTableBar>
</div>
</template>
<style scoped lang="scss">
:deep(.el-dropdown-menu__item i) {
margin: 0;
}
.main-content {
margin: 24px 24px 0 !important;
}
.search-form {
:deep(.el-form-item) {
margin-bottom: 12px;
}
}
</style>