# cms-vue3-ts-elementPlus **Repository Path**: lljCodeHouse/cms-vue3-ts-elementPlus ## Basic Information - **Project Name**: cms-vue3-ts-elementPlus - **Description**: vue3+typescript+elemenetPlus 后台管理系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-12-13 - **Last Updated**: 2022-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue3+ts+elementPlus+echarts 后台管理系统 ## 按需导入 element-Plus 1. npm i element-plus (https://element-plus.gitee.io/zh-CN/) 2. global->register-element.ts ```ts import { App } from 'vue' import { ElButton } from 'element-plus' import 'element-plus/dist/index.css' //用到的组件 const components = [ElButton] //遍历全局注册组件 export default function (app: App): void { for (const component of components) { app.component(component.name, component) } } ``` 4. global->index.ts ```ts import { App } from 'vue' import registerElement from './register-element' export function globalRegister(app: App): void { registerElement(app) } ``` 5. npm i normalize.css 清除元素默认样式 6. assets->css->base.less index.less 定义全局样式 7. main.ts ```ts import 'normalize.css' import './assets/css/index.less' ``` ## 用类封装 axios,配置 3 种拦截器 ,loading 图标 1. npm i axios (http://www.axios-js.com/zh-cn/docs/) 2. service->request->config.ts (存放 axios 实例配置) ```ts //基础路径 let BASE_URL = '' //请求超时时间 const TIME_OUT = 5000 if (process.env.NODE_ENV === 'development') { BASE_URL = '/api' } else if (process.env.NODE_ENV === 'production') { BASE_URL = 'http://coderwhy.org/prod' } else { BASE_URL = 'http://coderwhy.org/test' } export { BASE_URL, TIME_OUT } ``` 3. service->request->types.ts ```ts import type { AxiosRequestConfig, AxiosResponse } from 'axios' //定义拦截器类型 export interface IInterceptors { requestInterceptor?: (config: AxiosRequestConfig) => AxiosRequestConfig requestErrorInterceptor?: (error: any) => any responseInterceptor?: (res: T) => T responseErrorInterceptor?: (error: any) => any } //扩展config(请求配置)类型 export interface IConfig extends AxiosRequestConfig { interceptors?: IInterceptors isShowLoading?: boolean } ``` 4. service->request->index.ts 用类封装 axios ```ts import axios from 'axios' import type { AxiosInstance } from 'axios' import type { IInterceptors, IConfig } from './type' import { ElLoading } from 'element-plus' import { LoadingInstance } from 'element-plus/es/components/loading/src/loading' const DEFAULT_LOADING = true //创建封装axios类 class AxiosRequest { //axios实例 instance: AxiosInstance //ElLoading实例 loading?: LoadingInstance //是否需要loading isShowLoading: boolean //自定义拦截器 interceptors?: IInterceptors constructor(config: IConfig) { //创建axios实例 this.instance = axios.create(config) //默认为true this.isShowLoading = config.isShowLoading ?? DEFAULT_LOADING this.interceptors = config.interceptors //使用拦截器 //从config中取出的拦截器是对应的实例的拦截器 this.instance.interceptors.request.use( this.interceptors?.requestInterceptor, this.interceptors?.requestErrorInterceptor ) this.instance.interceptors.response.use( this.interceptors?.responseInterceptor, this.interceptors?.responseErrorInterceptor ) //添加所有的实例都有的拦截器 this.instance.interceptors.request.use( (config) => { if (this.isShowLoading) { this.loading = ElLoading.service({ text: '加载中...' }) } return config }, (err) => { return err } ) this.instance.interceptors.response.use( (res) => { this.loading?.close() const data = res.data console.log('全', data, res) return data }, (err) => { this.loading?.close() console.log('请求失败', err) return err } ) } request(config: IConfig): Promise { return new Promise((resolve, reject) => { //单个请求对请求config的处理 if (config.interceptors?.requestInterceptor) { config = config.interceptors.requestInterceptor(config) } //判断是否需要显示loading if (config.isShowLoading === false) { this.isShowLoading = config.isShowLoading } this.instance .request(config) .then((res) => { //单个请求对数据的处理 if (config.interceptors?.responseInterceptor) { res = config.interceptors.responseInterceptor(res) } this.isShowLoading = DEFAULT_LOADING resolve(res) }) .catch((err) => { this.isShowLoading = DEFAULT_LOADING reject(err) }) }) } get(config: IConfig): Promise { return this.request({ ...config, method: 'GET' }) } post(config: IConfig): Promise { return this.request({ ...config, method: 'POST' }) } delete(config: IConfig): Promise { return this.request({ ...config, method: 'DELETE' }) } patch(config: IConfig): Promise { return this.request({ ...config, method: 'PATCH' }) } } export default AxiosRequest ``` 5. service->index.ts 导出一个 axiosRquest 实例 ## Login ![login.png](./readmeImages/login.png) 1. views->Login->Login.vew login 页面 2. router->index 注册 login 路由配置,设置路由守卫 3. views->Login->cpns->LoginAccount.vue LoginPanel.vue LoginPhone.vue 创建子组件