Browse Source

!69 修复升级依赖带来的类型问题
* fix 修复变量问题
* Merge remote-tracking branch 'origin/dev' into dev
* update 依赖升级
* update 依赖升级
* 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

ahaos 1 year ago
parent
commit
1d5133b695

+ 2 - 0
.eslintrc.js

@@ -22,6 +22,8 @@ module.exports = {
   rules: {
     '@typescript-eslint/no-empty-function': 'off',
     '@typescript-eslint/no-explicit-any': 'off',
+    '@typescript-eslint/no-unused-vars': 'off',
+    '@typescript-eslint/no-this-alias': 'off',
 
     // vue
     'vue/multi-word-component-names': 'off',

+ 1 - 0
.gitignore

@@ -22,6 +22,7 @@ selenium-debug.log
 
 package-lock.json
 yarn.lock
+pnpm-lock.yaml
 
 # 编译生成的文件
 auto-imports.d.ts

+ 2 - 2
src/components/Breadcrumb/index.vue

@@ -33,9 +33,9 @@ const isDashboard = (route: RouteLocationMatched) => {
   }
   return name.trim() === 'Index';
 };
-const handleLink = (item: RouteLocationMatched) => {
+const handleLink = (item) => {
   const { redirect, path } = item;
-  redirect ? router.push(redirect as string) : router.push(path);
+  redirect ? router.push(redirect) : router.push(path);
 };
 
 watchEffect(() => {

+ 5 - 2
src/components/Editor/index.vue

@@ -27,11 +27,14 @@
 </template>
 
 <script setup lang="ts">
-import { QuillEditor, Quill } from '@vueup/vue-quill';
 import '@vueup/vue-quill/dist/vue-quill.snow.css';
+
+import { QuillEditor, Quill } from '@vueup/vue-quill';
 import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
 
+defineEmits(['update:modelValue']);
+
 const props = defineProps({
   /* 编辑器的内容 */
   modelValue: propTypes.string,
@@ -55,7 +58,7 @@ const upload = reactive<UploadOption>({
 });
 const quillEditorRef = ref();
 
-const options = ref({
+const options = ref<any>({
   theme: 'snow',
   bounds: document.body,
   debug: 'warn',

+ 6 - 3
src/components/FileUpload/index.vue

@@ -48,7 +48,10 @@ import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
 
 const props = defineProps({
-  modelValue: [String, Object, Array],
+  modelValue: {
+    type: [String, Object, Array],
+    default: () => []
+  },
   // 数量限制
   limit: propTypes.number.def(5),
   // 大小限制(MB)
@@ -79,11 +82,11 @@ watch(
     if (val) {
       let temp = 1;
       // 首先将值转为数组
-      let list = [];
+      let list: any[] = [];
       if (Array.isArray(val)) {
         list = val;
       } else {
-        const res = await listByIds(val as string);
+        const res = await listByIds(val);
         list = res.data.map((oss) => {
           const data = {
             name: oss.originalName,

+ 1 - 1
src/components/ImagePreview/index.vue

@@ -33,7 +33,7 @@ const realSrc = computed(() => {
 
 const realSrcList = computed(() => {
   if (!props.src) {
-    return;
+    return [];
   }
   let real_src_list = props.src.split(',');
   let srcList: string[] = [];

+ 4 - 1
src/components/ImageUpload/index.vue

@@ -46,7 +46,10 @@ import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
 
 const props = defineProps({
-  modelValue: [String, Object, Array],
+  modelValue: {
+    type: [String, Object, Array],
+    default: () => []
+  },
   // 图片数量限制
   limit: propTypes.number.def(5),
   // 大小限制(MB)

+ 1 - 1
src/layout/components/InnerLink/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div :style="'height:' + height">
-    <iframe :id="iframeId" style="width: 100%; height: 100%" :src="src" frameborder="no"></iframe>
+    <iframe :id="iframeId" style="width: 100%; height: 100%; border: 0" :src="src"></iframe>
   </div>
 </template>
 

+ 1 - 2
src/layout/components/Sidebar/SidebarItem.vue

@@ -36,7 +36,6 @@ import { getNormalPath } from '@/utils/ruoyi';
 import { RouteRecordRaw } from 'vue-router';
 
 const props = defineProps({
-  // route object
   item: {
     type: Object as PropType<RouteRecordRaw>,
     required: true
@@ -85,7 +84,7 @@ const resolvePath = (routePath: string, routeQuery?: string): any => {
   if (isExternal(routePath)) {
     return routePath;
   }
-  if (isExternal(props.basePath)) {
+  if (isExternal(props.basePath as string)) {
     return props.basePath;
   }
   if (routeQuery) {

+ 3 - 2
src/layout/components/Sidebar/index.vue

@@ -13,7 +13,7 @@
           :collapse-transition="false"
           mode="vertical"
         >
-          <sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route" :base-path="route.path" />
+          <sidebar-item v-for="(r, index) in sidebarRouters" :key="r.path + index" :item="r" :base-path="r.path" />
         </el-menu>
       </transition>
     </el-scrollbar>
@@ -28,7 +28,8 @@ import useAppStore from '@/store/modules/app';
 import useSettingsStore from '@/store/modules/settings';
 import usePermissionStore from '@/store/modules/permission';
 import { RouteRecordRaw } from 'vue-router';
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const { proxy } = getCurrentInstance();
 
 const route = useRoute();
 const appStore = useAppStore();

+ 1 - 0
src/layout/components/TagsView/ScrollPane.vue

@@ -7,6 +7,7 @@
 <script setup lang="ts">
 import useTagsViewStore from '@/store/modules/tagsView';
 import { TagView } from 'vue-router';
+
 const tagAndTagSpacing = ref(4);
 
 const scrollContainerRef = ref<ElScrollbarInstance>();

+ 4 - 4
src/layout/components/TagsView/index.vue

@@ -143,7 +143,7 @@ const moveToCurrentTag = () => {
         scrollPaneRef.value?.moveToTarget(r);
         // when query is different then update
         if (r.fullPath !== route.fullPath) {
-          useTagsViewStore().updateVisitedView(route);
+          useTagsViewStore().updateVisitedView(route as any);
         }
       }
     }
@@ -163,14 +163,14 @@ const closeSelectedTag = (view: TagView) => {
   });
 };
 const closeRightTags = () => {
-  proxy?.$tab.closeRightPage(selectedTag.value).then((visitedViews) => {
-    if (!visitedViews.find((i) => i.fullPath === route.fullPath)) {
+  proxy?.$tab.closeRightPage(selectedTag.value).then((visitedViews: TagView[]) => {
+    if (!visitedViews.find((i: TagView) => i.fullPath === route.fullPath)) {
       toLastView(visitedViews);
     }
   });
 };
 const closeLeftTags = () => {
-  proxy?.$tab.closeLeftPage(selectedTag.value).then((visitedViews) => {
+  proxy?.$tab.closeLeftPage(selectedTag.value).then((visitedViews: TagView[]) => {
     if (!visitedViews.find((i: TagView) => i.fullPath === route.fullPath)) {
       toLastView(visitedViews);
     }

+ 1 - 1
src/main.ts

@@ -1,6 +1,6 @@
 import { createApp } from 'vue';
 // global css
-import 'uno.css';
+import 'virtual:uno.css';
 import '@/assets/styles/index.scss';
 import 'element-plus/theme-chalk/dark/css-vars.css';
 

+ 4 - 3
src/permission.ts

@@ -8,7 +8,6 @@ import { isRelogin } from '@/utils/request';
 import useUserStore from '@/store/modules/user';
 import useSettingsStore from '@/store/modules/settings';
 import usePermissionStore from '@/store/modules/permission';
-import { RouteRecordRaw } from 'vue-router';
 
 NProgress.configure({ showSpinner: false });
 const whiteList = ['/login', '/register', '/social-callback'];
@@ -36,12 +35,14 @@ router.beforeEach(async (to, from, next) => {
           isRelogin.show = false;
           const accessRoutes = await usePermissionStore().generateRoutes();
           // 根据roles权限生成可访问的路由表
-          accessRoutes.forEach((route: RouteRecordRaw) => {
+          accessRoutes.forEach((route) => {
             if (!isHttp(route.path)) {
               router.addRoute(route); // 动态添加可访问路由表
             }
           });
-          next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
+          const n = { ...to, replace: true };
+          console.log(n);
+          next({ path: to.path, replace: true, params: to.params, query: to.query, hash: to.hash, name: to.name as string }); // hack方法 确保addRoutes已完成
         }
       } else {
         next();

+ 2 - 2
src/store/modules/tagsView.ts

@@ -123,7 +123,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
     });
   };
 
-  const updateVisitedView = (view: TagView | RouteLocationNormalized): void => {
+  const updateVisitedView = (view: TagView): void => {
     for (let v of visitedViews.value) {
       if (v.path === view.path) {
         v = Object.assign(v, view);
@@ -170,7 +170,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
     });
   };
 
-  const addCachedView = (view: TagView | RouteLocationNormalized): void => {
+  const addCachedView = (view: TagView): void => {
     const viewName = view.name as string;
     if (!viewName) return;
     if (cachedViews.value.includes(viewName)) return;

+ 1 - 1
src/types/axios.d.ts

@@ -1,7 +1,7 @@
 import axios from 'axios';
 
 declare module 'axios' {
-  export interface AxiosResponse<T = any> {
+  interface AxiosResponse<T = any> {
     code: number;
     msg: string;
     rows: T;

+ 1 - 1
src/types/element.d.ts

@@ -4,6 +4,7 @@ declare global {
   declare type ElFormInstance = ep.FormInstance;
   declare type ElTableInstance = ep.TableInstance;
   declare type ElUploadInstance = ep.UploadInstance;
+  declare type ElScrollbarInstance = ep.ScrollbarInstance;
   declare type ElTreeInstance = InstanceType<typeof ep.ElTree>;
   declare type ElTreeSelectInstance = InstanceType<typeof ep.ElTreeSelect>;
   declare type ElSelectInstance = InstanceType<typeof ep.ElSelect>;
@@ -24,7 +25,6 @@ declare global {
   declare type ElColorPickerInstance = InstanceType<typeof ep.ElColorPicker>;
   declare type ElRateInstance = InstanceType<typeof ep.ElRate>;
   declare type ElSliderInstance = InstanceType<typeof ep.ElSlider>;
-  declare type ElScrollbarInstance = InstanceType<typeof ep.ElScrollbar>;
 
   declare type TransferKey = ep.TransferKey;
   declare type CheckboxValueType = ep.CheckboxValueType;

+ 0 - 54
src/types/env.d.ts

@@ -4,60 +4,6 @@ declare module '*.vue' {
   export default Component;
 }
 
-declare module '*.avif' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.bmp' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.gif' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.jpg' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.jpeg' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.png' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.webp' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.svg' {
-  const src: string;
-  export default src;
-}
-
-declare module '*.module.css' {
-  const classes: { readonly [key: string]: string };
-  export default classes;
-}
-
-declare module '*.module.scss' {
-  const classes: { readonly [key: string]: string };
-  export default classes;
-}
-
-declare module '*.module.sass' {
-  const classes: { readonly [key: string]: string };
-  export default classes;
-}
 // 环境变量
 interface ImportMetaEnv {
   VITE_APP_TITLE: string;

+ 2 - 1
src/types/global.d.ts

@@ -1,4 +1,5 @@
-import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue/runtime-core';
+import type { ComponentInternalInstance as ComponentInstance } from 'vue/runtime-core';
+import type { PropType as VuePropType } from 'vue';
 import { LanguageEnum } from '@/enums/LanguageEnum';
 
 declare global {

+ 5 - 0
src/types/module.d.ts

@@ -30,3 +30,8 @@ declare module '@vue/runtime-core' {
     parseTime: typeof parseTime;
   }
 }
+
+declare module 'vform3-builds' {
+  const content: any;
+  export = content;
+}

+ 1 - 0
src/types/router.d.ts

@@ -16,6 +16,7 @@ declare module 'vue-router' {
     roles?: string[];
     alwaysShow?: boolean;
     query?: string;
+    parentPath?: string;
   }
 
   interface _RouteLocationBase {

+ 0 - 4
src/types/vform3-builds.d.ts

@@ -1,4 +0,0 @@
-declare module 'vform3-builds' {
-  const content: any;
-  export = content;
-}

+ 1 - 1
src/utils/index.ts

@@ -89,7 +89,7 @@ export const byteLength = (str: string) => {
  * @returns {Array}
  */
 export const cleanArray = (actual: Array<any>) => {
-  const newArray = [];
+  const newArray: any[] = [];
   for (let i = 0; i < actual.length; i++) {
     if (actual[i]) {
       newArray.push(actual[i]);

+ 1 - 1
src/utils/ruoyi.ts

@@ -68,7 +68,7 @@ export const selectDictLabel = (datas: any, value: number | string) => {
   if (value === undefined) {
     return '';
   }
-  const actions = [];
+  const actions: Array<string | number> = [];
   Object.keys(datas).some((key) => {
     if (datas[key].value == '' + value) {
       actions.push(datas[key].label);

+ 1 - 0
src/views/monitor/online/index.vue

@@ -63,6 +63,7 @@
 <script setup name="Online" lang="ts">
 import { forceLogout, list as initData } from '@/api/monitor/online';
 import { OnlineQuery, OnlineVO } from '@/api/monitor/online/types';
+import api from '@/api/system/user';
 import { to } from 'await-to-js';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;

+ 1 - 1
src/views/monitor/operlog/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="p-2">
     <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div class="mb-[10px]">
+      <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px">
             <el-form-item label="操作地址" prop="operIp">

+ 2 - 1
src/views/system/role/selectUser.vue

@@ -50,7 +50,8 @@ import { UserQuery } from '@/api/system/user/types';
 
 const props = defineProps({
   roleId: {
-    type: [Number, String]
+    type: [Number, String],
+    required: true
   }
 });
 

+ 6 - 3
src/views/system/user/index.vue

@@ -372,7 +372,8 @@ const initFormData: UserForm = {
   postIds: [],
   roleIds: []
 };
-const data = reactive<PageData<UserForm, UserQuery>>({
+
+const initData: PageData<UserForm, UserQuery> = {
   form: { ...initFormData },
   queryParams: {
     pageNum: 1,
@@ -380,7 +381,8 @@ const data = reactive<PageData<UserForm, UserQuery>>({
     userName: '',
     phonenumber: '',
     status: '',
-    deptId: ''
+    deptId: '',
+    roleId: ''
   },
   rules: {
     userName: [
@@ -417,7 +419,8 @@ const data = reactive<PageData<UserForm, UserQuery>>({
       }
     ]
   }
-});
+};
+const data = reactive<PageData<UserForm, UserQuery>>(initData);
 
 const { queryParams, form, rules } = toRefs<PageData<UserForm, UserQuery>>(data);
 

+ 2 - 4
src/views/system/user/profile/thirdParty.vue

@@ -51,14 +51,12 @@
 
 <script lang="ts" setup>
 import { authUnlock, authBinding } from '@/api/system/social/auth';
-import { PropType } from 'vue';
+import { propTypes } from '@/utils/propTypes';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 const props = defineProps({
-  auths: {
-    type: Object as PropType<any>
-  }
+  auths: propTypes.any.isRequired
 });
 const auths = computed(() => props.auths);
 

+ 3 - 2
src/views/system/user/profile/userAvatar.vue

@@ -60,6 +60,7 @@ import 'vue-cropper/dist/index.css';
 import { VueCropper } from 'vue-cropper';
 import { uploadAvatar } from '@/api/system/user';
 import useUserStore from '@/store/modules/user';
+import { UploadRawFile } from 'element-plus';
 
 interface Options {
   img: string | any; // 裁剪图片的地址
@@ -118,7 +119,7 @@ const changeScale = (num: number) => {
   cropper.value.changeScale(num);
 };
 /** 上传预处理 */
-const beforeUpload = (file: any) => {
+const beforeUpload = (file: UploadRawFile): any => {
   if (file.type.indexOf('image/') == -1) {
     proxy?.$modal.msgError('文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。');
   } else {
@@ -138,7 +139,7 @@ const uploadImg = async () => {
     const res = await uploadAvatar(formData);
     open.value = false;
     options.img = res.data.imgUrl;
-    userStore.setAvatar(options.img as string);
+    userStore.setAvatar(options.img);
     proxy?.$modal.msgSuccess('修改成功');
     visible.value = false;
   });

+ 3 - 2
src/views/system/user/profile/userInfo.vue

@@ -32,7 +32,7 @@ const props = defineProps({
 const userForm = computed(() => props.user);
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const userRef = ref<ElFormInstance>();
-const rules = ref<ElFormRules>({
+const rule: ElFormRules = {
   nickName: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
   email: [
     { required: true, message: '邮箱地址不能为空', trigger: 'blur' },
@@ -50,7 +50,8 @@ const rules = ref<ElFormRules>({
     },
     { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
   ]
-});
+};
+const rules = ref<ElFormRules>(rule);
 
 /** 提交按钮 */
 const submit = () => {

+ 5 - 4
src/views/tool/gen/genInfoForm.vue

@@ -228,16 +228,16 @@ import { propTypes } from '@/utils/propTypes';
 interface MenuOptionsType {
   menuId: number | string;
   menuName: string;
-  children: MenuOptionsType[] | undefined;
+  children?: MenuOptionsType[];
 }
+const { proxy } = getCurrentInstance();
 
 const subColumns = ref<any>([]);
 const menuOptions = ref<Array<MenuOptionsType>>([]);
-const { proxy } = getCurrentInstance();
 
 const props = defineProps({
-  info: propTypes.any.def(null),
-  tables: propTypes.any.def(null)
+  info: propTypes.any.isRequired,
+  tables: propTypes.any.isRequired
 });
 
 const infoForm = computed(() => props.info);
@@ -276,6 +276,7 @@ const getMenuTreeselect = async () => {
   const res = await listMenu();
   res.data.forEach((m) => (m.menuId = m.menuId.toString()));
   const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId');
+
   if (data) {
     menuOptions.value = data;
   }

+ 6 - 2
tsconfig.json

@@ -2,21 +2,25 @@
   "compilerOptions": {
     "target": "esnext",
     "module": "esnext",
-    "useDefineForClassFields": true,
-    "moduleResolution": "node",
+//    "useDefineForClassFields": true,
+    "moduleResolution": "bundler",
     "strict": true,
     "jsx": "preserve",
     "sourceMap": true,
     "resolveJsonModule": true,
     "esModuleInterop": true,
+    "strictFunctionTypes": false,
     "lib": ["esnext", "dom"],
+    "noImplicitAny": false,
     "baseUrl": ".",
     "allowJs": true,
+    "experimentalDecorators": true,
     "paths": {
       "@/*": ["src/*"]
     },
     "types": ["vite/client"],
     "skipLibCheck": true,
+    "removeComments": true,
     // 允许默认导入
     "allowSyntheticDefaultImports": true,
     "forceConsistentCasingInFileNames": true

+ 33 - 0
uno.config.ts

@@ -0,0 +1,33 @@
+import {
+  defineConfig,
+  presetAttributify,
+  presetIcons,
+  presetTypography,
+  presetUno,
+  presetWebFonts,
+  transformerDirectives,
+  transformerVariantGroup
+} from 'unocss';
+
+export default defineConfig({
+  shortcuts: {
+    'panel-title':
+      'pb-[5px] font-sans leading-[1.1] font-medium text-base text-[#6379bb] border-b border-b-solid border-[var(--el-border-color-light)] mb-5 mt-0'
+  },
+  theme: {
+    colors: {
+      primary: 'var(--el-color-primary)',
+      primary_dark: 'var(--el-color-primary-light-5)'
+    }
+  },
+  presets: [
+    presetUno(),
+    presetAttributify(),
+    presetIcons(),
+    presetTypography(),
+    presetWebFonts({
+      fonts: {}
+    })
+  ],
+  transformers: [transformerDirectives(), transformerVariantGroup()]
+});

+ 2 - 2
vite/plugins/compression.ts

@@ -1,6 +1,6 @@
 import compression from 'vite-plugin-compression';
 
-export default function createCompression(env: any) {
+export default (env: any) => {
   const { VITE_BUILD_COMPRESS } = env;
   const plugin: any[] = [];
   if (VITE_BUILD_COMPRESS) {
@@ -25,4 +25,4 @@ export default function createCompression(env: any) {
     }
   }
   return plugin;
-}
+};

+ 10 - 10
vite/plugins/index.ts

@@ -9,14 +9,14 @@ import createSetupExtend from './setup-extend';
 import path from 'path';
 
 export default (viteEnv: any, isBuild = false): [] => {
-  const vitePlusgins: any = [];
-  vitePlusgins.push(vue());
-  vitePlusgins.push(createUnoCss());
-  vitePlusgins.push(createAutoImport(path));
-  vitePlusgins.push(createComponents(path));
-  vitePlusgins.push(createCompression(viteEnv));
-  vitePlusgins.push(createIcons());
-  vitePlusgins.push(createSvgIconsPlugin(path, isBuild));
-  vitePlusgins.push(createSetupExtend());
-  return vitePlusgins;
+  const vitePlugins: any = [];
+  vitePlugins.push(vue());
+  vitePlugins.push(createUnoCss());
+  vitePlugins.push(createAutoImport(path));
+  vitePlugins.push(createComponents(path));
+  vitePlugins.push(createCompression(viteEnv));
+  vitePlugins.push(createIcons());
+  vitePlugins.push(createSvgIconsPlugin(path, isBuild));
+  vitePlugins.push(createSetupExtend());
+  return vitePlugins;
 };

+ 0 - 7
vite/plugins/unocss.ts

@@ -1,14 +1,7 @@
 import UnoCss from 'unocss/vite';
-import { presetUno, presetAttributify, presetIcons } from 'unocss';
 
 export default () => {
   return UnoCss({
-    presets: [presetUno(), presetAttributify(), presetIcons()],
-    // rules: [['search', {}]],
-    shortcuts: {
-      'panel-title':
-        'pb-[5px] font-sans leading-[1.1] font-medium text-base text-[#6379bb] border-b border-b-solid border-[var(--el-border-color-light)] mb-5 mt-0'
-    },
     hmrTopLevelAwait: false // unocss默认是true,低版本浏览器是不支持的,启动后会报错
   });
 };