6 Commits

7 changed files with 56 additions and 23 deletions

View File

@ -31,7 +31,8 @@
"vue.server.hybridMode": true,
"files.exclude": { "/docs": true },
"search.exclude": {
"/docs": true
"/docs": true,
"**/dist/**": true
},
"cSpell.words": ["Axios", "tinymce"]
}

View File

@ -4,5 +4,6 @@ export enum SetupStoreId {
Auth = 'auth-store',
Route = 'route-store',
Tab = 'tab-store',
Notice = 'notice-store'
Notice = 'notice-store',
Dict = 'dict-store'
}

View File

@ -8,6 +8,7 @@ import { localStg } from '@/utils/storage';
import { SetupStoreId } from '@/enum';
import { useRouteStore } from '../route';
import { useTabStore } from '../tab';
import useNoticeStore from '../notice';
import { clearAuthStorage, getToken } from './shared';
export const useAuthStore = defineStore(SetupStoreId.Auth, () => {
@ -15,6 +16,7 @@ export const useAuthStore = defineStore(SetupStoreId.Auth, () => {
const authStore = useAuthStore();
const routeStore = useRouteStore();
const tabStore = useTabStore();
const noticeStore = useNoticeStore();
const { toLogin, redirectFromLogin } = useRouterPush(false);
const { loading: loginLoading, startLoading, endLoading } = useLoading();
@ -48,6 +50,7 @@ export const useAuthStore = defineStore(SetupStoreId.Auth, () => {
await toLogin();
}
noticeStore.clearNotice();
tabStore.cacheTabs();
routeStore.resetStore();
}

View File

@ -1,8 +1,9 @@
import { ref } from 'vue';
import { defineStore } from 'pinia';
import { $t } from '@/locales';
import { SetupStoreId } from '@/enum';
export const useDictStore = defineStore('dict', () => {
export const useDictStore = defineStore(SetupStoreId.Dict, () => {
const dictData = ref<{ [key: string]: Api.System.DictData[] }>({});
const getDict = (key: string) => {

View File

@ -38,6 +38,8 @@ const visible = defineModel<boolean>('visible', {
default: false
});
const defaultIcon = import.meta.env.VITE_MENU_ICON;
const iconType = ref<Api.System.IconType>('1');
const { formRef, validate, restoreValidation } = useNaiveForm();
const { createRequiredRule, createNumberRequiredRule } = useFormRules();
@ -69,7 +71,7 @@ function createDefaultModel(): Model {
visible: '0',
status: '0',
perms: '',
icon: undefined,
icon: defaultIcon,
remark: ''
};
}
@ -118,6 +120,7 @@ const localIconOptions = localIcons.map<SelectOption>(item => ({
function handleInitModel() {
queryList.value = [];
iconType.value = '1';
Object.assign(model, createDefaultModel());
if (props.operateType === 'edit' && props.rowData) {
@ -208,7 +211,7 @@ async function handleSubmit() {
visible: menuVisible,
status,
perms,
icon,
icon: icon || defaultIcon,
component: processComponent(component),
remark
};

View File

@ -323,11 +323,11 @@ function handleResetSearch() {
}
:deep(.n-tree-node) {
height: 33px;
height: 30px;
}
:deep(.n-tree-node-switcher) {
height: 33px;
height: 30px;
}
:deep(.n-tree-node-switcher__icon) {

View File

@ -1,6 +1,6 @@
<script setup lang="tsx">
import { computed, ref } from 'vue';
import { NButton, NDivider } from 'naive-ui';
import { NAvatar, NButton, NDivider, NEllipsis } from 'naive-ui';
import { useBoolean, useLoading } from '@sa/hooks';
import { jsonClone } from '@sa/utils';
import { fetchBatchDeleteUser, fetchGetDeptTree, fetchGetUserList, fetchUpdateUserStatus } from '@/service/api/system';
@ -12,6 +12,7 @@ import { useDownload } from '@/hooks/business/download';
import ButtonIcon from '@/components/custom/button-icon.vue';
import { $t } from '@/locales';
import StatusSwitch from '@/components/custom/status-switch.vue';
import DictTag from '@/components/custom/dict-tag.vue';
import UserOperateDrawer from './modules/user-operate-drawer.vue';
import UserImportModal from './modules/user-import-modal.vue';
import UserPasswordDrawer from './modules/user-password-drawer.vue';
@ -65,41 +66,64 @@ const {
key: 'index',
title: $t('common.index'),
align: 'center',
width: 64
width: 48
},
{
key: 'userName',
title: $t('page.system.user.userName'),
align: 'center',
minWidth: 120,
ellipsis: true
align: 'left',
width: 200,
ellipsis: true,
render: row => {
return (
<div class="flex items-center justify-center gap-2">
<NAvatar src={row.avatar} class="bg-primary">
{row.avatar ? undefined : row.nickName.charAt(0)}
</NAvatar>
<div class="max-w-160px flex flex-col">
<NEllipsis>{row.userName}</NEllipsis>
<NEllipsis>{row.nickName}</NEllipsis>
</div>
</div>
);
}
},
{
key: 'nickName',
title: $t('page.system.user.nickName'),
key: 'sex',
title: $t('page.system.user.sex'),
align: 'center',
minWidth: 120,
ellipsis: true
width: 80,
ellipsis: true,
render(row) {
return <DictTag value={row.sex} dictCode="sys_user_sex" />;
}
},
{
key: 'deptName',
title: $t('page.system.user.deptName'),
align: 'center',
minWidth: 120,
width: 120,
ellipsis: true
},
{
key: 'email',
title: $t('page.system.user.email'),
align: 'center',
width: 120,
ellipsis: true
},
{
key: 'phonenumber',
title: $t('page.system.user.phonenumber'),
align: 'center',
minWidth: 120,
width: 120,
ellipsis: true
},
{
key: 'status',
title: $t('page.system.user.status'),
align: 'center',
minWidth: 80,
width: 80,
render(row) {
return (
<StatusSwitch
@ -115,7 +139,7 @@ const {
key: 'createTime',
title: $t('page.system.user.createTime'),
align: 'center',
minWidth: 120
width: 120
},
{
key: 'operate',
@ -341,7 +365,7 @@ function handleResetSearch() {
:data="data"
size="small"
:flex-height="!appStore.isMobile"
:scroll-x="962"
:scroll-x="1200"
:loading="loading"
remote
:row-key="row => row.userId"
@ -391,11 +415,11 @@ function handleResetSearch() {
}
:deep(.n-tree-node) {
height: 25px;
height: 30px;
}
:deep(.n-tree-node-switcher) {
height: 25px;
height: 30px;
}
:deep(.n-tree-node-switcher__icon) {