浏览代码

first commit

wucl 9 月之前
当前提交
aff351df66

+ 6 - 0
.editorconfig

@@ -0,0 +1,6 @@
+[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}]
+charset = utf-8
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 30 - 0
.gitignore

@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo

+ 6 - 0
.vscode/extensions.json

@@ -0,0 +1,6 @@
+{
+  "recommendations": [
+    "Vue.volar",
+    "dbaeumer.vscode-eslint"
+  ]
+}

+ 35 - 0
README.md

@@ -0,0 +1,35 @@
+# productivity-platform-web
+
+This template should help get you started developing with Vue 3 in Vite.
+
+## Recommended IDE Setup
+
+[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
+
+## Customize configuration
+
+See [Vite Configuration Reference](https://vite.dev/config/).
+
+## Project Setup
+
+```sh
+npm install
+```
+
+### Compile and Hot-Reload for Development
+
+```sh
+npm run dev
+```
+
+### Compile and Minify for Production
+
+```sh
+npm run build
+```
+
+### Lint with [ESLint](https://eslint.org/)
+
+```sh
+npm run lint
+```

+ 17 - 0
eslint.config.mjs

@@ -0,0 +1,17 @@
+import js from '@eslint/js'
+import pluginVue from 'eslint-plugin-vue'
+
+export default [
+  {
+    name: 'app/files-to-lint',
+    files: ['**/*.{js,mjs,jsx,vue}'],
+  },
+
+  {
+    name: 'app/files-to-ignore',
+    ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'],
+  },
+
+  js.configs.recommended,
+  ...pluginVue.configs['flat/essential'],
+]

+ 13 - 0
index.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8">
+    <link rel="icon" href="/favicon.ico">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Vite App</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 8 - 0
jsconfig.json

@@ -0,0 +1,8 @@
+{
+  "compilerOptions": {
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"]
+}

文件差异内容过多而无法显示
+ 1889 - 0
package-lock.json


+ 27 - 0
package.json

@@ -0,0 +1,27 @@
+{
+  "name": "productivity-platform-web",
+  "version": "0.0.0",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "lint": "eslint . --fix"
+  },
+  "dependencies": {
+    "@element-plus/icons-vue": "^2.3.1",
+    "element-plus": "^2.8.5",
+    "unplugin-auto-import": "^0.18.3",
+    "unplugin-vue-components": "^0.27.4",
+    "vue": "^3.5.11",
+    "vue-router": "^4.4.5"
+  },
+  "devDependencies": {
+    "@eslint/js": "^9.12.0",
+    "@vitejs/plugin-vue": "^5.1.4",
+    "eslint": "^9.12.0",
+    "eslint-plugin-vue": "^9.28.0",
+    "vite": "^5.4.8"
+  }
+}

二进制
public/favicon.ico


+ 10 - 0
src/App.vue

@@ -0,0 +1,10 @@
+<template>
+  <div>
+      <RouterView />
+  </div>
+ 
+</template>
+
+<style>
+</style>
+

+ 157 - 0
src/assets/base.css

@@ -0,0 +1,157 @@
+/* color palette from <https://github.com/vuejs/theme> */
+:root {
+  --vt-c-white: #ffffff;
+  --vt-c-white-soft: #f8f8f8;
+  --vt-c-white-mute: #f2f2f2;
+
+  --vt-c-black: #181818;
+  --vt-c-black-soft: #222222;
+  --vt-c-black-mute: #282828;
+
+  --vt-c-indigo: #2c3e50;
+
+  --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
+  --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
+  --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
+  --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
+
+  --vt-c-text-light-1: var(--vt-c-indigo);
+  --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
+  --vt-c-text-dark-1: var(--vt-c-white);
+  --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+
+  --thenme-color-orange: #ff6154;
+  --thenme-report-icon: #ff8176;
+}
+
+/* semantic color variables for this project */
+:root {
+  --color-background: var(--vt-c-white);
+  --color-background-soft: var(--vt-c-white-soft);
+  --color-background-mute: var(--vt-c-white-mute);
+
+  --color-border: var(--vt-c-divider-light-2);
+  --color-border-hover: var(--vt-c-divider-light-1);
+
+  --color-heading: var(--vt-c-text-light-1);
+  --color-text: var(--vt-c-text-light-1);
+
+  --section-gap: 160px;
+}
+
+@media (prefers-color-scheme: dark) {
+  :root {
+    --color-background: var(--vt-c-black);
+    --color-background-soft: var(--vt-c-black-soft);
+    --color-background-mute: var(--vt-c-black-mute);
+
+    --color-border: var(--vt-c-divider-dark-2);
+    --color-border-hover: var(--vt-c-divider-dark-1);
+
+    --color-heading: var(--vt-c-text-dark-1);
+    --color-text: var(--vt-c-text-dark-2);
+  }
+}
+
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+  margin: 0;
+  font-weight: normal;
+}
+
+body {
+  min-height: 100vh;
+  color: var(--color-text);
+  background: var(--color-background);
+  transition:
+    color 0.5s,
+    background-color 0.5s;
+  line-height: 1.6;
+  font-family:
+    Inter,
+    -apple-system,
+    BlinkMacSystemFont,
+    'Segoe UI',
+    Roboto,
+    Oxygen,
+    Ubuntu,
+    Cantarell,
+    'Fira Sans',
+    'Droid Sans',
+    'Helvetica Neue',
+    sans-serif;
+  font-size: 16px;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.avatar-wrapper {
+  width: 60px;
+  height: 60px;
+  position: relative;
+  border-radius: 0.3em;
+  background-color: #ff8176;
+  text-align: center;
+  line-height: 60px;
+  margin-left: -20px;
+}
+
+.icon-title {
+  font-size: 25px;
+  color: rgba(255, 255, 255, 1);
+  display: inline-block;
+  position: relative;
+}
+.example-list {
+  width: 95%;
+  margin-top: 20px;
+  border-top: 1.5px #dae1eb solid;
+  padding-top: 20px;
+}
+.report-item {
+  height: auto;
+  width: 100%;
+  margin-bottom: 20px;
+  border: none;
+}
+.report-icon {
+  float: left;
+  margin-left: -20px;
+}
+.report-text {
+  float: left;
+  height: auto;
+  width: 88%;
+  margin-left: 2%;
+}
+.report-text-type {
+  font-size: 18px;
+  font-weight: 600;
+}
+.report-text-name {
+
+}
+.report-button {
+  float: right;
+  width: 50px;
+  height: 50px;
+  margin-right: -20px;
+  margin-top: 0px;
+  font-size: 40px;
+  text-align: center;
+  border: 1.5px solid #dae1eb ;
+  border-radius: 0.3em;
+  color: #dae1eb;
+}
+.report-button:hover {
+  color: #ff6154;
+  border: 1.5px solid #ff6154;
+  cursor: pointer;
+}
+.report-text-name:hover {
+  color: #ff6154;
+  cursor: pointer;
+}

二进制
src/assets/icons/logout.png


二进制
src/assets/images/logo.jpg


二进制
src/assets/images/logo.png


+ 1 - 0
src/assets/logo.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>

+ 36 - 0
src/assets/main.css

@@ -0,0 +1,36 @@
+@import './base.css';
+
+#app {
+  width: 100%;
+  margin: 0 auto;
+  /* padding: 2rem; */
+  font-weight: normal;
+  background-color: #ffffff;
+}
+
+a,
+.green {
+  text-decoration: none;
+  color: hsla(160, 100%, 37%, 1);
+  transition: 0.4s;
+  padding: 3px;
+}
+
+@media (hover: hover) {
+  a:hover {
+    background-color: hsla(160, 100%, 37%, 0.2);
+  }
+}
+
+@media (min-width: 1024px) {
+  body {
+    display: flex;
+    place-items: center;
+  }
+
+  #app {
+    /* display: grid;
+    grid-template-columns: 1fr 1fr;
+    padding: 0 2em; */
+  }
+}

