2024-03-19 18:01:27 +08:00

179 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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";
import { isString, isEmpty } from "@pureadmin/utils";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import {
useRouter,
useRoute,
type LocationQueryRaw,
type RouteParamsRaw
} from "vue-router";
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
};
}
export function useDetail() {
const route = useRoute();
const router = useRouter();
const getParameter = isEmpty(route.params) ? route.query : route.params;
function toDetail(
parameter: LocationQueryRaw | RouteParamsRaw,
model: "query" | "params"
) {
// ⚠️ 这里要特别注意下因为vue-router在解析路由参数的时候会自动转化成字符串类型比如在使用useRoute().route.query或useRoute().route.params时得到的参数都是字符串类型
// 所以在传参的时候,如果参数是数字类型,就需要在此处 toString() 一下,保证传参跟路由参数类型一致都是字符串,这是必不可少的环节!!!
Object.keys(parameter).forEach(param => {
if (!isString(parameter[param])) {
parameter[param] = parameter[param].toString();
}
});
if (model === "query") {
// 保存信息到标签页
useMultiTagsStoreHook().handleTags("push", {
path: `/monitor/generator/query-detail`,
name: "TabQueryDetail",
query: parameter,
meta: {
title: {
zh: `${parameter.id} - 预览`,
en: `No.${parameter.id} - DetailInfo`
},
// 如果使用的是非国际化精简版title可以像下面这么写
// title: `No.${index} - 详情信息`,
// 最大打开标签数
dynamicLevel: 3
}
});
// 路由跳转
router.push({ name: "TabQueryDetail", query: parameter });
} else if (model === "params") {
useMultiTagsStoreHook().handleTags("push", {
path: `/monitor/generator/params-detail/:id`,
name: "TabParamsDetail",
params: parameter,
meta: {
title: {
zh: `No.${parameter.id} - 详情信息`,
en: `No.${parameter.id} - DetailInfo`
}
// 如果使用的是非国际化精简版title可以像下面这么写
// title: `No.${index} - 详情信息`,
}
});
router.push({ name: "TabParamsDetail", params: parameter });
}
}
// 用于页面刷新,重新获取浏览器地址栏参数并保存到标签页
const initToDetail = (model: "query" | "params") => {
if (getParameter) toDetail(getParameter, model);
};
return { toDetail, initToDetail, getParameter, router };
}