This commit is contained in:
AN
2025-08-07 20:36:14 +08:00
10 changed files with 65 additions and 32 deletions

View File

@ -21,27 +21,27 @@ const attrs: SelectProps = useAttrs();
const { loading: postLoading, startLoading: startPostLoading, endLoading: endPostLoading } = useLoading(); const { loading: postLoading, startLoading: startPostLoading, endLoading: endPostLoading } = useLoading();
/** the enabled role options */ /** the enabled post options */
const roleOptions = ref<CommonType.Option<CommonType.IdType>[]>([]); const postOptions = ref<CommonType.Option<CommonType.IdType>[]>([]);
watch( watch(
() => props.deptId, () => props.deptId,
() => { () => {
if (!props.deptId) { if (!props.deptId) {
roleOptions.value = []; postOptions.value = [];
return; return;
} }
getRoleOptions(); getPostOptions();
}, },
{ immediate: true } { immediate: true }
); );
async function getRoleOptions() { async function getPostOptions() {
startPostLoading(); startPostLoading();
const { error, data } = await fetchGetPostSelect(props.deptId!); const { error, data } = await fetchGetPostSelect(props.deptId!);
if (!error) { if (!error) {
roleOptions.value = data.map(item => ({ postOptions.value = data.map(item => ({
label: item.postName, label: item.postName,
value: item.postId value: item.postId
})); }));
@ -54,7 +54,7 @@ async function getRoleOptions() {
<NSelect <NSelect
v-model:value="value" v-model:value="value"
:loading="postLoading" :loading="postLoading"
:options="roleOptions" :options="postOptions"
v-bind="attrs" v-bind="attrs"
placeholder="请选择岗位" placeholder="请选择岗位"
/> />

View File

@ -77,7 +77,7 @@ export const request = createFlatRequest<App.Service.Response, RequestInstanceSt
// when the backend response code is in `modalLogoutCodes`, it means the user will be logged out by displaying a modal // when the backend response code is in `modalLogoutCodes`, it means the user will be logged out by displaying a modal
const modalLogoutCodes = import.meta.env.VITE_SERVICE_MODAL_LOGOUT_CODES?.split(',') || []; const modalLogoutCodes = import.meta.env.VITE_SERVICE_MODAL_LOGOUT_CODES?.split(',') || [];
if (modalLogoutCodes.includes(responseCode) && isLogin) { if (modalLogoutCodes.includes(responseCode) && isLogin) {
const isExist = request.state.errMsgStack && request.state.errMsgStack.includes(response.data.msg); const isExist = request.state.errMsgStack?.includes(response.data.msg);
if (isExist) { if (isExist) {
return null; return null;
} }
@ -85,23 +85,24 @@ export const request = createFlatRequest<App.Service.Response, RequestInstanceSt
logoutAndCleanup(); logoutAndCleanup();
return null; return null;
} }
request.state.errMsgStack = [...(request.state.errMsgStack || []), response.data.msg]; request.state.errMsgStack = [...(request.state.errMsgStack || []), response.data.msg];
// prevent the user from refreshing the page
window.addEventListener('beforeunload', handleLogout);
window.$dialog?.warning({ window.$dialog?.warning({
title: '系统提示', title: '系统提示',
content: '登录状态已过期,您可以继续留在该页面,或者重新登录', content: '登录状态已过期,重新登录',
positiveText: '重新登录', positiveText: '重新登录',
negativeText: '取消',
maskClosable: false, maskClosable: false,
closeOnEsc: false, closeOnEsc: false,
onAfterEnter() {
// prevent the user from refreshing the page
window.addEventListener('beforeunload', handleLogout);
},
onPositiveClick() { onPositiveClick() {
logoutAndCleanup(); logoutAndCleanup();
}, },
onClose() { onClose() {
window.removeEventListener('beforeunload', handleLogout); logoutAndCleanup();
request.state.errMsgStack = request.state.errMsgStack.filter(msg => msg !== response.data.msg);
} }
}); });
request.cancelAllRequest(); request.cancelAllRequest();

View File

@ -164,6 +164,8 @@ declare namespace Api {
postIds: string[]; postIds: string[];
/** user role ids */ /** user role ids */
roleIds: string[]; roleIds: string[];
/** roles */
roles: Role[];
}; };
/** user list */ /** user list */

View File

@ -21,9 +21,12 @@ const dateRangeCreateTime = ref<[string, string] | null>(null);
const model = defineModel<Api.System.ConfigSearchParams>('model', { required: true }); const model = defineModel<Api.System.ConfigSearchParams>('model', { required: true });
function onDateRangeCreateTimeUpdate(value: [string, string] | null) { function onDateRangeCreateTimeUpdate(value: [string, string] | null) {
if (value?.length) { const params = model.value.params!;
model.value.params!.beginTime = value[0]; if (value && value.length === 2) {
model.value.params!.endTime = value[1]; [params.beginTime, params.endTime] = value;
} else {
params.beginTime = undefined;
params.endTime = undefined;
} }
} }

View File

@ -21,9 +21,12 @@ const dateRangeCreateTime = ref<[string, string] | null>(null);
const model = defineModel<Api.System.OssSearchParams>('model', { required: true }); const model = defineModel<Api.System.OssSearchParams>('model', { required: true });
function onDateRangeCreateTimeUpdate(value: [string, string] | null) { function onDateRangeCreateTimeUpdate(value: [string, string] | null) {
if (value?.length) { const params = model.value.params!;
model.value.params!.beginCreateTime = value[0]; if (value && value.length === 2) {
model.value.params!.endCreateTime = value[1]; [params.beginTime, params.endTime] = value;
} else {
params.beginTime = undefined;
params.endTime = undefined;
} }
} }

View File

@ -168,9 +168,12 @@ const dateRangeCreateTime = ref<[string, string] | null>(null);
const datePickerRef = ref<InstanceType<typeof NDatePicker>>(); const datePickerRef = ref<InstanceType<typeof NDatePicker>>();
function onDateRangeCreateTimeUpdate(value: [string, string] | null) { function onDateRangeCreateTimeUpdate(value: [string, string] | null) {
if (value?.length) { const params = searchParams.params!;
searchParams.params!.beginTime = value[0]; if (value && value.length === 2) {
searchParams.params!.endTime = value[1]; [params.beginTime, params.endTime] = value;
} else {
params.beginTime = undefined;
params.endTime = undefined;
} }
} }

View File

@ -24,9 +24,12 @@ const model = defineModel<Api.System.RoleSearchParams>('model', { required: true
const { options: sysNormalDisableOptions } = useDict('sys_normal_disable', false); const { options: sysNormalDisableOptions } = useDict('sys_normal_disable', false);
function onDateRangeCreateTimeUpdate(value: [string, string] | null) { function onDateRangeCreateTimeUpdate(value: [string, string] | null) {
if (value?.length) { const params = model.value.params!;
model.value.params!.beginTime = `${value[0]} 00:00:00`; if (value && value.length === 2) {
model.value.params!.endTime = `${value[1]} 23:59:59`; [params.beginTime, params.endTime] = value;
} else {
params.beginTime = undefined;
params.endTime = undefined;
} }
} }

View File

@ -48,6 +48,7 @@ function closeDrawer() {
} }
async function handleSubmit() { async function handleSubmit() {
console.log(data.value);
fileList.value.forEach(item => { fileList.value.forEach(item => {
item.status = 'pending'; item.status = 'pending';
}); });
@ -91,6 +92,7 @@ function handleDownloadTemplate() {
watch(visible, () => { watch(visible, () => {
if (visible.value) { if (visible.value) {
data.value.updateSupport = false;
fileList.value = []; fileList.value = [];
success.value = false; success.value = false;
message.value = ''; message.value = '';
@ -140,7 +142,7 @@ watch(visible, () => {
</NUploadDragger> </NUploadDragger>
</NUpload> </NUpload>
<div class="flex-center"> <div class="flex-center">
<NCheckbox v-model="data.updateSupport">{{ $t('common.updateExisting') }}</NCheckbox> <NCheckbox v-model:checked="data.updateSupport">{{ $t('common.updateExisting') }}</NCheckbox>
</div> </div>
<NAlert v-if="message" :title="$t('common.importResult')" :type="success ? 'success' : 'error'" :bordered="false"> <NAlert v-if="message" :title="$t('common.importResult')" :type="success ? 'success' : 'error'" :bordered="false">

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, reactive, watch } from 'vue'; import { computed, reactive, ref, watch } from 'vue';
import { useLoading } from '@sa/hooks'; import { useLoading } from '@sa/hooks';
import { fetchCreateUser, fetchGetUserInfo, fetchUpdateUser } from '@/service/api/system'; import { fetchCreateUser, fetchGetUserInfo, fetchUpdateUser } from '@/service/api/system';
import { useFormRules, useNaiveForm } from '@/hooks/common/form'; import { useFormRules, useNaiveForm } from '@/hooks/common/form';
@ -49,6 +49,8 @@ type Model = Api.System.UserOperateParams;
const model: Model = reactive(createDefaultModel()); const model: Model = reactive(createDefaultModel());
const roleOptions = ref<CommonType.Option<CommonType.IdType>[]>([]);
function createDefaultModel(): Model { function createDefaultModel(): Model {
return { return {
deptId: null, deptId: null,
@ -82,6 +84,10 @@ async function getUserInfo() {
if (!error) { if (!error) {
model.roleIds = data.roleIds; model.roleIds = data.roleIds;
model.postIds = data.postIds; model.postIds = data.postIds;
roleOptions.value = data.roles.map(role => ({
label: role.roleName,
value: role.roleId
}));
} }
endLoading(); endLoading();
} }
@ -209,7 +215,14 @@ watch(visible, () => {
<PostSelect v-model:value="model.postIds" :dept-id="model.deptId" multiple clearable /> <PostSelect v-model:value="model.postIds" :dept-id="model.deptId" multiple clearable />
</NFormItem> </NFormItem>
<NFormItem :label="$t('page.system.user.roleIds')" path="roleIds"> <NFormItem :label="$t('page.system.user.roleIds')" path="roleIds">
<RoleSelect v-model:value="model.roleIds" multiple clearable /> <NSelect
v-model:value="model.roleIds"
:loading="loading"
:options="roleOptions"
multiple
clearable
placeholder="请选择角色"
/>
</NFormItem> </NFormItem>
<NFormItem :label="$t('page.system.user.status')" path="status"> <NFormItem :label="$t('page.system.user.status')" path="status">
<DictRadio v-model:value="model.status" dict-code="sys_normal_disable" /> <DictRadio v-model:value="model.status" dict-code="sys_normal_disable" />

View File

@ -24,9 +24,12 @@ const datePickerRef = ref<InstanceType<typeof NDatePicker>>();
const model = defineModel<Api.System.UserSearchParams>('model', { required: true }); const model = defineModel<Api.System.UserSearchParams>('model', { required: true });
function onDateRangeCreateTimeUpdate(value: [string, string] | null) { function onDateRangeCreateTimeUpdate(value: [string, string] | null) {
if (value?.length) { const params = model.value.params!;
model.value.params!.beginTime = value[0]; if (value && value.length === 2) {
model.value.params!.endTime = value[1]; [params.beginTime, params.endTime] = value;
} else {
params.beginTime = undefined;
params.endTime = undefined;
} }
} }