+ 51 - 0
src/layout/components/AppMain.vue

@@ -0,0 +1,51 @@
+<template>
+    <section class="app-main">
+      <router-view v-slot="{ Component }">
+        <transition>
+          <keep-alive>
+            <component :is="Component" />
+          </keep-alive>
+        </transition>
+      </router-view>
+    </section>
+  </template>
+  
+  <script>
+  export default {
+    name: 'AppMain',
+  
+    watch:{
+      $route: {
+        deep: true,
+        immediate: true,
+        handler() {
+          //console.log(this.$route.name)
+        },
+     },
+    },
+
+    data(){
+      return {
+      }
+    },
+    created(){
+    },
+    computed: {
+    
+    },
+  
+  
+    methods:{
+     
+  
+    }
+  }
+  </script>
+  
+  <style  scoped>
+  .app-main {
+    width: 100%;
+  }
+  </style>
+  
+  

+ 266 - 0
src/layout/components/Navbar.vue

@@ -0,0 +1,266 @@
+<template>
+    <div class="navbar">
+      <div class="titleDiv">
+        <img class="logclass" src="../../assets/images/logo.jpg" @click="goto('index')">
+        <div class="name">
+          <span>生产力平台</span>
+        </div>
+      </div>
+      <div class="meunsDiv">
+        <el-row :gutter="20">
+          <el-col :span="6"><div class="meuns"><span class="menu-text"
+             @mouseenter="showMenuCard(0)" @mouseleave="hiddenMenuCard(0)" @click="goto('major')">房地产报告</span></div></el-col>
+          <el-col :span="6"><div class="meuns"><span class="menu-text"
+            @mouseenter="showMenuCard(1)" @mouseleave="hiddenMenuCard(1)" @click="goto('assets')">资产报告</span></div></el-col>
+          <el-col :span="6"><div class="meuns"><span class="menu-text"
+            @mouseenter="showMenuCard(2)" @mouseleave="hiddenMenuCard(2)" @click="goto('planning')">土地报告</span></div></el-col>
+          <!-- <el-col :span="6"><div class="meuns"><span class="menu-text"
+            @mouseenter="showMenuCard(3)" @mouseleave="hiddenMenuCard(3)" @click="goto('personal')">个贷业务</span></div></el-col> -->
+        </el-row>
+        <el-card class='major-card' v-show="majorCardShow" @mouseenter="inCard(0)" @mouseleave="outCard(0)">
+          <template #header>
+            <div class="card-header">
+              <span>大中型</span>
+            </div>
+          </template>
+          <p v-for="o in 4" :key="o" class="text item">{{ 'List item ' + o }}</p>
+        </el-card>
+        <el-card class='assets-card' v-show="assetsCardShow" @mouseenter="inCard(1)" @mouseleave="outCard(1)">
+          <template #header>
+            <div class="card-header">
+              <span>资产</span>
+            </div>
+          </template>
+          <p v-for="o in 4" :key="o" class="text item">{{ 'List item ' + o }}</p>
+        </el-card>
+        <el-card class='planning-card' v-show="planningCardShow" @mouseenter="inCard(2)" @mouseleave="outCard(2)">
+          <template #header>
+            <div class="card-header">
+              <span>土地规划</span>
+            </div>
+          </template>
+          <p v-for="o in 4" :key="o" class="text item">{{ 'List item ' + o }}</p>
+        </el-card>
+        <el-card class='personal-card' v-show="personalCardShow" @mouseenter="inCard(3)" @mouseleave="outCard(3)">
+          <template #header>
+            <div class="card-header">
+              <span>个贷</span>
+            </div>
+          </template>
+          <p v-for="o in 4" :key="o" class="text item">{{ 'List item ' + o }}</p>
+        </el-card>
+      </div>
+      <div class="btnDiv">
+        <el-button class="btn" size="large" color="#ff6154"> 登 录 </el-button>
+      </div>
+    </div>
+    
+  </template>
+  
+  <script>
+
+  export default {
+  
+    props: {
+      
+    },
+    data() {
+      return {
+        majorCardShow:false,
+        assetsCardShow:false,
+        planningCardShow:false,
+        personalCardShow:false,
+        inMajor:false,
+        inAssets:false,
+        inPlanning:false,
+        inPersonal:false
+      }
+    },
+    computed: {
+     
+    },
+  
+    methods: {
+      async logout() {
+        await this.$store.dispatch('user/logout');
+        // this.$router.push(`/login?redirect=${this.$route.fullPath}`)
+        this.$router.push(`/login`);
+      },
+      showMenuCard(index){
+          if (index===0){
+              this.majorCardShow = true;
+          }
+          if (index===1){
+              this.assetsCardShow = true;
+          }
+          if (index===2){
+              this.planningCardShow = true;
+          }
+          if (index===3){
+              this.personalCardShow = true;
+          }
+      },
+      hiddenMenuCard(index){
+        setTimeout(() => {
+          if (index===0 && !this.inMajor){
+            this.majorCardShow = false;
+          }
+          if (index===1 && !this.inAssets){
+              this.assetsCardShow = false;
+          }
+          if (index===2 && !this.inPlanning){
+              this.planningCardShow = false;
+          }
+          if (index===3 && !this.inPersonal){
+              this.personalCardShow = false;
+          }
+        }, 50);
+          
+      },
+      inCard(index){
+        if (index===0){
+              this.inMajor=true;
+              this.majorCardShow = true;
+          }
+          if (index===1){
+              this.inAssets=true;
+              this.assetsCardShow = true;
+          }
+          if (index===2){
+              this.inPlanning=true;
+              this.planningCardShow = true;
+          }
+          if (index===3){
+              this.inPersonal=true;
+              this.personalCardShow = true;
+          }
+      },
+      outCard(index){
+        if (index===0){
+            this.inMajor = false;
+            this.majorCardShow = false;
+        }
+        if (index===1){
+            this.inAssets = false;
+            this.assetsCardShow = false;
+        }
+        if (index===2){
+            this.inPlanning = false;
+            this.planningCardShow = false;
+        }
+        if (index===3){
+            this.inPersonal = false;
+            this.personalCardShow = false;
+        }
+      },
+      goto(path){
+        this.$router.push(`/home/${path}`)
+      }
+     
+    }
+  }
+  </script>
+  
+  <style  scoped>
+ .navbar {
+  height: 80px;
+  position: relative;
+  background-color: #ffffff;
+  border-bottom: 1px #d7d7d7 solid;
+  /* box-shadow: 0px 2px 5px 0px rgba(153, 153, 153, 0.15); */
+  
+ }
+
+.logclass {
+    float: left;
+    height: 50px;
+    margin-top: 15px;
+    margin-left: 30px;
+    /* -webkit-clip-path: inset(0px 0px 0px 50px); */
+}
+.logclass:hover{
+  cursor: pointer;
+}
+.titleDiv {
+  width: 37.5%;
+  height: 100%;
+  float: left;
+}
+.meunsDiv{
+  width: 25%;
+  height: 100%;
+  float: left;
+}
+.meuns{
+  font-size: 20px;
+  text-align: center;
+  height: 80px;
+  line-height: 80px;
+}
+.menu-text{
+  color: #4e5879;
+}
+.menu-text:hover{
+  color: #ff6154;
+  cursor: pointer;
+}
+.btnDiv{
+  width: 37.5%;
+  height: 80px;
+  float: left;
+  line-height: 80px;
+  text-align: right;
+  color: #ffffff;
+  padding-right: 30px;
+}
+.btn{
+  color: #ffffff;
+  width: 100px;
+  height: 50px;
+  font-size: 15px;
+}
+.btn:hover{
+  color: #ffffff;
+}
+
+.name{
+  float: left;
+  color:black;
+  font-size:25px;
+  font-weight: bolder;
+  height: 80px;
+  line-height: 66px;
+  animation:focus-in-expand 1s cubic-bezier(.25,.46,.45,.94) both
+}
+@keyframes focus-in-expand{0%{letter-spacing:-.5em;filter:blur(12px);opacity:0}100%{filter:blur(0);opacity:1}}
+
+.major-card{
+  position:absolute;
+  top: 80px;
+  width: 480px;
+  border-radius: 10px;
+  text-align: left;
+}
+.assets-card{
+  position:absolute;
+  top: 80px;
+  left: 840px;
+  width: 480px;
+  border-radius: 10px;
+}
+.planning-card{
+  position:absolute;
+  top: 80px;
+  left: 965px;
+  width: 480px;
+  border-radius: 10px;
+}
+.personal-card{
+  position:absolute;
+  top: 80px;
+  left: 1090px;
+  width: 480px;
+  border-radius: 10px;
+}
+  </style>
+  

