# v3-admin
**Repository Path**: hdw0504/v3-admin
## Basic Information
- **Project Name**: v3-admin
- **Description**: Vue3+TS+vite3+vueuse+pinia+unocs+element Plus+vitest的后台模板
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://v3-admin.netlify.app/
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-11-24
- **Last Updated**: 2024-06-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Vue 3.2 + TypeScript + Pinia + Vite3 + Element-Plus + vueuse + unocss + vitest 管理系统
### 在线预览/仓库地址
link: https://v3-admin.netlify.app
github: https://github.com/hdw0504/v3-admin
### 其余模板
nuxt3 + element plus 模板\
link: https://element-plus-nuxt3.netlify.app
github: https://github.com/hdw0504/el-plus-nuxt3
### 项目前身今世
基于 [vitesse-lite](https://github.com/antfu/vitesse-lite)\
复刻 [Geeker-Admin](https://github.com/HalseySpicy/Geeker-Admin)\
该后台算是 `Geeker-admin` 的精简版 + vueuse + unocss
把无用的功能删掉出来,只有最干净的架子\
包管理使用 `pnpm`,使用 `nr up` 更新依赖(nr 是一个包管理工具名为 [ni](https://github.com/antfu/ni) 的指令)
### 项目技术栈
- **Vue 3.2**
- 使用 `script setup`、`composition api`
- 使用 `mitt` 用于事件总线(vue2 的 eventBus)
- **TypeScript**
- 使用 ts 并开启严格模式
- **Pinia**
- 使用 `setup store` 抛弃厚重的 ~~vuex~~ 写法 (拜拜了 `mutation`)
- **Vite3**
- 配置了自动注册、跨域代理、打包分析、gzip压缩
- **vueuse**
- 自动引入vueuse,多处使用如 `useMagicKeys` `whenever` `useDark` `useToggle` `useCssVar` 等
- **unocss**
- 整个项目的样式全用 unocss 编写,简洁代码
- **Element-Plus**
- 无需手动引入,按需加载,支持定制主题和暗黑模式
- **vitest**
- 支持 vitest 编写测试用例
- **pnpm**
- 项目的包管理工具
### 项目截图
### TODO:
- 打包优化
- 使用按需注册icon,包体积减少200kb
- 开发优化
- 预加载样式和必备依赖
- 无缓存时加载太久(也许是 autoimport + scss 主题导致)
- ~~定制不同颜色的背景和主题~~
### unocss
如何 import 别的css文件(里面包含unocss的--at-apply)\
在 sass 未来版本中会逐步用 `@use` 来代替 `@import`[Introducing Sass Modules](https://css-tricks.com/introducing-sass-modules/)
``` scss
// custom element css
@use './element.scss' as *;
// reset style sheet
@use './reset.scss' as *;
// css common style sheet
@use './common.scss' as *;
// css root var
@use './root.scss' as *;
// css transiton
@use './transition.scss' as *;
// import element dark and light theme
// 里面有暗黑和默认的 element 的默认颜色
@use "element-plus/theme-chalk/src/dark/css-vars.scss" as *;
```
在 `scss` 中使用 `@apply` 会有点问题 [@apply bug issue](https://github.com/unocss/unocss/issues/809)\
解决方案:使用 `--at-apply:` 代替 `@apply`
```scss
```
```ts
// unocss.config.ts
transformers: [
transformerDirectives()
]
```
### Pinia
使用 `setup store` 替代 `option store (vuex)` 的写法 [setup-stores](https://pinia.vuejs.org/zh/core-concepts/#setup-stores)\
官网话术:\
在 _Setup Store_ 中:
- `ref()` 就是 `state`
- `computed()` 就是 `getters`
- `function()` 就是 `actions`
Setup store 比 Option Store 带来了更多的灵活性,因为你可以在一个 store 内创建侦听器,并自由地使用任何组合式函数。**不过,请记住,使用组合式函数会让 SSR 变得更加复杂。**
### Element Plus
主题配置参考
[element-plus-vite-starter](https://github.com/element-plus/element-plus-vite-starter)\
[elment plus 自定义主题文档](https://element-plus.gitee.io/zh-CN/guide/theming.html)\
**本项目不支持直接在页面配置主题颜色 (意思就是不支持动态配置)**\
**支持配置css颜色修改主题色 (暗黑模式和默认模式可使用不同主题色)**\
`styles/element/dark.scss` => 修改暗黑主题色配置\
`styles/element/index.scss` => 修改默认主题色配置\
`styles/element.scss` => 修改全局 element 组件样式\
`styles/root.css` => 自定义全局css变量
### 已解决问题
#### 解决 `unplugin-auto-import` 在加载登录页的时候并未注册 `ElMessage` 和 `ElNotification`
确保去掉引入文件(`import xxx from 'element-plus'`) 删除或注释掉手动引入的组件 重启项目就没问题了 [el-plus-auto-import-solution](https://github.com/hdw0504/el-plus-auto-import-solution)
#### 非全局引入el-icon时,解决异步 icon(``)不会自动引入 icon 问题
解决方案1
- 参考官方issue [Dynamic icon components](https://github.com/antfu/unplugin-icons/issues/5)
解决方案2
- `ni -D @iconify/vue` [文档](https://www.npmjs.com/package/@iconify/vue)
- 使用 `` 他会根据你的 iconname 请求服务获取 svg,然后存储到localstoreage,供下次使用
- 因为为了减少无用icon占用打包容量 (打包后少了200kb) ,没有全局注册 icon 组件。所以当用到 icon 的时候不能直接把icon name直接写到组件的icon属性中(如 `` 这样子是不支持的),需要手动引入图片icon文件,参考 `pages/login/components/loginForm.vue`