!62 style: 格式化系统配置与字典模块代码

Merge pull request !62 from Mickeywaugh/master
This commit is contained in:
Ray
2026-06-05 07:30:04 +00:00
committed by Gitee
13 changed files with 278 additions and 217 deletions

View File

@@ -8,7 +8,6 @@ import type {
DictItemForm, DictItemForm,
DictItemOption, DictItemOption,
} from "./types"; } from "./types";
import type { OptionItem } from "@/api/common";
const DICT_BASE_URL = "/api/v1/dicts"; const DICT_BASE_URL = "/api/v1/dicts";

View File

@@ -61,6 +61,8 @@ export interface DictItem {
status: number; status: number;
/** 排序 */ /** 排序 */
sort?: number; sort?: number;
/** 标签类型(后端返回的原始码) */
tagType?: unknown;
} }
/** 字典项表单对象 */ /** 字典项表单对象 */

41
src/types/api/index.ts Normal file
View File

@@ -0,0 +1,41 @@
export interface PageQueryParams {
pageNum: number;
pageSize: number;
[key: string]: any;
}
export interface OptionItem {
label: string;
value: string | number;
meta?: any;
children?: OptionItem[];
}
export interface ExcelResult {
/** 状态码 */
code: number;
/** 无效数据条数 */
invalidCount: number;
/** 有效数据条数 */
validCount: number;
/** 错误信息 */
messageList: Array<string>;
}
export interface PageResult<T> {
total: number;
list: T[];
params: PageQueryParams;
}
export interface ApiResponse<T = any> {
code: number | string;
msg: string;
data: T;
}
export interface BaseEntity {
id: number;
createTime: string;
updateTime: string;
}

View File