+ 2 - 0
src/layout/components/index.js

@@ -0,0 +1,2 @@
+export { default as AppMain } from './AppMain.vue'
+export { default as Navbar } from './Navbar.vue'

+ 34 - 0
src/layout/index.vue

@@ -0,0 +1,34 @@
+<script>
+import { AppMain, Navbar } from "./components";
+export default{
+    name:'layout',
+    components:{
+        Navbar,
+        AppMain
+    },
+    created(){
+      console.log("index.page")
+    },
+}
+</script>
+<template>
+    <div class="layout-index">
+        <div :class="{'fixed-header':true}">
+            <Navbar ref="navbar"/>
+        </div>
+        <div style="padding-top: 80px;display: flex;">
+            <AppMain></AppMain>
+        </div>
+    </div>
+</template>
+
+<style scoped>
+.fixed-header {
+  position: fixed;
+  top: 0;
+  right: 0;
+  z-index: 9;
+  width: 100%;
+  transition: width 0.28s;
+}
+</style>

+ 15 - 0
src/main.js

@@ -0,0 +1,15 @@
+import './assets/main.css'
+
+import { createApp } from 'vue'
+import App from './App.vue'
+import router from './router'
+
+
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
+const app = createApp(App)
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
+
+app.use(router).mount('#app')

