# vue3-admin-template **Repository Path**: ued-fpi/vue3-admin-template ## Basic Information - **Project Name**: vue3-admin-template - **Description**: vue3版本的代码仓库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-05-18 - **Last Updated**: 2025-08-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue3-admin-template > 存在两个git地址 > - gitee https://gitee.com/ued-fpi/vue3-admin-template.git 用于fpi init脚本执行拉取模版时无权限 > - gitlab https://git.fpi-inc.site/product/ued-products/vue3-admin-template.git 真实模版源码地址 ## 一、项目介绍 > - vue3 前端开发脚手架模版,方向为后台管理系统类型的项目 > - 使用了 pnpm 包管理工具 > - 集成技术为 typescript vite3 vue3 vue-router pinia element-plus echarts dayjs axios lodash-es 等 ## 二、辅助开发工具 - commit 规范集成,所有的 commit 都会被校验,不符合[https://git.fpi-inc.site/documents/common/wikis/Git%E6%97%A5%E5%BF%97%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83]内说明规范的,无法提交 - 集成辅助 commit 工具,使用 npm run cz 命令可以打开交互式提交命令窗口 - eslint,prettier,stylelint 规范集成,保证代码走一遍检查,风格统一 ## 三、主要命令说明 ```json { "dev": "vite", // 本地启动开发 "build": "vite build", // 打包构建生产包(会检查ts) "preview:build": "vite build --mode preview-build", // 预览打包,目的是配合 preview 命令进行预览 "preview": "vite preview", // 预览,dist文件夹下必须有内容 "type-check": "vue-tsc --noEmit", // ts类型检查 "lint-staged": "lint-staged", // lint-staged "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", // eslint "lint:stylelint": "stylelint src/**/*.{vue,css,scss} --fix", // stylelint "prepare": "husky install", // 无需关心,系统自调用 "cz": "npx cz" // 交互式提交命令,通过使用此命令,可以提交绝对符合规范的提交日志 } ``` ## 四、项目主要目录文件说明 ```typescript ├── dist // 最终build出的目录 ├── public // 存放无需打包的文件,如第三方的js文件,大图片,视频等资源 ├── src // 源码目录 │ ├── assets // 静态文件 │ ├── components // 公共组件,建议只放置两处或两处以上使用的公共组件,只是为了业务拆分的请放置在views下页面内自己的components内 │ ├── config // 配置文件 │ ├── router // 路由定义文件 │ ├── services // 服务端接口定义 │ ├── stores // 数据仓库定义 │ ├── styles // 公共样式定义 │ ├── utils // 公共工具定义 │ └── views // 页面 │ ├── App.vue // 入口App.vue │ ├── main.ts // 入口文件 │ ├── systemAuth.ts // 用户信息&权限页面加载前的前置获取 ├── .eslintignore // eslint忽略文件 ├── .eslintrc.cjs // eslint配置 ├── .gitignore // git忽略文件 ├── .husky // git提交钩子设置 ├── .prettierignore // prettier忽略文件 ├── .prettierrc.js // prettier配置 ├── .stylelintignore // stylelint忽略文件 ├── .stylelintrc.js // stylelint配置 ├── README.md // readme ├── auto-imports.d.ts // 自动导入 由插件自动处理,无需修改 ├── commitlint.config.js // commit提交规范配置 ├── components.d.ts // 自动导入 由插件自动处理,无需修改 ├── env.d.ts // 部分包ts的声明文件 ├── index.html // 入口html ├── package.json // 包配置文件 ├── pnpm-lock.yaml // pnpm lock文件 ├── tsconfig.config.json // ts配置 ├── tsconfig.json // ts配置 ├── vite.config.ts // vite配置 ``` ## 五、重要源码目录详细说明 ### 1、index.html - 根 html 入口页面 ### 2、public - 存放第三方的库或者不想被编译打包的文件,如 js,图片,视频 - 注意 js 文件必须是浏览器可直接使用的,如 umd 规范,iife 规范的 js 文件,因为不会被编译。 - public 下的文件如果想在 src 源码目录下使用,可以绝对路径的方式,如下 ```typescript const jsUrl = import.meta.env.BASE_URL + 'env.js' const imgUrl = import.meta.env.BASE_URL + 'images/test-img.png' ``` - public 下的文件如果想在 index.html 文件下使用,可以相对路径的方式,因为最终 build 出 dist 文件后,index.html 会和 public 文件夹内的文件在同一目录下 ,如下 ```html ``` ### 3、src > systemAuth.ts - 暴露出一个名叫 systemAuth 的 promise 方法, - 用于获取用户信息和用户菜单权限等 - 需要在页面内容加载前的前置调用的内容 - 具体内容可以查看 systemAuth.ts, 使用如下 ```typescript systemAuth().then(res => { if (res) { app.mount('#app') } }) ``` ### 4、src > config - 用于系统编写过程中可能会用到的配置项 - 集成 3 块的配置项 - 配置 1 window.ENV 来源文件 public/env.js - 配置 2 devAndProdConfig 与开发还是生产相关的配置,来源文件 src/config/devAndProdConfig.ts - 配置 3 commonConfig, 静态配置。来源文件 src/config/index.ts - src/config/type.ts 编写配置相关的类型 WindowEnvConifg DevOrProdEnvConfig CommonConfig 分别对应配置 1,2,3 - 最终 3 个配置聚集在一处,使用均通过 import { allConfig } from '@/config' 导出使用即可 - 没有使用默认导出,是为了防止各个文件导出后的名字不一致 ### 5、src > components - 只放置公共开发的组件, 在页面其它处的引用达到两个及两次以上的组件 - 只是业务拆分而产生的组件可以放置在 views 下的页面文件夹下的 components 内 - 内置组件 - SvgIcon 组件,请阅读当前组件下的 read.md - BaseEcharts 组件, 请阅读当前组件下的 read.md - LayoutHeader 组件, 头部菜单组件 ### 6、src > services - 使用 utils 文件夹下的 request.ts 作为请求方法 - 主要分为两种文件 types.d.ts 文件写入参和出参的类型声明, [xxxx].ts 定义接口请求方法 - types.d.ts 类型无需导入导出,可直接使用 - 具体案例参考如下 ```typescript // src/services/global/types.d.ts 文件 declare namespace GLOBAL_API { type GetUserInfo = { account: string address: string comment: string email: string idcardNo: string inHangzhou: number mobilePhone: string name: string orgId: number orgName: string phone: string status: string telephone: string updatePasswordTime: number userId: number userIdStr: string userUuid: string } } // src/services/global/index.ts import request from '@/utils/request' export const getUserInfo = () => { return request({ url: '/user/login-user', server: 'simple', }) } ``` ### 7、src > stores - 定义数据仓库,使用了 pinia, 具体查看[https://pinia.web3doc.top/introduction.html#%E5%9F%BA%E6%9C%AC%E7%A4%BA%E4%BE%8B] - 有两种定义方式 - 常规标准方式 ```typescript import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => { return { count: 0 } }, actions: { increment() { this.count++ }, }, }) ``` - 定义 hooks 的方式 ```typescript import { reactive } from 'vue' import { defineStore } from 'pinia' import { allConfig } from '@/config' import { getSystemMenus, getUserInfo } from '@/services/global' /** * 在使用时,需要使用 storeToRefs 包裹 如下 * const globalStore = useGlobalStore() * const { userInfo } = storeToRefs(globalStore) * 原因:使用ref生成值, 直接导出ref的值会被解构 */ export const useGlobalStore = defineStore('globalState', () => { const userInfo = reactive({ name: 'test1' }) const getAsyncUserInfo = async () => { const data = await getUserInfo() Object.assign(userInfo, data) } const systemMenus = reactive([]) const getAsyncHttpAuth = async () => { const { data } = await getSystemMenus({ systemCode: allConfig.systemCode, }) Object.assign(systemMenus, data.entries) } return { userInfo, getAsyncUserInfo, getAsyncHttpAuth } }) ``` ### 8、src > styles - 公共样式定义 ### 9、src > router - 路由定义 - 不在建议使用直接导入全部路由的方式,然后根据文件路径自动生成路由的方式 - 建议使用什么路由,定义具体路径,具体导入方式可以使用直接导入或者懒加载导入的方式,具体如下: ```typescript import { createRouter, createWebHashHistory } from 'vue-router' import SvgUseDemo from '@/views/svg-use-demo/index.vue' import EChartsUseDemo from '@/views/echarts-use-demo/index.vue' const router = createRouter({ history: createWebHashHistory(import.meta.env.BASE_URL), routes: [ { path: '/svg-use-demo', name: SvgUseDemo.name, component: SvgUseDemo, }, { path: '/echarts-use-demo', name: EChartsUseDemo.name, component: EChartsUseDemo, }, { path: '/other', name: 'other', component: () => import('@/views/other/index.vue'), }, { path: '/', redirect: '/svg-use-demo', }, ], }) export default router ``` ### 10、src > views - 页面文件定义 - 文件目录定义示例如下 ```typescript // 案例 ├── views │ ├── page1 // 页面1 │ ├── ├── components // 业务内组件 │ ├── ├── PageHeader.vue // 业务内组件1 │ ├── ├── PageCard.vue // 业务内组件2 │ ├── ├── index.vue // 页面1入口文件 │ ├── page2 // 页面1 │ ├── ├── components // 业务内组件 │ ├── ├── Page2Header.vue // 业务内组件1 │ ├── ├── Page2Card.vue // 业务内组件2 │ ├── ├── index.vue // 页面2入口文件 ``` - 提供内置代码示例页面 - svg-use-demo SvgIcon 组件的使用案例&所有 SvgIcon 组件所有可用的 Svg - echarts-use-demo 如何使用 BaseECharts 组件 ### 11、src > utils - 公用方法定义 ### 12、src > assets - 静态文件放置