@@ -34,7 +34,7 @@ http.interceptors.request.use(
// 响应拦截器 // 响应拦截器
http.interceptors.response.use( http.interceptors.response.use(
(response: AxiosResponse<ApiResponse>) => { (response: AxiosResponse<ApiResponse>): any => {
const { responseType } = response.config; const { responseType } = response.config;
// 二进制数据直接返回 // 二进制数据直接返回
@@ -64,8 +64,8 @@ http.interceptors.response.use(
// Token 过期:尝试刷新 token 后自动重试一次 // Token 过期:尝试刷新 token 后自动重试一次
if (code === ApiCodeEnum.ACCESS_TOKEN_INVALID) { if (code === ApiCodeEnum.ACCESS_TOKEN_INVALID) {
// 重试,直接跳登录 // config 不存在时无法重试,直接跳登录
if (retriedConfigs.has(config)) { if (!config || retriedConfigs.has(config)) {
await redirectToLogin("登录已过期,请重新登录"); await redirectToLogin("登录已过期,请重新登录");
return Promise.reject(new Error("Token Invalid")); return Promise.reject(new Error("Token Invalid"));
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true">
<el-form-item label="关键字" prop="keywords"> <el-form-item label="关键字" prop="keywords">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="请输入配置键\配置名称" placeholder="请输入配置键\配置名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -43,7 +43,7 @@
<el-table <el-table
ref="dataTableRef" ref="dataTableRef"
v-loading="loading" v-loading="loading"
:data="pageData" :data="tableData.list"
highlight-current-row highlight-current-row
border border
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
@@ -80,10 +80,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData" @pagination="fetchData"
/> />
</el-card> </el-card>
@@ -138,7 +138,7 @@ defineOptions({
}); });
import ConfigAPI from "@/api/system/config"; import ConfigAPI from "@/api/system/config";
import type { ConfigItem, ConfigForm, ConfigQueryParams } from "@/api/system/config"; import type { ConfigItem, ConfigForm } from "@/api/system/config";
import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "element-plus"; import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "element-plus";
import { useDebounceFn } from "@vueuse/core"; import { useDebounceFn } from "@vueuse/core";
@@ -146,19 +146,21 @@ import { useDebounceFn } from "@vueuse/core";
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
const dataFormRef = ref<FormInstance>(); const dataFormRef = ref<FormInstance>();
// 查询参数
const queryParams = reactive<ConfigQueryParams>({
pageNum: 1,
pageSize: 10,
keywords: "",
});
// 列表数据 // 列表数据
const pageData = ref<ConfigItem[]>([]);
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const selectIds = ref<string[]>([]); const selectIds = ref<string[]>([]);
const tableData = reactive<PageResult<ConfigItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
keywords: "",
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
title: "", title: "",
@@ -186,10 +188,10 @@ const rules: FormRules = {
*/ */
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
ConfigAPI.getPage(queryParams) ConfigAPI.getPage(tableData.params)
.then((data) => { .then((data) => {
pageData.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -200,7 +202,7 @@ function fetchData(): void {
* 查询按钮点击事件 * 查询按钮点击事件
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
@@ -209,7 +211,7 @@ function handleQuery(): void {
*/ */
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true">
<el-form-item label="关键字" prop="keywords"> <el-form-item label="关键字" prop="keywords">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="字典标签/字典值" placeholder="字典标签/字典值"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -36,7 +36,7 @@
<el-table <el-table
v-loading="loading" v-loading="loading"
highlight-current-row highlight-current-row
:data="tableData" :data="tableData.list"
border border
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
@@ -77,10 +77,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData" @pagination="fetchData"
/> />
</el-card> </el-card>
@@ -153,7 +153,7 @@
<script setup lang="ts"> <script setup lang="ts">
import DictAPI from "@/api/system/dict"; import DictAPI from "@/api/system/dict";
import type { DictItemQueryParams, DictItem, DictItemForm } from "@/api/system/dict"; import type { DictItem, DictItemForm } from "@/api/system/dict";
import type { FormInstance, FormRules } from "element-plus"; import type { FormInstance, FormRules } from "element-plus";
const route = useRoute(); const route = useRoute();
@@ -165,18 +165,22 @@ const dictCode = ref(route.query.dictCode as string);
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
const dataFormRef = ref<FormInstance>(); const dataFormRef = ref<FormInstance>();
// 查询参数
const queryParams = reactive<DictItemQueryParams>({
pageNum: 1,
pageSize: 10,
});
// 列表数据 // 列表数据
const tableData = ref<DictItem[]>();
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const ids = ref<string[]>([]); const ids = ref<string[]>([]);
const tableData = reactive<PageResult<DictItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
dictCode: undefined,
keywords: undefined,
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
title: "", title: "",
@@ -204,10 +208,10 @@ const rules: FormRules = {
*/ */
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
DictAPI.getDictItemPage(dictCode.value, queryParams) DictAPI.getDictItemPage(dictCode.value, tableData.params)
.then((data) => { .then((data: any) => {
tableData.value = data.list; tableData.list = data.list;
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -218,7 +222,7 @@ function fetchData(): void {
* 查询按钮点击事件 * 查询按钮点击事件
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
@@ -227,7 +231,7 @@ function handleQuery(): void {
*/ */
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true">
<el-form-item label="关键字" prop="keywords"> <el-form-item label="关键字" prop="keywords">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="字典名称/编码" placeholder="字典名称/编码"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -36,7 +36,7 @@
<el-table <el-table
v-loading="loading" v-loading="loading"
highlight-current-row highlight-current-row
:data="tableData" :data="tableData.list"
border border
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
@@ -82,10 +82,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData" @pagination="fetchData"
/> />
</el-card> </el-card>
@@ -134,7 +134,7 @@ defineOptions({
}); });
import DictAPI from "@/api/system/dict"; import DictAPI from "@/api/system/dict";
import type { DictTypeQueryParams, DictTypeItem, DictTypeForm } from "@/api/system/dict"; import type { DictTypeItem, DictTypeForm } from "@/api/system/dict";
import type { FormInstance, FormRules } from "element-plus"; import type { FormInstance, FormRules } from "element-plus";
import router from "@/router"; import router from "@/router";
@@ -142,17 +142,18 @@ import router from "@/router";
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
const dataFormRef = ref<FormInstance>(); const dataFormRef = ref<FormInstance>();
// 查询参数
const queryParams = reactive<DictTypeQueryParams>({
pageNum: 1,
pageSize: 10,
});
// 列表数据 // 列表数据
const tableData = ref<DictTypeItem[]>();
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const ids = ref<string[]>([]); const ids = ref<string[]>([]);
const tableData = reactive<PageResult<DictTypeItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
@@ -176,10 +177,10 @@ const rules: FormRules = {
*/ */
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
DictAPI.getPage(queryParams) DictAPI.getPage(tableData.params)
.then((data) => { .then((data) => {
tableData.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -190,7 +191,7 @@ function fetchData(): void {
* 查询按钮点击事件 * 查询按钮点击事件
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
@@ -199,7 +200,7 @@ function handleQuery(): void {
*/ */
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="auto"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true" label-width="auto">
<el-form-item prop="keywords" label="关键字"> <el-form-item prop="keywords" label="关键字">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="IP/操作人" placeholder="IP/操作人"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -13,7 +13,7 @@
<el-form-item prop="createTime" label="操作时间"> <el-form-item prop="createTime" label="操作时间">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="tableData.params.createTime"
:editable="false" :editable="false"
type="daterange" type="daterange"
range-separator="~" range-separator="~"
@@ -32,7 +32,7 @@
</el-card> </el-card>
<el-card class="page-content" shadow="never"> <el-card class="page-content" shadow="never">
<el-table v-loading="loading" :data="pageData" highlight-current-row border> <el-table v-loading="loading" :data="tableData.list" highlight-current-row border>
<el-table-column label="操作标题" prop="title" min-width="180" show-overflow-tooltip /> <el-table-column label="操作标题" prop="title" min-width="180" show-overflow-tooltip />
<el-table-column label="状态" prop="status" width="80" align="center"> <el-table-column label="状态" prop="status" width="80" align="center">
<template #default="{ row }"> <template #default="{ row }">
@@ -61,10 +61,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData" @pagination="fetchData"
/> />
</el-card> </el-card>
@@ -111,7 +111,7 @@ defineOptions({
}); });
import LogAPI from "@/api/system/log"; import LogAPI from "@/api/system/log";
import type { LogItem, LogQueryParams } from "@/api/system/log"; import type { LogItem } from "@/api/system/log";
import type { FormInstance, TagProps } from "element-plus"; import type { FormInstance, TagProps } from "element-plus";
function getMethodTagType(method: string): TagProps["type"] { function getMethodTagType(method: string): TagProps["type"] {
@@ -128,29 +128,29 @@ function getMethodTagType(method: string): TagProps["type"] {
// 表单引用 // 表单引用
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
// 查询参数
const queryParams = reactive<LogQueryParams>({
pageNum: 1,
pageSize: 10,
keywords: "",
createTime: undefined as [string, string] | undefined,
});
// 列表数据
const pageData = ref<LogItem[]>();
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const tableData = reactive<PageResult<LogItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
keywords: "",
createTime: undefined as [string, string] | undefined,
},
});
// 详情弹窗 // 详情弹窗
const detailVisible = ref(false); const detailVisible = ref(false);
const detailData = ref<Partial<LogItem>>({}); const detailData = ref<Partial<LogItem>>({});
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
LogAPI.getPage(queryParams) LogAPI.getPage(tableData.params)
.then((data) => { .then((data) => {
pageData.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -158,14 +158,14 @@ function fetchData(): void {
} }
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
queryParams.createTime = undefined; tableData.params.createTime = undefined;
fetchData(); fetchData();
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-suffix=":"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true" label-suffix=":">
<el-form-item label="标题" prop="title"> <el-form-item label="标题" prop="title">
<el-input <el-input
v-model="queryParams.title" v-model="tableData.params.title"
placeholder="标题" placeholder="标题"
clearable clearable
@keyup.enter="handleQuery()" @keyup.enter="handleQuery()"
@@ -13,7 +13,7 @@
<el-form-item label="发布状态" prop="publishStatus"> <el-form-item label="发布状态" prop="publishStatus">
<el-select <el-select
v-model="queryParams.publishStatus" v-model="tableData.params.publishStatus"
clearable clearable
placeholder="全部" placeholder="全部"
style="width: 100px" style="width: 100px"
@@ -57,7 +57,7 @@
<el-table <el-table
ref="dataTableRef" ref="dataTableRef"
v-loading="loading" v-loading="loading"
:data="pageData" :data="tableData.list"
highlight-current-row highlight-current-row
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
@@ -155,10 +155,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData()" @pagination="fetchData()"
/> />
</el-card> </el-card>
@@ -277,7 +277,7 @@ defineOptions({
}); });
import NoticeAPI from "@/api/system/notice"; import NoticeAPI from "@/api/system/notice";
import type { NoticeItem, NoticeForm, NoticeQueryParams, NoticeDetail } from "@/api/system/notice"; import type { NoticeItem, NoticeForm, NoticeDetail } from "@/api/system/notice";
import UserAPI from "@/api/system/user"; import UserAPI from "@/api/system/user";
import type { FormInstance, FormRules } from "element-plus"; import type { FormInstance, FormRules } from "element-plus";
@@ -285,19 +285,23 @@ import type { FormInstance, FormRules } from "element-plus";
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
const dataFormRef = ref<FormInstance>(); const dataFormRef = ref<FormInstance>();
// 查询参数
const queryParams = reactive<NoticeQueryParams>({
pageNum: 1,
pageSize: 10,
});
// 列表数据 // 列表数据
const pageData = ref<NoticeItem[]>([]);
const userOptions = ref<OptionItem[]>([]); const userOptions = ref<OptionItem[]>([]);
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const selectIds = ref<number[]>([]); const selectIds = ref<number[]>([]);
const tableData = reactive<PageResult<NoticeItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
title: "",
publishStatus: undefined,
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
title: "", title: "",
@@ -341,7 +345,7 @@ const currentNotice = ref<NoticeDetail>({});
* 查询按钮点击事件 * 查询按钮点击事件
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
@@ -350,10 +354,10 @@ function handleQuery(): void {
*/ */
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
NoticeAPI.getPage(queryParams) NoticeAPI.getPage(tableData.params)
.then((data) => { .then((data) => {
pageData.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -365,7 +369,7 @@ function fetchData(): void {
*/ */
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }

View File

@@ -2,10 +2,10 @@
<div class="page-container"> <div class="page-container">
<!-- 搜索区域 --> <!-- 搜索区域 -->
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true">
<el-form-item prop="keywords" label="关键字"> <el-form-item prop="keywords" label="关键字">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="角色名称" placeholder="角色名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -37,7 +37,7 @@
<el-table <el-table
ref="dataTableRef" ref="dataTableRef"
v-loading="loading" v-loading="loading"
:data="roleList" :data="tableData.list"
highlight-current-row highlight-current-row
border border
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
@@ -92,10 +92,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchList" @pagination="fetchList"
/> />
</el-card> </el-card>
@@ -233,7 +233,7 @@ import { useAppStore } from "@/stores/app";
import { DeviceEnum } from "@/enums/settings"; import { DeviceEnum } from "@/enums/settings";
import RoleAPI from "@/api/system/role"; import RoleAPI from "@/api/system/role";
import type { RoleItem, RoleForm, RoleQueryParams } from "@/api/system/role"; import type { RoleItem, RoleForm } from "@/api/system/role";
import MenuAPI from "@/api/system/menu"; import MenuAPI from "@/api/system/menu";
import DeptAPI from "@/api/system/dept"; import DeptAPI from "@/api/system/dept";
@@ -250,15 +250,17 @@ const permTreeRef = ref();
const loading = ref(false); const loading = ref(false);
const ids = ref<number[]>([]); const ids = ref<number[]>([]);
const total = ref(0);
const queryParams = reactive<RoleQueryParams>({ const tableData = reactive<PageResult<RoleItem>>({
pageNum: 1, list: [],
pageSize: 10, total: 0,
params: {
pageNum: 1,
pageSize: 10,
keywords: "",
},
}); });
// 角色表格数据
const roleList = ref<RoleItem[]>();
// 菜单权限下拉 // 菜单权限下拉
const menuPermOptions = ref<OptionItem[]>([]); const menuPermOptions = ref<OptionItem[]>([]);
// 部门下拉选项 // 部门下拉选项
@@ -305,9 +307,9 @@ const parentChildLinked = ref(true);
async function fetchList(): Promise<void> { async function fetchList(): Promise<void> {
loading.value = true; loading.value = true;
try { try {
const data = await RoleAPI.getPage(queryParams); const data = await RoleAPI.getPage(tableData.params);
roleList.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
} finally { } finally {
loading.value = false; loading.value = false;
} }
@@ -315,7 +317,7 @@ async function fetchList(): Promise<void> {
// 查询(重置页码后获取数据) // 查询(重置页码后获取数据)
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchList(); fetchList();
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true">
<el-form-item prop="keywords" label="关键字"> <el-form-item prop="keywords" label="关键字">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="租户名称/租户编码/域名" placeholder="租户名称/租户编码/域名"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -12,7 +12,12 @@
</el-form-item> </el-form-item>
<el-form-item prop="status" label="状态"> <el-form-item prop="status" label="状态">
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 120px"> <el-select
v-model="tableData.params.status"
placeholder="全部"
clearable
style="width: 120px"
>
<el-option label="正常" :value="1" /> <el-option label="正常" :value="1" />
<el-option label="禁用" :value="0" /> <el-option label="禁用" :value="0" />
</el-select> </el-select>
@@ -50,7 +55,7 @@
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="pageData" :data="tableData.list"
highlight-current-row highlight-current-row
border border
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
@@ -143,10 +148,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData" @pagination="fetchData"
/> />
</el-card> </el-card>
@@ -360,12 +365,7 @@ import { hasPerm } from "@/utils/auth";
import TenantAPI from "@/api/system/tenant"; import TenantAPI from "@/api/system/tenant";
import TenantPlanAPI from "@/api/system/tenant-plan"; import TenantPlanAPI from "@/api/system/tenant-plan";
import MenuAPI from "@/api/system/menu"; import MenuAPI from "@/api/system/menu";
import type { import type { TenantCreateForm, TenantForm, TenantItem } from "@/api/system/tenant";
TenantCreateForm,
TenantForm,
TenantQueryParams,
TenantItem,
} from "@/api/system/tenant";
import type { OptionItem } from "@/api/common"; import type { OptionItem } from "@/api/common";
import { MenuScopeEnum } from "@/enums/business"; import { MenuScopeEnum } from "@/enums/business";
import { isPlatformTenantId } from "@/utils/tenant"; import { isPlatformTenantId } from "@/utils/tenant";
@@ -376,21 +376,23 @@ const dataFormRef = ref<FormInstance>();
const menuTreeRef = ref(); const menuTreeRef = ref();
const planPreviewTreeRef = ref(); const planPreviewTreeRef = ref();
// 查询参数
const queryParams = reactive<TenantQueryParams>({
pageNum: 1,
pageSize: 10,
keywords: "",
});
// 列表数据 // 列表数据
const pageData = ref<TenantItem[]>([]);
const menuPermOptions = ref<OptionItem[]>([]); const menuPermOptions = ref<OptionItem[]>([]);
const planOptions = ref<OptionItem[]>([]); const planOptions = ref<OptionItem[]>([]);
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const ids = ref<number[]>([]); const ids = ref<number[]>([]);
const tableData = reactive<PageResult<TenantItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
keywords: "",
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
title: "", title: "",
@@ -484,13 +486,13 @@ function resolvePlanLabel(planId?: number): string {
*/ */
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
TenantAPI.getPage(queryParams) TenantAPI.getPage(tableData.params)
.then((data) => { .then((data) => {
pageData.value = data.list.map((item: TenantItem) => ({ tableData.list = data.list.map((item: TenantItem) => ({
...item, ...item,
planId: item.planId != null ? Number(item.planId) : undefined, planId: item.planId != null ? Number(item.planId) : undefined,
})); }));
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -822,7 +824,7 @@ function applyMenuOptionsDisabled(options: OptionItem[], disabled: boolean): Opt
* 查询按钮点击事件 * 查询按钮点击事件
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
@@ -831,7 +833,7 @@ function handleQuery(): void {
*/ */
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }

View File

@@ -1,10 +1,10 @@
<template> <template>
<div class="page-container"> <div class="page-container">
<el-card class="page-search" shadow="never"> <el-card class="page-search" shadow="never">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true">
<el-form-item label="关键字" prop="keywords"> <el-form-item label="关键字" prop="keywords">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="套餐名称/套餐编码" placeholder="套餐名称/套餐编码"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -12,7 +12,12 @@
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 120px"> <el-select
v-model="tableData.params.status"
placeholder="全部"
clearable
style="width: 120px"
>
<el-option label="启用" :value="1" /> <el-option label="启用" :value="1" />
<el-option label="停用" :value="0" /> <el-option label="停用" :value="0" />
</el-select> </el-select>
@@ -42,7 +47,7 @@
<el-table <el-table
ref="dataTableRef" ref="dataTableRef"
v-loading="loading" v-loading="loading"
:data="pageData" :data="tableData.list"
highlight-current-row highlight-current-row
border border
> >
@@ -95,10 +100,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchData" @pagination="fetchData"
/> />
</el-card> </el-card>
@@ -218,11 +223,7 @@ import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "elem
import { useDebounceFn } from "@vueuse/core"; import { useDebounceFn } from "@vueuse/core";
import MenuAPI from "@/api/system/menu"; import MenuAPI from "@/api/system/menu";
import TenantPlanAPI from "@/api/system/tenant-plan"; import TenantPlanAPI from "@/api/system/tenant-plan";
import type { import type { TenantPlanForm, TenantPlanItem } from "@/api/system/tenant-plan";
TenantPlanForm,
TenantPlanItem,
TenantPlanQueryParams,
} from "@/api/system/tenant-plan";
import type { OptionItem } from "@/api/common"; import type { OptionItem } from "@/api/common";
import { MenuScopeEnum } from "@/enums/business"; import { MenuScopeEnum } from "@/enums/business";
@@ -232,19 +233,21 @@ const dataFormRef = ref<FormInstance>();
const dataTableRef = ref(); const dataTableRef = ref();
const menuTreeRef = ref(); const menuTreeRef = ref();
// 查询参数
const queryParams = reactive<TenantPlanQueryParams>({
pageNum: 1,
pageSize: 10,
keywords: "",
});
// 列表数据 // 列表数据
const pageData = ref<TenantPlanItem[]>([]);
const menuPermOptions = ref<OptionItem[]>([]); const menuPermOptions = ref<OptionItem[]>([]);
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const tableData = reactive<PageResult<TenantPlanItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
keywords: "",
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
title: "", title: "",
@@ -280,10 +283,10 @@ const menuParentChildLinked = ref(true);
*/ */
function fetchData(): void { function fetchData(): void {
loading.value = true; loading.value = true;
TenantPlanAPI.getPage(queryParams) TenantPlanAPI.getPage(tableData.params)
.then((data) => { .then((data) => {
pageData.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
}) })
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
@@ -294,7 +297,7 @@ function fetchData(): void {
* 查询按钮点击事件 * 查询按钮点击事件
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }
@@ -303,7 +306,7 @@ function handleQuery(): void {
*/ */
function handleResetQuery(): void { function handleResetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchData(); fetchData();
} }

View File

@@ -4,17 +4,17 @@
<el-row :gutter="20"> <el-row :gutter="20">
<!-- 部门树 --> <!-- 部门树 -->
<el-col :lg="4" :xs="24" class="page-aside"> <el-col :lg="4" :xs="24" class="page-aside">
<UserDeptTree v-model="queryParams.deptId" @node-click="handleQuery" /> <UserDeptTree v-model="tableData.params.deptId" @node-click="handleQuery" />
</el-col> </el-col>
<!-- 用户列表 --> <!-- 用户列表 -->
<el-col :lg="20" :xs="24" class="page-main"> <el-col :lg="20" :xs="24" class="page-main">
<!-- 搜索区域 --> <!-- 搜索区域 -->
<el-card shadow="never" class="page-search"> <el-card shadow="never" class="page-search">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="auto"> <el-form ref="queryFormRef" :model="tableData.params" :inline="true" label-width="auto">
<el-form-item label="关键字" prop="keywords"> <el-form-item label="关键字" prop="keywords">
<el-input <el-input
v-model="queryParams.keywords" v-model="tableData.params.keywords"
placeholder="用户名/昵称/手机号" placeholder="用户名/昵称/手机号"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
@@ -23,7 +23,7 @@
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select <el-select
v-model="queryParams.status" v-model="tableData.params.status"
placeholder="全部" placeholder="全部"
clearable clearable
style="width: 100px" style="width: 100px"
@@ -35,7 +35,7 @@
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="tableData.params.createTime"
:editable="false" :editable="false"
type="daterange" type="daterange"
range-separator="~" range-separator="~"
@@ -86,7 +86,7 @@
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="userList" :data="tableData.list"
border border
stripe stripe
highlight-current-row highlight-current-row
@@ -150,10 +150,10 @@
</el-table> </el-table>
<pagination <pagination
v-if="total > 0" v-if="tableData.total > 0"
v-model:total="total" v-model:total="tableData.total"
v-model:page="queryParams.pageNum" v-model:page="tableData.params.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="tableData.params.pageSize"
@pagination="fetchList" @pagination="fetchList"
/> />
</el-card> </el-card>
@@ -244,7 +244,7 @@
import { computed, onMounted, reactive, ref } from "vue"; import { computed, onMounted, reactive, ref } from "vue";
import { useDebounceFn } from "@vueuse/core"; import { useDebounceFn } from "@vueuse/core";
import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "element-plus"; import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from "element-plus";
import type { UserForm, UserQueryParams, UserItem } from "@/api/system/user"; import type { UserForm, UserItem } from "@/api/system/user";
import { downloadFile } from "@/utils"; import { downloadFile } from "@/utils";
import UserAPI from "@/api/system/user"; import UserAPI from "@/api/system/user";
import DeptAPI from "@/api/system/dept"; import DeptAPI from "@/api/system/dept";
@@ -267,17 +267,18 @@ const userStore = useUserStore();
const queryFormRef = ref<FormInstance>(); const queryFormRef = ref<FormInstance>();
const userFormRef = ref<FormInstance>(); const userFormRef = ref<FormInstance>();
// 查询参数
const queryParams = reactive<UserQueryParams>({
pageNum: 1,
pageSize: 10,
});
// 列表数据
const userList = ref<UserItem[]>([]);
const total = ref(0);
const loading = ref(false); const loading = ref(false);
const tableData = reactive<PageResult<UserItem>>({
list: [],
total: 0,
params: {
//查询参数
pageNum: 1,
pageSize: 10,
},
});
// 弹窗状态 // 弹窗状态
const dialogState = reactive({ const dialogState = reactive({
visible: false, visible: false,
@@ -317,9 +318,9 @@ const rules: FormRules = {
async function fetchList(): Promise<void> { async function fetchList(): Promise<void> {
loading.value = true; loading.value = true;
try { try {
const data = await UserAPI.getPage(queryParams); const data = await UserAPI.getPage(tableData.params);
userList.value = data.list; tableData.list = data.list ?? [];
total.value = data.total ?? 0; tableData.total = data.total ?? 0;
} finally { } finally {
loading.value = false; loading.value = false;
} }
@@ -341,7 +342,7 @@ const { selectedIds, hasSelection, handleSelectionChange } = useTableSelection<U
* 执行查询(重置页码) * 执行查询(重置页码)
*/ */
function handleQuery(): void { function handleQuery(): void {
queryParams.pageNum = 1; tableData.params.pageNum = 1;
fetchList(); fetchList();
} }
@@ -350,8 +351,8 @@ function handleQuery(): void {
*/ */
function resetQuery(): void { function resetQuery(): void {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.deptId = undefined; tableData.params.deptId = undefined;
queryParams.createTime = undefined; tableData.params.createTime = undefined;
} }
/** /**
@@ -512,7 +513,7 @@ function handleDelete(id?: string): void {
* 导出用户列表 * 导出用户列表
*/ */
async function exportUsers(): Promise<void> { async function exportUsers(): Promise<void> {
const response = await UserAPI.export(queryParams); const response = await UserAPI.export(tableData.params);
downloadFile(response); downloadFile(response);
ElMessage.success("导出成功"); ElMessage.success("导出成功");
} }