+ 54 - 0
src/router/index.js

@@ -0,0 +1,54 @@
+import { createWebHashHistory, createRouter } from 'vue-router'
+
+import Layout from '../layout/index.vue'
+import HomeView from '../views/home/index.vue'
+import MajorHome from '../views/major/home.vue'
+import AssetsHome from '../views/assets/home.vue'
+import PlanningHome from '../views/planning/home.vue'
+import PersonalHome from '../views/personal/home.vue'
+
+const routes = [
+  {
+    path:'/',
+    redirect:'/home/index'
+  },
+  {
+    path: '/home',
+    component: Layout,
+    name: 'home',
+    children: [
+      {
+        path: 'index',
+        component: HomeView,
+        name: 'homeIndex',
+      },
+      {
+        path: 'major',
+        component: MajorHome,
+        name: 'majorIndex'
+      },
+      {
+        path: 'assets',
+        component: AssetsHome,
+        name: 'assetsIndex'
+      },
+      {
+        path: 'planning',
+        component: PlanningHome,
+        name: 'planningIndex'
+      },
+      {
+        path: 'personal',
+        component: PersonalHome,
+        name: 'personalIndex'
+      }
+    ]
+  },
+]
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes,
+})
+
+export default router

+ 27 - 0
src/views/assets/home.vue

