用户管理+绘制管理的userName

This commit is contained in:
joylink_zhaoerwei 2024-09-26 13:08:07 +08:00
parent 320c1e92cc
commit 888bbc83d6
9 changed files with 325 additions and 12 deletions

View File

@ -41,6 +41,7 @@ export interface DraftItem {
createdAt: string;
updatedAt: string;
defaultReleaseDataName: string;
userName: string;
}
export interface IscsDataOptions {
style: IscsStyle;
@ -71,7 +72,7 @@ export async function draftPageQuery(
userDraftIscsDataPaging(paging: $paging, query: $query) {
total
items {
draftData {id name dataType userId defaultReleaseDataId createdAt updatedAt isShared defaultReleaseDataName}
draftData {id name dataType userName defaultReleaseDataId createdAt updatedAt isShared defaultReleaseDataName}
options {style}
}
}
@ -92,7 +93,7 @@ export async function sharedDraftPageQuery(
sharedDraftIscsDataPaging(paging: $paging, query: $query) {
total
items {
draftData {id name dataType userId defaultReleaseDataId createdAt updatedAt isShared defaultReleaseDataName}
draftData {id name dataType userName defaultReleaseDataId createdAt updatedAt isShared defaultReleaseDataName}
options {style}
}
}

View File

@ -14,6 +14,7 @@ export interface PublishItem {
createdAt: string;
updatedAt: string;
description: string;
userName: string;
}
interface PagingQueryParams {
@ -111,7 +112,7 @@ export async function publishPageQuery(
releaseIscsDataPaging(page: $page, query: $query) {
total
items {
releaseData {id name dataType usedVersionId userId isPublished createdAt updatedAt description }
releaseData {id name dataType usedVersionId userName isPublished createdAt updatedAt description }
options {style}
}
}
@ -163,7 +164,7 @@ export async function getPublishHistoryById(variables: {
releaseDataVersionPaging(dataId: $dataId, page: $page) {
total
items {
id releaseDataId description userId createdAt
id releaseDataId description userName createdAt
}
}
}

83
src/api/UserApi.ts Normal file
View File

@ -0,0 +1,83 @@
import { api } from 'src/boot/axios';
import { PageDto } from './ApiCommon';
export interface User {
id: string;
name: string;
mobile: string;
email: string;
roles: [];
createdAt: string;
updatedAt: string;
}
export interface PagingQueryParams {
page: {
page: number;
itemsPerPage: number;
};
query: {
id?: string;
name?: string;
mobile?: string;
email?: string;
roles?: [];
};
}
/**
*
* @param params
* @returns
*/
export async function userPageQuery(
params: PagingQueryParams
): Promise<PageDto<User>> {
const query = `
query userPaging($page: PageQueryDto, $query: UserQueryDto) {
userPaging(page: $page, query: $query) {
total
items {
id name mobile email roles createdAt updatedAt
}
}
}
`;
const response = await api.post('', {
query,
variables: params,
});
return response.data.data.userPaging;
}
/**
*
*/
export async function getLoginUserInfo() {
const query = `
query loginUserInfo {
loginUserInfo{
id
}
}
`;
const response = await api.post('', {
query,
});
return response.data.data;
}
/**
*
*/
export async function syncUsersInfo() {
const mutation = `
mutation syncUser {
syncUser
}
`;
const response = await api.post('', {
query: mutation,
});
return response.data.data;
}

View File

@ -126,12 +126,17 @@ import SysMenu from 'src/components/SysMenu.vue';
import { useRoute } from 'vue-router';
import { clearJwtToken, saveJwtToken } from 'src/configs/TokenManage';
import { Dialog } from 'quasar';
import { getLoginUserInfo } from 'src/api/UserApi';
import { useAuthStore } from 'src/stores/auth-store';
const route = useRoute();
const authStore = useAuthStore();
onMounted(() => {
onMounted(async () => {
if (route.params.token) {
saveJwtToken(route.params.token as string);
const res = await getLoginUserInfo();
authStore.setUserId(res.loginUserInfo.id);
}
});

View File

@ -315,9 +315,9 @@ const columnDefs: QTableColumn[] = [
align: 'center',
},
{
name: 'userId',
name: 'userName',
label: '创建人',
field: 'userId',
field: 'userName',
align: 'center',
},
{
@ -648,6 +648,7 @@ const draftInfo = ref<DraftItem>({
createdAt: '',
updatedAt: '',
defaultReleaseDataName: '',
userName: '',
});
const publishColumnDefs: QTableColumn[] = [

View File

@ -206,9 +206,9 @@ const columnDefs: QTableColumn[] = [
align: 'center',
},
{
name: 'userId',
name: 'userName',
label: '发布人',
field: 'userId',
field: 'userName',
align: 'center',
},
{
@ -437,13 +437,14 @@ const historyInfo = ref<PublishItem>({
createdAt: '',
updatedAt: '',
description: '',
userName: '',
});
const historyColumnDefs: QTableColumn[] = [
{
name: 'userId',
name: 'userName',
label: '发布人',
field: 'userId',
field: 'userName',
required: true,
align: 'center',
},

200
src/pages/UserManage.vue Normal file
View File

@ -0,0 +1,200 @@
<template>
<div class="q-pa-md">
<q-table
ref="tableRef"
title="用户列表"
:style="{ height: tableHeight + 'px' }"
class="my-sticky-virtscroll-table"
:rows="rows"
:columns="columnDefs"
row-key="id"
v-model:pagination="pagination"
:rows-per-page-options="[10, 20, 50, 100]"
:loading="loading"
:filter="filter"
binary-state-sort
@request="onRequest"
>
<template v-slot:top-right>
<div class="q-gutter-md q-mt-none row justify-center items-start">
<q-input dense debounce="1000" v-model="filter.name" label="名称" />
<q-select
dense
v-model="filter.roles"
:options="rolesOptions"
multiple
emit-value
map-options
options-dense
label="角色"
style="min-width: 150px"
/>
<q-btn
:disable="operateDisabled"
color="primary"
label="同步"
@click="syncUsersInfoFn"
/>
</div>
</template>
<template v-slot:body-cell-roles="props">
<q-td :props="props">
<div class="q-gutter-sm row justify-center">
<q-chip
outline
size="sm"
color="primary"
v-for="(item, index) in props.row.roles"
:key="index"
>
{{ getRolesName(item) }}
</q-chip>
</div>
</q-td>
</template>
</q-table>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, computed } from 'vue';
import { useQuasar, type QTableColumn } from 'quasar';
import {
PagingQueryParams,
userPageQuery,
syncUsersInfo,
} from '../api/UserApi';
import { ApiError } from 'src/boot/axios';
const $q = useQuasar();
const props = withDefaults(
defineProps<{
sizeHeight: number;
}>(),
{ sizeHeight: 500 }
);
const tableHeight = computed(() => {
return props.sizeHeight - 32;
});
onMounted(() => {
tableRef.value.requestServerInteraction();
});
const columnDefs: QTableColumn[] = [
{ name: 'id', label: '用户ID', field: 'id', align: 'center' },
{
name: 'name',
label: '用户名',
field: 'name',
required: true,
align: 'center',
},
{
name: 'roles',
label: '角色',
field: 'roles',
required: true,
align: 'center',
},
{
name: 'mobile',
label: '手机号',
field: 'mobile',
align: 'center',
},
{
name: 'email',
label: '邮箱',
field: 'email',
align: 'center',
},
{
name: 'createdAt',
label: '创建时间',
field: (row) => new Date(row.createdAt).toLocaleString(),
align: 'center',
},
{
name: 'updatedAt',
label: '更新时间',
field: (row) => new Date(row.updatedAt).toLocaleString(),
align: 'center',
},
];
const tableRef = ref();
const rows = reactive([]);
const filter = reactive({
name: '',
roles: [],
});
const loading = ref(false);
const pagination = ref({
sortBy: 'desc',
descending: false,
page: 1,
rowsPerPage: 10,
rowsNumber: 10,
});
// eslint-disable-next-line
async function onRequest(props: any) {
const { page, rowsPerPage } = props.pagination;
const filter = props.filter;
loading.value = true;
const variables: PagingQueryParams = {
page: {
page: page,
itemsPerPage: rowsPerPage,
},
query: {},
};
if (filter.name) {
Object.assign(variables.query, { name: filter.name });
}
if (filter.roles) {
Object.assign(variables.query, { roles: filter.roles });
}
try {
const response = await userPageQuery(variables);
pagination.value.rowsNumber = response.total;
pagination.value.page = page;
pagination.value.rowsPerPage = rowsPerPage;
rows.splice(0, rows.length, ...(response.items as []));
} catch (err) {
const error = err as ApiError;
$q.notify({
type: 'negative',
message: error.title,
});
} finally {
loading.value = false;
}
}
const rolesOptions = [
{ label: '管理员', value: 'ADMIN' },
{ label: '用户', value: 'USER' },
];
function getRolesName(role: string) {
for (let i = 0; i < rolesOptions.length; i++) {
if (rolesOptions[i].value == role) {
return rolesOptions[i].label;
}
}
}
const operateDisabled = ref(false);
async function syncUsersInfoFn() {
operateDisabled.value = true;
const res = await syncUsersInfo();
operateDisabled.value = false;
if (res.syncUser) {
tableRef.value.requestServerInteraction();
}
}
</script>

View File

@ -17,6 +17,27 @@ const routes: RouteRecordRaw[] = [
// children: [{ path: '', component: () => import('pages/IndexPage.vue') }],
},
{
path: '/sysManage',
name: 'sysManage',
component: () => import('layouts/MainLayout.vue'),
meta: {
label: '系统管理',
icon: 'dataset',
},
children: [
{
path: 'user',
name: 'user',
meta: {
label: '用户管理',
icon: 'manage_accounts',
},
component: () => import('pages/UserManage.vue'),
},
],
},
{
path: '/dataManage',
name: 'dataManage',

View File

@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
export const useAuthStore = defineStore('auth', {
state: () => ({
userId: 8160 as number | null,
userId: null as number | null,
}),
actions: {
setUserId(id: number | null) {