本文共 4344 字,大约阅读时间需要 14 分钟。
在使用Vue技术栈开发管理系统时,建立高效的开发目录结构至关重要。以下是我基于实际项目总结的开发目录和实用技巧,供开发者参考。
项目中主要依赖包括:
├── api/ # API接口管理│ ├── config.js # 请求配置│ ├── index.js # axios封装│ └── types.js # 接口类型定义├── components/ # 组件库│ ├── el-icon/ # icon组件│ │ ├── Icon.vue│ │ └── assets/ # 图标素材│ └── el-message/ # 消息提示组件├── plugins/ # Vue插件目录├── router/ # 路由定义│ └── index.js # 路由配置├── store/ # Vuex状态管理│ ├── index.js # 主状态管理│ └── types.js # 状态类型定义├── views/ # 业务组件│ ├── Home.vue # 主页面│ └── Login.vue # 登录页面└── main.js # 项目入口
import Vue from 'vue';import 'babel-polyfill';import App from './App.vue';import router from './router';import store from './store/index.js';import { gl_ajax } from './api/index.js';import ElementUI from 'element-ui';import 'element-ui/lib/theme-chalk/index.css';Vue.prototype.$gl_ajax = gl_ajax;Vue.config.productionTip = false;Vue.use(ElementUI);new Vue({ el: '#app', store, router, components: { App, }, template: ''});
gl_ajax
函数挂载到Vue.prototype.$gl_ajax
,方便全局使用。import Vue from 'vue';import VueRouter from 'vue-router';import store from '../store/index.js';import * as types from '../store/types.js';Vue.use(VueRouter);const routes = [ { path: '', redirect: '/login' }, { path: '/', component: require('@/views/Home.vue'), children: [ { path: '/admin', name: 'admin', component: require('@/views/index.vue') } ] }, { path: '/login', name: 'Login', component: require('@/views/Login.vue') }];const router = new VueRouter({ mode: 'history', routes});router.beforeEach((to, from, next) => { if (to.path === '/login') { store.commit(types.LOGOUT); next(); } else { const token = sessionStorage.getItem('token'); if (!token) { next({ path: '/login', query: { redirect: to.fullPath } }); } else { next(); } }});export default router;
sessionStorage
中的token,确保登录状态。import Vue from 'vue';import Vuex from 'vuex';import * as types from './types.js';Vue.use(Vuex);export default new Vuex.Store({ state: { token: null }, mutations: { [types.LOGOUT]: (state, data) => { sessionStorage.removeItem('token'); state.token = null; }, [types.LOGIN]: (state, data) => { sessionStorage.setItem('token', data); state.token = data; } }, actions: {}, getters: {}});
export const gl_ajax = params => { return axios({ method: params.method.toLowerCase(), url: `${axios.defaults.baseURL}${params.url}`, data: params.method !== 'get' ? params.data : '', params: params.method === 'get' ? params.data : '', responseType: params.file ? 'blob' : '' }) .then(res => { params.success && params.success(res); }) .catch(err => { params.error && params.error(err); });};
responseType
为blob
的文件下载。gl_ajax
统一处理各种请求。get
和post
方法,适用于不同接口。axios.interceptors.response.use( response => { return response; }, error => { if (error.response) { switch (error.response.status) { case 401: store.commit(types.LOGOUT); router.replace({ path: '/login', query: { redirect: router.currentRoute.path } }); const message = error.response.data.message ? '未知错误' : '登录失败'; Message.error(message); break; case 403: Message.error('权限不足'); router.replace({ path: '/login' }); break; } } else if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) { Message.error('请求超时'); } return Promise.reject(error); });
通过以上优化后的内容,项目开发流程更加清晰,代码结构更易维护,适合中大型项目使用。如有需要,可以根据实际项目需求进行细化和扩展。
转载地址:http://bfdp.baihongyu.com/