!68 修复升级依赖带来的问题
* Merge remote-tracking branch 'origin/dev' into dev * 升级依赖 * Merge remote-tracking branch 'origin/ts' into ts * 升级依赖 * Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts * 升级依赖 * !61 fix: 删除重复环境变量ElUploadInstance * fix: 删除重复环境变量ElUploadInstance
This commit is contained in:
parent
b06f6a316b
commit
f32a7105c3
@ -4,7 +4,7 @@
|
|||||||
"useTabs": false,
|
"useTabs": false,
|
||||||
"semi": true,
|
"semi": true,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"quoteProps": "as-needed",
|
"quoteProps": "preserve",
|
||||||
"jsxSingleQuote": false,
|
"jsxSingleQuote": false,
|
||||||
"bracketSameLine": false,
|
"bracketSameLine": false,
|
||||||
"trailingComma": "none",
|
"trailingComma": "none",
|
||||||
|
20
package.json
20
package.json
@ -18,19 +18,19 @@
|
|||||||
"url": "https://gitee.com/JavaLionLi/plus-ui.git"
|
"url": "https://gitee.com/JavaLionLi/plus-ui.git"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@element-plus/icons-vue": "2.1.0",
|
"@element-plus/icons-vue": "2.3.1",
|
||||||
"@vueup/vue-quill": "1.2.0",
|
"@vueup/vue-quill": "1.2.0",
|
||||||
"@vueuse/core": "10.7.0",
|
"@vueuse/core": "10.7.0",
|
||||||
"animate.css": "4.1.1",
|
"animate.css": "4.1.1",
|
||||||
"await-to-js": "^3.0.0",
|
"await-to-js": "^3.0.0",
|
||||||
"axios": "^1.3.4",
|
"axios": "^1.3.4",
|
||||||
"crypto-js": "^4.1.1",
|
"crypto-js": "^4.1.1",
|
||||||
"echarts": "5.4.0",
|
"echarts": "5.4.3",
|
||||||
"element-plus": "2.4.3",
|
"element-plus": "2.4.3",
|
||||||
"file-saver": "2.0.5",
|
"file-saver": "2.0.5",
|
||||||
"fuse.js": "6.6.2",
|
"fuse.js": "6.6.2",
|
||||||
"js-cookie": "3.0.1",
|
"js-cookie": "3.0.5",
|
||||||
"jsencrypt": "3.3.1",
|
"jsencrypt": "3.3.2",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"path-browserify": "1.0.1",
|
"path-browserify": "1.0.1",
|
||||||
"path-to-regexp": "6.2.0",
|
"path-to-regexp": "6.2.0",
|
||||||
@ -38,14 +38,14 @@
|
|||||||
"screenfull": "6.0.0",
|
"screenfull": "6.0.0",
|
||||||
"vform3-builds": "3.0.8",
|
"vform3-builds": "3.0.8",
|
||||||
"vue": "3.3.11",
|
"vue": "3.3.11",
|
||||||
"vue-cropper": "1.0.3",
|
"vue-cropper": "1.1.1",
|
||||||
"vue-i18n": "9.2.2",
|
"vue-i18n": "9.2.2",
|
||||||
"vue-router": "4.2.5",
|
"vue-router": "4.2.5",
|
||||||
"vue-types": "5.1.1"
|
"vue-types": "5.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@iconify/json": "^2.2.40",
|
"@iconify/json": "^2.2.157",
|
||||||
"@intlify/unplugin-vue-i18n": "0.8.2",
|
"@intlify/unplugin-vue-i18n": "1.6.0",
|
||||||
"@types/crypto-js": "^4.1.1",
|
"@types/crypto-js": "^4.1.1",
|
||||||
"@types/file-saver": "2.0.5",
|
"@types/file-saver": "2.0.5",
|
||||||
"@types/js-cookie": "3.0.3",
|
"@types/js-cookie": "3.0.3",
|
||||||
@ -57,7 +57,7 @@
|
|||||||
"@unocss/preset-attributify": "^0.58.0",
|
"@unocss/preset-attributify": "^0.58.0",
|
||||||
"@unocss/preset-icons": "^0.58.0",
|
"@unocss/preset-icons": "^0.58.0",
|
||||||
"@unocss/preset-uno": "^0.58.0",
|
"@unocss/preset-uno": "^0.58.0",
|
||||||
"@vue/compiler-sfc": "3.2.45",
|
"@vue/compiler-sfc": "3.3.9",
|
||||||
"@vitejs/plugin-vue": "4.5.2",
|
"@vitejs/plugin-vue": "4.5.2",
|
||||||
"autoprefixer": "10.4.14",
|
"autoprefixer": "10.4.14",
|
||||||
"eslint": "8.55.0",
|
"eslint": "8.55.0",
|
||||||
@ -72,13 +72,13 @@
|
|||||||
"husky": "7.0.4",
|
"husky": "7.0.4",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"prettier": "3.1.1",
|
"prettier": "3.1.1",
|
||||||
"sass": "1.56.1",
|
"sass": "1.69.5",
|
||||||
"typescript": "5.2.2",
|
"typescript": "5.2.2",
|
||||||
"unocss": "^0.58.0",
|
"unocss": "^0.58.0",
|
||||||
"unplugin-auto-import": "0.17.2",
|
"unplugin-auto-import": "0.17.2",
|
||||||
"unplugin-icons": "0.18.1",
|
"unplugin-icons": "0.18.1",
|
||||||
"unplugin-vue-components": "0.26.0",
|
"unplugin-vue-components": "0.26.0",
|
||||||
"unplugin-vue-setup-extend-plus": "0.4.9",
|
"unplugin-vue-setup-extend-plus": "1.0.0",
|
||||||
"vite-plugin-compression": "0.5.1",
|
"vite-plugin-compression": "0.5.1",
|
||||||
"vite-plugin-svg-icons": "2.0.1",
|
"vite-plugin-svg-icons": "2.0.1",
|
||||||
"vitest": "^0.29.7",
|
"vitest": "^0.29.7",
|
||||||
|
@ -10,7 +10,7 @@ import { handleThemeStyle } from '@/utils/theme';
|
|||||||
import useAppStore from '@/store/modules/app';
|
import useAppStore from '@/store/modules/app';
|
||||||
|
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
const size = computed(() => appStore.size as any);
|
const size = computed(() => appStore.size);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
|
@ -18,7 +18,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
isView: false
|
isView: false
|
||||||
});
|
});
|
||||||
|
|
||||||
const vFormRef = ref(null);
|
const vFormRef = ref();
|
||||||
// 获取表单数据-异步
|
// 获取表单数据-异步
|
||||||
const getFormData = () => {
|
const getFormData = () => {
|
||||||
return vFormRef.value.getFormData();
|
return vFormRef.value.getFormData();
|
||||||
@ -29,7 +29,7 @@ const getFormData = () => {
|
|||||||
* @param {表单配置} formConf
|
* @param {表单配置} formConf
|
||||||
* formConfig:{ formTemplate:表单模板,formData:表单数据,hiddenField:需要隐藏的字段字符串集合,disabledField:需要禁用的自读字符串集合}
|
* formConfig:{ formTemplate:表单模板,formData:表单数据,hiddenField:需要隐藏的字段字符串集合,disabledField:需要禁用的自读字符串集合}
|
||||||
*/
|
*/
|
||||||
const initForm = (formConf) => {
|
const initForm = (formConf: any) => {
|
||||||
const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf);
|
const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf);
|
||||||
if (formTemplate) {
|
if (formTemplate) {
|
||||||
vFormRef.value.setFormJson(formTemplate);
|
vFormRef.value.setFormJson(formTemplate);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="relative" :style="{ width: width }">
|
<div class="relative" :style="{ 'width': width }">
|
||||||
<el-input v-model="modelValue" readonly placeholder="点击选择图标" @click="visible = !visible">
|
<el-input v-model="modelValue" readonly placeholder="点击选择图标" @click="visible = !visible">
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<svg-icon :icon-class="modelValue" />
|
<svg-icon :icon-class="modelValue" />
|
||||||
|
@ -37,7 +37,7 @@ const realSrcList = computed(() => {
|
|||||||
}
|
}
|
||||||
let real_src_list = props.src.split(',');
|
let real_src_list = props.src.split(',');
|
||||||
let srcList: string[] = [];
|
let srcList: string[] = [];
|
||||||
real_src_list.forEach((item) => {
|
real_src_list.forEach((item: string) => {
|
||||||
return srcList.push(item);
|
return srcList.push(item);
|
||||||
});
|
});
|
||||||
return srcList;
|
return srcList;
|
||||||
|
@ -27,7 +27,7 @@ const sizeOptions = ref([
|
|||||||
{ label: '稍小', value: 'small' }
|
{ label: '稍小', value: 'small' }
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const handleSetSize = (size: string) => {
|
const handleSetSize = (size: 'large' | 'default' | 'small') => {
|
||||||
appStore.setSize(size);
|
appStore.setSize(size);
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
5
src/enums/LanguageEnum.ts
Normal file
5
src/enums/LanguageEnum.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export enum LanguageEnum {
|
||||||
|
zh_CN = 'zh_CN',
|
||||||
|
|
||||||
|
en_US = 'en_US'
|
||||||
|
}
|
@ -4,6 +4,7 @@ import { createI18n } from 'vue-i18n';
|
|||||||
// 本地语言包
|
// 本地语言包
|
||||||
import enUSLocale from './en_US';
|
import enUSLocale from './en_US';
|
||||||
import zhCNLocale from './zh_CN';
|
import zhCNLocale from './zh_CN';
|
||||||
|
import { LanguageEnum } from '@/enums/LanguageEnum';
|
||||||
|
|
||||||
const messages = {
|
const messages = {
|
||||||
zh_CN: {
|
zh_CN: {
|
||||||
@ -18,12 +19,12 @@ const messages = {
|
|||||||
* 获取当前语言
|
* 获取当前语言
|
||||||
* @returns zh-cn|en ...
|
* @returns zh-cn|en ...
|
||||||
*/
|
*/
|
||||||
export const getLanguage = () => {
|
export const getLanguage = (): LanguageEnum => {
|
||||||
const language = useStorage('language', 'zh_CN');
|
const language = useStorage<LanguageEnum>('language', LanguageEnum.zh_CN);
|
||||||
if (language.value) {
|
if (language.value) {
|
||||||
return language.value;
|
return language.value;
|
||||||
}
|
}
|
||||||
return 'zh_CN';
|
return LanguageEnum.zh_CN;
|
||||||
};
|
};
|
||||||
|
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
|
@ -48,35 +48,35 @@
|
|||||||
<div class="drawer-item">
|
<div class="drawer-item">
|
||||||
<span>开启 TopNav</span>
|
<span>开启 TopNav</span>
|
||||||
<span class="comp-style">
|
<span class="comp-style">
|
||||||
<el-switch v-model="topNav" class="drawer-switch" />
|
<el-switch v-model="settingsStore.topNav" class="drawer-switch" @change="topNavChange" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-item">
|
<div class="drawer-item">
|
||||||
<span>开启 Tags-Views</span>
|
<span>开启 Tags-Views</span>
|
||||||
<span class="comp-style">
|
<span class="comp-style">
|
||||||
<el-switch v-model="tagsView" class="drawer-switch" />
|
<el-switch v-model="settingsStore.tagsView" class="drawer-switch" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-item">
|
<div class="drawer-item">
|
||||||
<span>固定 Header</span>
|
<span>固定 Header</span>
|
||||||
<span class="comp-style">
|
<span class="comp-style">
|
||||||
<el-switch v-model="fixedHeader" class="drawer-switch" />
|
<el-switch v-model="settingsStore.fixedHeader" class="drawer-switch" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-item">
|
<div class="drawer-item">
|
||||||
<span>显示 Logo</span>
|
<span>显示 Logo</span>
|
||||||
<span class="comp-style">
|
<span class="comp-style">
|
||||||
<el-switch v-model="sidebarLogo" class="drawer-switch" />
|
<el-switch v-model="settingsStore.sidebarLogo" class="drawer-switch" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="drawer-item">
|
<div class="drawer-item">
|
||||||
<span>动态标题</span>
|
<span>动态标题</span>
|
||||||
<span class="comp-style">
|
<span class="comp-style">
|
||||||
<el-switch v-model="dynamicTitle" class="drawer-switch" />
|
<el-switch v-model="settingsStore.dynamicTitle" class="drawer-switch" @change="dynamicTitleChange" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -93,8 +93,8 @@ import useAppStore from '@/store/modules/app';
|
|||||||
import useSettingsStore from '@/store/modules/settings';
|
import useSettingsStore from '@/store/modules/settings';
|
||||||
import usePermissionStore from '@/store/modules/permission';
|
import usePermissionStore from '@/store/modules/permission';
|
||||||
import { handleThemeStyle } from '@/utils/theme';
|
import { handleThemeStyle } from '@/utils/theme';
|
||||||
import { SettingTypeEnum } from '@/enums/SettingTypeEnum';
|
|
||||||
import { SideThemeEnum } from '@/enums/SideThemeEnum';
|
import { SideThemeEnum } from '@/enums/SideThemeEnum';
|
||||||
|
import defaultSettings from '@/settings';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
@ -113,92 +113,58 @@ const isDark = useDark({
|
|||||||
valueDark: 'dark',
|
valueDark: 'dark',
|
||||||
valueLight: 'light'
|
valueLight: 'light'
|
||||||
});
|
});
|
||||||
|
// 匹配菜单颜色
|
||||||
watch(isDark, () => {
|
watch(isDark, () => {
|
||||||
if (isDark.value) {
|
if (isDark.value) {
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK });
|
settingsStore.sideTheme = SideThemeEnum.DARK;
|
||||||
} else {
|
} else {
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: sideTheme.value });
|
settingsStore.sideTheme = sideTheme.value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const toggleDark = () => useToggle(isDark);
|
const toggleDark = () => useToggle(isDark);
|
||||||
|
|
||||||
/** 是否需要topNav */
|
const topNavChange = (val) => {
|
||||||
const topNav = computed({
|
if (!val) {
|
||||||
get: () => storeSettings.value.topNav,
|
appStore.toggleSideBarHide(false);
|
||||||
set: (val) => {
|
permissionStore.setSidebarRouters(permissionStore.defaultRoutes);
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.TOP_NAV, value: val });
|
|
||||||
if (!val) {
|
|
||||||
appStore.toggleSideBarHide(false);
|
|
||||||
permissionStore.setSidebarRouters(permissionStore.defaultRoutes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
/** 是否需要tagview */
|
|
||||||
const tagsView = computed({
|
const dynamicTitleChange = () => {
|
||||||
get: () => storeSettings.value.tagsView,
|
// 动态设置网页标题
|
||||||
set: (val) => {
|
useDynamicTitle();
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.TAGS_VIEW, value: val });
|
};
|
||||||
}
|
|
||||||
});
|
|
||||||
/**是否需要固定头部 */
|
|
||||||
const fixedHeader = computed({
|
|
||||||
get: () => storeSettings.value.fixedHeader,
|
|
||||||
set: (val) => {
|
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.FIXED_HEADER, value: val });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
/**是否需要侧边栏的logo */
|
|
||||||
const sidebarLogo = computed({
|
|
||||||
get: () => storeSettings.value.sidebarLogo,
|
|
||||||
set: (val) => {
|
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.SIDEBAR_LOGO, value: val });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
/**是否需要侧边栏的动态网页的title */
|
|
||||||
const dynamicTitle = computed({
|
|
||||||
get: () => storeSettings.value.dynamicTitle,
|
|
||||||
set: (val) => {
|
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.DYNAMIC_TITLE, value: val });
|
|
||||||
// 动态设置网页标题
|
|
||||||
useDynamicTitle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeChange = (val: string) => {
|
const themeChange = (val: string) => {
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.THEME, value: val });
|
settingsStore.theme = val;
|
||||||
theme.value = val;
|
handleThemeStyle(val);
|
||||||
if (val) {
|
|
||||||
handleThemeStyle(val);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
const handleTheme = (val: string) => {
|
const handleTheme = (val: string) => {
|
||||||
sideTheme.value = val;
|
sideTheme.value = val;
|
||||||
if (isDark.value && val === SideThemeEnum.LIGHT) {
|
if (isDark.value && val === SideThemeEnum.LIGHT) {
|
||||||
// 暗黑模式颜色不变
|
// 暗黑模式颜色不变
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK });
|
settingsStore.sideTheme = SideThemeEnum.DARK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: val });
|
settingsStore.sideTheme = val;
|
||||||
};
|
};
|
||||||
const saveSetting = () => {
|
const saveSetting = () => {
|
||||||
proxy?.$modal.loading('正在保存到本地,请稍候...');
|
proxy?.$modal.loading('正在保存到本地,请稍候...');
|
||||||
let layoutSetting = {
|
const settings = useStorage<LayoutSetting>('layout-setting', defaultSettings);
|
||||||
topNav: storeSettings.value.topNav,
|
settings.value.topNav = storeSettings.value.topNav;
|
||||||
tagsView: storeSettings.value.tagsView,
|
settings.value.tagsView = storeSettings.value.tagsView;
|
||||||
fixedHeader: storeSettings.value.fixedHeader,
|
settings.value.fixedHeader = storeSettings.value.fixedHeader;
|
||||||
sidebarLogo: storeSettings.value.sidebarLogo,
|
settings.value.sidebarLogo = storeSettings.value.sidebarLogo;
|
||||||
dynamicTitle: storeSettings.value.dynamicTitle,
|
settings.value.dynamicTitle = storeSettings.value.dynamicTitle;
|
||||||
sideTheme: storeSettings.value.sideTheme,
|
settings.value.sideTheme = storeSettings.value.sideTheme;
|
||||||
theme: storeSettings.value.theme
|
settings.value.theme = storeSettings.value.theme;
|
||||||
};
|
|
||||||
localStorage.setItem('layout-setting', JSON.stringify(layoutSetting));
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
proxy?.$modal.closeLoading();
|
proxy?.$modal.closeLoading();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
};
|
};
|
||||||
const resetSetting = () => {
|
const resetSetting = () => {
|
||||||
proxy?.$modal.loading('正在清除设置缓存并刷新,请稍候...');
|
proxy?.$modal.loading('正在清除设置缓存并刷新,请稍候...');
|
||||||
localStorage.removeItem('layout-setting');
|
useStorage<any>('layout-setting', null).value = null;
|
||||||
setTimeout('window.location.reload()', 1000);
|
setTimeout('window.location.reload()', 1000);
|
||||||
};
|
};
|
||||||
const openSetting = () => {
|
const openSetting = () => {
|
||||||
|
19
src/main.ts
19
src/main.ts
@ -14,10 +14,6 @@ import directive from './directive';
|
|||||||
|
|
||||||
// 注册插件
|
// 注册插件
|
||||||
import plugins from './plugins/index'; // plugins
|
import plugins from './plugins/index'; // plugins
|
||||||
import { download } from '@/utils/request';
|
|
||||||
|
|
||||||
// 预设动画
|
|
||||||
import animate from './animate';
|
|
||||||
|
|
||||||
// svg图标
|
// svg图标
|
||||||
import 'virtual:svg-icons-register';
|
import 'virtual:svg-icons-register';
|
||||||
@ -26,25 +22,10 @@ import ElementIcons from '@/plugins/svgicon';
|
|||||||
// permission control
|
// permission control
|
||||||
import './permission';
|
import './permission';
|
||||||
|
|
||||||
import { useDict } from '@/utils/dict';
|
|
||||||
import { getConfigKey, updateConfigByKey } from '@/api/system/config';
|
|
||||||
import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
|
|
||||||
|
|
||||||
// 国际化
|
// 国际化
|
||||||
import i18n from '@/lang/index';
|
import i18n from '@/lang/index';
|
||||||
|
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
// 全局方法挂载
|
|
||||||
app.config.globalProperties.useDict = useDict;
|
|
||||||
app.config.globalProperties.getConfigKey = getConfigKey;
|
|
||||||
app.config.globalProperties.updateConfigByKey = updateConfigByKey;
|
|
||||||
app.config.globalProperties.download = download;
|
|
||||||
app.config.globalProperties.parseTime = parseTime;
|
|
||||||
app.config.globalProperties.handleTree = handleTree;
|
|
||||||
app.config.globalProperties.addDateRange = addDateRange;
|
|
||||||
app.config.globalProperties.selectDictLabel = selectDictLabel;
|
|
||||||
app.config.globalProperties.selectDictLabels = selectDictLabels;
|
|
||||||
app.config.globalProperties.animate = animate;
|
|
||||||
|
|
||||||
app.use(ElementIcons);
|
app.use(ElementIcons);
|
||||||
app.use(router);
|
app.use(router);
|
||||||
|
@ -16,13 +16,13 @@ const whiteList = ['/login', '/register', '/social-callback'];
|
|||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
NProgress.start();
|
NProgress.start();
|
||||||
if (getToken()) {
|
if (getToken()) {
|
||||||
to.meta.title && useSettingsStore().setTitle(to.meta.title as string);
|
to.meta.title && useSettingsStore().setTitle(to.meta.title);
|
||||||
/* has token*/
|
/* has token*/
|
||||||
if (to.path === '/login') {
|
if (to.path === '/login') {
|
||||||
next({ path: '/' });
|
next({ path: '/' });
|
||||||
NProgress.done();
|
NProgress.done();
|
||||||
} else if (whiteList.indexOf(to.path) !== -1) {
|
} else if (whiteList.indexOf(to.path as string) !== -1) {
|
||||||
next()
|
next();
|
||||||
} else {
|
} else {
|
||||||
if (useUserStore().roles.length === 0) {
|
if (useUserStore().roles.length === 0) {
|
||||||
isRelogin.show = true;
|
isRelogin.show = true;
|
||||||
|
@ -3,6 +3,13 @@ import tab from './tab';
|
|||||||
import download from './download';
|
import download from './download';
|
||||||
import cache from './cache';
|
import cache from './cache';
|
||||||
import auth from './auth';
|
import auth from './auth';
|
||||||
|
// 预设动画
|
||||||
|
import animate from '@/animate';
|
||||||
|
|
||||||
|
import { download as dl } from '@/utils/request';
|
||||||
|
import { useDict } from '@/utils/dict';
|
||||||
|
import { getConfigKey, updateConfigByKey } from '@/api/system/config';
|
||||||
|
import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
|
||||||
|
|
||||||
import { App } from 'vue';
|
import { App } from 'vue';
|
||||||
|
|
||||||
@ -21,4 +28,16 @@ export default function installPlugin(app: App) {
|
|||||||
|
|
||||||
// 认证对象
|
// 认证对象
|
||||||
app.config.globalProperties.$auth = auth;
|
app.config.globalProperties.$auth = auth;
|
||||||
|
|
||||||
|
// 全局方法挂载
|
||||||
|
app.config.globalProperties.useDict = useDict;
|
||||||
|
app.config.globalProperties.getConfigKey = getConfigKey;
|
||||||
|
app.config.globalProperties.updateConfigByKey = updateConfigByKey;
|
||||||
|
app.config.globalProperties.download = dl;
|
||||||
|
app.config.globalProperties.parseTime = parseTime;
|
||||||
|
app.config.globalProperties.handleTree = handleTree;
|
||||||
|
app.config.globalProperties.addDateRange = addDateRange;
|
||||||
|
app.config.globalProperties.selectDictLabel = selectDictLabel;
|
||||||
|
app.config.globalProperties.selectDictLabels = selectDictLabels;
|
||||||
|
app.config.globalProperties.animate = animate;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import { LanguageEnum } from '@/enums/LanguageEnum';
|
||||||
|
|
||||||
const setting: DefaultSettings = {
|
const setting: DefaultSettings = {
|
||||||
/**
|
/**
|
||||||
* 网页标题
|
* 网页标题
|
||||||
@ -50,6 +52,11 @@ const setting: DefaultSettings = {
|
|||||||
|
|
||||||
animationEnable: false,
|
animationEnable: false,
|
||||||
|
|
||||||
dark: false
|
dark: false,
|
||||||
|
language: LanguageEnum.zh_CN,
|
||||||
|
|
||||||
|
size: 'default',
|
||||||
|
|
||||||
|
layout: ''
|
||||||
};
|
};
|
||||||
export default setting;
|
export default setting;
|
||||||
|
@ -9,7 +9,7 @@ export const useAppStore = defineStore('app', () => {
|
|||||||
hide: false
|
hide: false
|
||||||
});
|
});
|
||||||
const device = ref<string>('desktop');
|
const device = ref<string>('desktop');
|
||||||
const size = useStorage('size', 'default');
|
const size = useStorage<'large' | 'default' | 'small'>('size', 'default');
|
||||||
|
|
||||||
// 语言
|
// 语言
|
||||||
const language = useStorage('language', 'zh_CN');
|
const language = useStorage('language', 'zh_CN');
|
||||||
@ -43,7 +43,7 @@ export const useAppStore = defineStore('app', () => {
|
|||||||
const toggleDevice = (d: string): void => {
|
const toggleDevice = (d: string): void => {
|
||||||
device.value = d;
|
device.value = d;
|
||||||
};
|
};
|
||||||
const setSize = (s: string): void => {
|
const setSize = (s: 'large' | 'default' | 'small'): void => {
|
||||||
size.value = s;
|
size.value = s;
|
||||||
};
|
};
|
||||||
const toggleSideBarHide = (status: boolean): void => {
|
const toggleSideBarHide = (status: boolean): void => {
|
||||||
|
@ -1,43 +1,29 @@
|
|||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import defaultSettings from '@/settings';
|
import defaultSettings from '@/settings';
|
||||||
import { SettingTypeEnum } from '@/enums/SettingTypeEnum';
|
|
||||||
import { useDynamicTitle } from '@/utils/dynamicTitle';
|
import { useDynamicTitle } from '@/utils/dynamicTitle';
|
||||||
|
|
||||||
export const useSettingsStore = defineStore('setting', () => {
|
export const useSettingsStore = defineStore('setting', () => {
|
||||||
const storageSetting = JSON.parse(localStorage.getItem('layout-setting') || '{}');
|
const storageSetting = useStorage<LayoutSetting>('layout-setting', {
|
||||||
|
topNav: defaultSettings.topNav,
|
||||||
|
tagsView: defaultSettings.tagsView,
|
||||||
|
fixedHeader: defaultSettings.fixedHeader,
|
||||||
|
sidebarLogo: defaultSettings.sidebarLogo,
|
||||||
|
dynamicTitle: defaultSettings.dynamicTitle,
|
||||||
|
sideTheme: defaultSettings.sideTheme,
|
||||||
|
theme: defaultSettings.theme
|
||||||
|
});
|
||||||
const title = ref<string>(defaultSettings.title);
|
const title = ref<string>(defaultSettings.title);
|
||||||
const theme = ref<string>(storageSetting.theme || defaultSettings.theme);
|
const theme = ref<string>(storageSetting.value.theme);
|
||||||
const sideTheme = ref<string>(storageSetting.sideTheme || defaultSettings.sideTheme);
|
const sideTheme = ref<string>(storageSetting.value.sideTheme);
|
||||||
const showSettings = ref<boolean>(storageSetting.showSettings || defaultSettings.showSettings);
|
const showSettings = ref<boolean>(defaultSettings.showSettings);
|
||||||
const topNav = ref<boolean>(storageSetting.topNav === undefined ? defaultSettings.topNav : storageSetting.topNav);
|
const topNav = ref<boolean>(storageSetting.value.topNav);
|
||||||
const tagsView = ref<boolean>(storageSetting.tagsView === undefined ? defaultSettings.tagsView : storageSetting.tagsView);
|
const tagsView = ref<boolean>(storageSetting.value.tagsView);
|
||||||
const fixedHeader = ref<boolean>(storageSetting.fixedHeader === undefined ? defaultSettings.fixedHeader : storageSetting.fixedHeader);
|
const fixedHeader = ref<boolean>(storageSetting.value.fixedHeader);
|
||||||
const sidebarLogo = ref<boolean>(storageSetting.sidebarLogo === undefined ? defaultSettings.sidebarLogo : storageSetting.sidebarLogo);
|
const sidebarLogo = ref<boolean>(storageSetting.value.sidebarLogo);
|
||||||
const dynamicTitle = ref<boolean>(storageSetting.dynamicTitle === undefined ? defaultSettings.dynamicTitle : storageSetting.dynamicTitle);
|
const dynamicTitle = ref<boolean>(storageSetting.value.dynamicTitle);
|
||||||
const animationEnable = ref<boolean>(
|
const animationEnable = ref<boolean>(defaultSettings.animationEnable);
|
||||||
storageSetting.animationEnable === undefined ? defaultSettings.animationEnable : storageSetting.animationEnable
|
const dark = ref<boolean>(defaultSettings.dark);
|
||||||
);
|
|
||||||
const dark = ref<boolean>(storageSetting.dark || defaultSettings.dark);
|
|
||||||
|
|
||||||
const prop: { [key: string]: Ref<any> } = {
|
|
||||||
theme,
|
|
||||||
sideTheme,
|
|
||||||
showSettings,
|
|
||||||
topNav,
|
|
||||||
tagsView,
|
|
||||||
fixedHeader,
|
|
||||||
sidebarLogo,
|
|
||||||
dynamicTitle,
|
|
||||||
animationEnable,
|
|
||||||
dark
|
|
||||||
};
|
|
||||||
|
|
||||||
// actions
|
|
||||||
const changeSetting = (param: { key: SettingTypeEnum; value: any }) => {
|
|
||||||
const { key, value } = param;
|
|
||||||
if (key in prop) {
|
|
||||||
prop[key].value = value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const setTitle = (value: string) => {
|
const setTitle = (value: string) => {
|
||||||
title.value = value;
|
title.value = value;
|
||||||
useDynamicTitle();
|
useDynamicTitle();
|
||||||
@ -54,7 +40,6 @@ export const useSettingsStore = defineStore('setting', () => {
|
|||||||
dynamicTitle,
|
dynamicTitle,
|
||||||
animationEnable,
|
animationEnable,
|
||||||
dark,
|
dark,
|
||||||
changeSetting,
|
|
||||||
setTitle
|
setTitle
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
82
src/types/global.d.ts
vendored
82
src/types/global.d.ts
vendored
@ -1,4 +1,5 @@
|
|||||||
import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue/runtime-core';
|
import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue/runtime-core';
|
||||||
|
import { LanguageEnum } from '@/enums/LanguageEnum';
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
/** vue Instance */
|
/** vue Instance */
|
||||||
@ -49,6 +50,8 @@ declare global {
|
|||||||
/** 是否禁用上传 */
|
/** 是否禁用上传 */
|
||||||
isUploading: boolean;
|
isUploading: boolean;
|
||||||
|
|
||||||
|
updateSupport: number;
|
||||||
|
|
||||||
/** 其他参数 */
|
/** 其他参数 */
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
}
|
}
|
||||||
@ -87,76 +90,77 @@ declare global {
|
|||||||
pageNum: number;
|
pageNum: number;
|
||||||
pageSize: number;
|
pageSize: number;
|
||||||
}
|
}
|
||||||
|
declare interface LayoutSetting {
|
||||||
|
/**
|
||||||
|
* 是否显示顶部导航
|
||||||
|
*/
|
||||||
|
topNav: boolean;
|
||||||
|
|
||||||
declare type DefaultSettings = {
|
/**
|
||||||
|
* 是否显示多标签导航
|
||||||
|
*/
|
||||||
|
tagsView: boolean;
|
||||||
|
/**
|
||||||
|
* 是否固定头部
|
||||||
|
*/
|
||||||
|
fixedHeader: boolean;
|
||||||
|
/**
|
||||||
|
* 是否显示侧边栏Logo
|
||||||
|
*/
|
||||||
|
sidebarLogo: boolean;
|
||||||
|
/**
|
||||||
|
* 是否显示动态标题
|
||||||
|
*/
|
||||||
|
dynamicTitle: boolean;
|
||||||
|
/**
|
||||||
|
* 侧边栏主题 theme-dark | theme-light
|
||||||
|
*/
|
||||||
|
sideTheme: string;
|
||||||
|
/**
|
||||||
|
* 主题模式
|
||||||
|
*/
|
||||||
|
theme: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare interface DefaultSettings extends LayoutSetting {
|
||||||
/**
|
/**
|
||||||
* 网页标题
|
* 网页标题
|
||||||
*/
|
*/
|
||||||
title: string;
|
title: string;
|
||||||
|
|
||||||
/**
|
|
||||||
* 侧边栏主题 theme-dark | theme-light
|
|
||||||
*/
|
|
||||||
sideTheme?: string;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否显示系统布局设置
|
* 是否显示系统布局设置
|
||||||
*/
|
*/
|
||||||
showSettings?: boolean;
|
showSettings: boolean;
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否显示顶部导航
|
|
||||||
*/
|
|
||||||
topNav?: boolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否显示多标签导航
|
|
||||||
*/
|
|
||||||
tagsView?: boolean;
|
|
||||||
/**
|
|
||||||
* 是否固定头部
|
|
||||||
*/
|
|
||||||
fixedHeader?: boolean;
|
|
||||||
/**
|
|
||||||
* 是否显示侧边栏Logo
|
|
||||||
*/
|
|
||||||
sidebarLogo?: boolean;
|
|
||||||
/**
|
/**
|
||||||
* 导航栏布局
|
* 导航栏布局
|
||||||
*/
|
*/
|
||||||
layout?: string;
|
layout: string;
|
||||||
/**
|
|
||||||
* 主题模式
|
|
||||||
*/
|
|
||||||
theme?: string;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 布局大小
|
* 布局大小
|
||||||
*/
|
*/
|
||||||
size?: string;
|
size: 'large' | 'default' | 'small';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 语言
|
* 语言
|
||||||
*/
|
*/
|
||||||
language?: string;
|
language: LanguageEnum;
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否显示动态标题
|
|
||||||
*/
|
|
||||||
dynamicTitle?: boolean;
|
|
||||||
/**
|
/**
|
||||||
* 是否启用动画效果
|
* 是否启用动画效果
|
||||||
*/
|
*/
|
||||||
animationEnable?: boolean;
|
animationEnable: boolean;
|
||||||
/**
|
/**
|
||||||
* 是否启用暗黑模式
|
* 是否启用暗黑模式
|
||||||
*
|
*
|
||||||
* true:暗黑模式
|
* true:暗黑模式
|
||||||
* false: 明亮模式
|
* false: 明亮模式
|
||||||
*/
|
*/
|
||||||
dark?: boolean;
|
dark: boolean;
|
||||||
|
|
||||||
errorLog?: string;
|
errorLog: string;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
export {};
|
export {};
|
||||||
|
20
src/types/module.d.ts
vendored
20
src/types/module.d.ts
vendored
@ -1,13 +1,13 @@
|
|||||||
import type modal from '@/plugins/modal';
|
import modal from '@/plugins/modal';
|
||||||
import type tab from '@/plugins/tab';
|
import tab from '@/plugins/tab';
|
||||||
import type download from '@/plugins/download';
|
import download from '@/plugins/download';
|
||||||
import type auth from '@/plugins/auth';
|
import auth from '@/plugins/auth';
|
||||||
import type cache from '@/plugins/cache';
|
import cache from '@/plugins/cache';
|
||||||
import type animate from '@/animate';
|
import animate from '@/animate';
|
||||||
import type { useDict } from '@/utils/dict';
|
import { useDict } from '@/utils/dict';
|
||||||
import type { addDateRange, handleTree, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi';
|
import handleTree, { addDateRange, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi';
|
||||||
import type { getConfigKey, updateConfigByKey } from '@/api/system/config';
|
import { getConfigKey, updateConfigByKey } from '@/api/system/config';
|
||||||
import type { download as rd } from '@/utils/request';
|
import { download as rd } from '@/utils/request';
|
||||||
|
|
||||||
declare module '@vue/runtime-core' {
|
declare module '@vue/runtime-core' {
|
||||||
interface ComponentCustomProperties {
|
interface ComponentCustomProperties {
|
||||||
|
@ -245,3 +245,7 @@ export const getNormalPath = (p: string): string => {
|
|||||||
export const blobValidate = (data: any) => {
|
export const blobValidate = (data: any) => {
|
||||||
return data.type !== 'application/json';
|
return data.type !== 'application/json';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
handleTree
|
||||||
|
};
|
||||||
|
@ -306,9 +306,8 @@ import { to } from 'await-to-js';
|
|||||||
import { globalHeaders } from '@/utils/request';
|
import { globalHeaders } from '@/utils/request';
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance();
|
||||||
const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex'));
|
const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex'));
|
||||||
|
|
||||||
const userList = ref<UserVO[]>();
|
const userList = ref<UserVO[]>();
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const showSearch = ref(true);
|
const showSearch = ref(true);
|
||||||
@ -512,7 +511,7 @@ const handleResetPwd = async (row: UserVO) => {
|
|||||||
inputErrorMessage: '用户密码长度必须介于 5 和 20 之间'
|
inputErrorMessage: '用户密码长度必须介于 5 和 20 之间'
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
if (!err) {
|
if (!err && res) {
|
||||||
await api.resetUserPwd(row.userId, res.value);
|
await api.resetUserPwd(row.userId, res.value);
|
||||||
proxy?.$modal.msgSuccess('修改成功,新密码是:' + res.value);
|
proxy?.$modal.msgSuccess('修改成功,新密码是:' + res.value);
|
||||||
}
|
}
|
||||||
|
@ -24,12 +24,10 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { updateUserProfile } from '@/api/system/user';
|
import { updateUserProfile } from '@/api/system/user';
|
||||||
|
import { propTypes } from '@/utils/propTypes';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
user: {
|
user: propTypes.any.isRequired
|
||||||
type: Object as PropType<any>,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
const userForm = computed(() => props.user);
|
const userForm = computed(() => props.user);
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
|
@ -233,7 +233,7 @@ interface MenuOptionsType {
|
|||||||
|
|
||||||
const subColumns = ref<any>([]);
|
const subColumns = ref<any>([]);
|
||||||
const menuOptions = ref<Array<MenuOptionsType>>([]);
|
const menuOptions = ref<Array<MenuOptionsType>>([]);
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
info: propTypes.any.def(null),
|
info: propTypes.any.def(null),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user