@@ -0,0 +1,27 @@
+<script>
+export default {
+  name:'assetsHome',
+  data() {
+    return {
+      msg: 0
+    }
+  }
+}
+</script>
+
+<template>
+  <div class="home">
+     ASSETS_HOME
+  </div>
+</template>
+
+<style scoped>
+  .home {
+    background-color: #ffffff;
+    min-height: calc(100vh - 80px);
+    min-width: 1520px;
+    margin-left: 160px;
+
+  }
+</style>
+

文件差异内容过多而无法显示
+ 248 - 0
src/views/home/index.vue


+ 30 - 0
src/views/login/index.vue

@@ -0,0 +1,30 @@
+<template>
+  <div class="greetings">
+    <h1 class="green">这是登录页</h1>
+  </div>
+</template>
+
+<style scoped>
+h1 {
+  font-weight: 500;
+  font-size: 2.6rem;
+  position: relative;
+  top: -10px;
+}
+
+h3 {
+  font-size: 1.2rem;
+}
+
+.greetings h1,
+.greetings h3 {
+  text-align: center;
+}
+
+@media (min-width: 1024px) {
+  .greetings h1,
+  .greetings h3 {
+    text-align: left;
+  }
+}
+</style>

+ 26 - 0
src/views/major/home.vue

@@ -0,0 +1,26 @@
+<script>
+export default {
+  name:'majorHome',
+  data() {
+    return {
+      msg: 0
+    }
+  }
+}
+</script>
+
+<template>
+  <div class="home">
+     MAJOR_HOME
+  </div>
+</template>
+
+<style scoped>
+  .home {
+    background-color: #ffffff;
+    min-height: calc(100vh - 80px);
+    min-width: 1520px;
+    margin-left: 160px;
+  }
+</style>
+

+ 26 - 0
src/views/personal/home.vue

@@ -0,0 +1,26 @@
+<script>
+export default {
+  data() {
+    return {
+      msg: 0
+    }
+  }
+}
+</script>
+
+<template>
+  <div class="home">
+     PERSONAL
+  </div>
+</template>
+
+<style scoped>
+  .home {
+    background-color: #ffffff;
+    min-height: calc(100vh - 80px);
+    min-width: 1520px;
+    margin-left: 160px;
+
+  }
+</style>
+

+ 26 - 0
src/views/planning/home.vue

@@ -0,0 +1,26 @@
+<script>
+export default {
+  data() {
+    return {
+      msg: 0
+    }
+  }
+}
+</script>
+
+<template>
+  <div class="home">
+     PLANNING
+  </div>
+</template>
+
+<style scoped>
+  .home {
+    background-color: #ffffff;
+    min-height: calc(100vh - 80px);
+    min-width: 1520px;
+    margin-left: 160px;
+
+  }
+</style>
+

+ 27 - 0
vite.config.js

@@ -0,0 +1,27 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import AutoImport from 'unplugin-auto-import/vite'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+
+// https://vite.dev/config/
+export default defineConfig({
+  plugins: [
+    vue(),
+
+    AutoImport({
+      resolvers: [ElementPlusResolver()],
+    }),
+    
+    Components({
+      resolvers: [ElementPlusResolver()],
+    }),
+  ],
+  resolve: {
+    alias: {
+      '@': fileURLToPath(new URL('./src', import.meta.url))
+    }
+  }
+})