兰宝车间质量管理系统-前端
!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
已添加1个文件
已删除1个文件
已修改35个文件
249 ■■■■ 文件已修改
.eslintrc.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Breadcrumb/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Editor/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/FileUpload/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ImagePreview/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ImageUpload/index.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/InnerLink/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Sidebar/SidebarItem.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Sidebar/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/TagsView/ScrollPane.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/TagsView/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/permission.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/tagsView.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/axios.d.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/element.d.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/env.d.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/global.d.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/module.d.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/router.d.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/vform3-builds.d.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/index.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/ruoyi.ts 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/monitor/online/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/monitor/operlog/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/role/selectUser.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/profile/thirdParty.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/profile/userAvatar.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/profile/userInfo.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/genInfoForm.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tsconfig.json 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
uno.config.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite/plugins/compression.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite/plugins/index.ts 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite/plugins/unocss.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.eslintrc.js
@@ -22,6 +22,8 @@
  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',
.gitignore
@@ -22,6 +22,7 @@
package-lock.json
yarn.lock
pnpm-lock.yaml
# ç¼–译生成的文件
auto-imports.d.ts
src/components/Breadcrumb/index.vue
@@ -33,9 +33,9 @@
  }
  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(() => {
src/components/Editor/index.vue
@@ -27,10 +27,13 @@
</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({
  /* ç¼–辑器的内容 */
@@ -55,7 +58,7 @@
});
const quillEditorRef = ref();
const options = ref({
const options = ref<any>({
  theme: 'snow',
  bounds: document.body,
  debug: 'warn',
src/components/FileUpload/index.vue
@@ -48,7 +48,10 @@
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 @@
    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,
src/components/ImagePreview/index.vue
@@ -33,7 +33,7 @@
const realSrcList = computed(() => {
  if (!props.src) {
    return;
    return [];
  }
  let real_src_list = props.src.split(',');
  let srcList: string[] = [];
src/components/ImageUpload/index.vue
@@ -46,7 +46,10 @@
import { globalHeaders } from '@/utils/request';
const props = defineProps({
  modelValue: [String, Object, Array],
  modelValue: {
    type: [String, Object, Array],
    default: () => []
  },
  // å›¾ç‰‡æ•°é‡é™åˆ¶
  limit: propTypes.number.def(5),
  // å¤§å°é™åˆ¶(MB)
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>
src/layout/components/Sidebar/SidebarItem.vue
@@ -36,7 +36,6 @@
import { RouteRecordRaw } from 'vue-router';
const props = defineProps({
  // route object
  item: {
    type: Object as PropType<RouteRecordRaw>,
    required: true
@@ -85,7 +84,7 @@
  if (isExternal(routePath)) {
    return routePath;
  }
  if (isExternal(props.basePath)) {
  if (isExternal(props.basePath as string)) {
    return props.basePath;
  }
  if (routeQuery) {
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 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();
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>();
src/layout/components/TagsView/index.vue
@@ -143,7 +143,7 @@
        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 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);
    }
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';
src/permission.ts
@@ -8,7 +8,6 @@
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 @@
          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();
src/store/modules/tagsView.ts
@@ -123,7 +123,7 @@
    });
  };
  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 @@
    });
  };
  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;
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;
src/types/element.d.ts
@@ -4,6 +4,7 @@
  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 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;
src/types/env.d.ts
@@ -4,60 +4,6 @@
  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;
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 {
src/types/module.d.ts
@@ -30,3 +30,8 @@
    parseTime: typeof parseTime;
  }
}
declare module 'vform3-builds' {
  const content: any;
  export = content;
}
src/types/router.d.ts
@@ -16,6 +16,7 @@
    roles?: string[];
    alwaysShow?: boolean;
    query?: string;
    parentPath?: string;
  }
  interface _RouteLocationBase {
src/types/vform3-builds.d.ts
ÎļþÒÑɾ³ý
src/utils/index.ts
@@ -89,7 +89,7 @@
 * @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]);
src/utils/ruoyi.ts
@@ -68,7 +68,7 @@
  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);
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;
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">
src/views/system/role/selectUser.vue
@@ -50,7 +50,8 @@
const props = defineProps({
  roleId: {
    type: [Number, String]
    type: [Number, String],
    required: true
  }
});
src/views/system/user/index.vue
@@ -372,7 +372,8 @@
  postIds: [],
  roleIds: []
};
const data = reactive<PageData<UserForm, UserQuery>>({
const initData: PageData<UserForm, UserQuery> = {
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
@@ -380,7 +381,8 @@
    userName: '',
    phonenumber: '',
    status: '',
    deptId: ''
    deptId: '',
    roleId: ''
  },
  rules: {
    userName: [
@@ -417,7 +419,8 @@
      }
    ]
  }
});
};
const data = reactive<PageData<UserForm, UserQuery>>(initData);
const { queryParams, form, rules } = toRefs<PageData<UserForm, UserQuery>>(data);
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);
src/views/system/user/profile/userAvatar.vue
@@ -60,6 +60,7 @@
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 @@
  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 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;
  });
src/views/system/user/profile/userInfo.vue
@@ -32,7 +32,7 @@
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 @@
    },
    { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
  ]
});
};
const rules = ref<ElFormRules>(rule);
/** æäº¤æŒ‰é’® */
const submit = () => {
src/views/tool/gen/genInfoForm.vue
@@ -228,16 +228,16 @@
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 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;
  }
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
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()]
});
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 @@
    }
  }
  return plugin;
}
};
vite/plugins/index.ts
@@ -9,14 +9,14 @@
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;
};
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,低版本浏览器是不支持的,启动后会报错
  });
};