基于 es6、vue、vuex、vue-router 、vue-cli 、axios 和 element-ui,(请求数据使用Mock.js进行模拟)
Vue 生态圈
建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题, 也可使用 yarn 替代 npm
npm install --registry=https://registry.npm.taobao.org
├── build // 构建相关
├── config // 配置相关
├── src // 源代码
│ ├── api // 所有请求
│ ├── assets // 主题 字体等静态资源
│ ├── components // 全局公用组件
│ ├── directive // 全局指令
│ ├── filtres // 全局 filter
│ ├── icons // 项目所有 svg icons
│ ├── lang // 国际化 language
│ ├── mock // 项目mock 模拟数据
│ ├── router // 路由
│ ├── store // 全局 store管理
│ ├── styles // 全局样式
│ ├── utils // 全局公用方法
│ ├── vendor // 公用vendor
│ ├── views // view
│ ├── App.vue // 入口页面
│ ├── main.js // 入口 加载组件 初始化等
│ └── permission.js // 权限管理
├── static // 第三方不打包资源
│ └── Tinymce // 富文本
├── .babelrc // babel-loader 配置
├── eslintrc.js // eslint 配置项
├── .gitignore // git 忽略项
├── favicon.ico // favicon图标
├── index.html // html模板
└── package.json // package.json
carrier.js
user.js
sim_card.js
// example
export function login(data) {
return request({
url: '/user/login',
method: 'post',
data
})
}
export function getInfo(token) {
return request({
url: '/user/info',
method: 'get',
params: { token }
})
}
views 中可以分 使用admin命名空间区分页面,每个模块下(如 sim_cards 下可建立文件夹compents 放置通用组件)
new webpack.ProvidePlugin({
$: 'jquery' ,
'jQuery': 'jquery'
})
resolve: {
alias: {
'@': resolve(__dirname, 'src')
}
}
//使用
import stickTop from '@/components/stickTop'
"build:prod": "NODE_ENV=production node build/build.js",
"build:stage": "NODE_ENV=stage node build/build.js"
1.跨域问题
全称为 Cross Origin Resource Sharing(跨域资源共享)。对应前端来说和平时发请求写法上没有任何区别,工作量基本都在后端。每一次请求浏览器必须先以 OPTIONS 请求方式发送一个预请求,从而获知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许该跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。推荐的原因是只要第一次配好了,之后不管有多少接口和项目复用就可以了,一劳永逸的解决了跨域问题,而且不管是开发环境还是测试环境都能方便的使用。
在dev 开发模式下可以下使用webpack 的 proxy使用。但这种方法在生产环境是不适用的。在生产环境中需要使 用Nginx反向代理 不管是 proxy 和 nginx 的原理都是一样的通过搭建一个中转服务器来转发请求规避跨域的问题。
mock-server
来模拟数据,线上环境还是继续使用mockjs
来进行模拟<router-view :key="key"></router-view>
computed: {
key() {
return this.$route.name !== undefined? this.$route.name + +new Date(): this.$route + +new Date()
}
}
效果:
借助 vue-router
,使用嵌套路由配置,就可以很简单地表达这种关系
创建的 app:
<div id="app">
<router-view></router-view>
</div>
这里的 <router-view>
是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套 <router-view>
。例如,在 AppMain 组件的模板添加一个 <router-view>
:
const AppMain = {
template: `
<div class="app-main">
<h2>AppMain</h2>
<router-view></router-view>
</div>
`
}
组合Sidebar Navbar Appmain 成组件Layout
import { AppMain, Navbar, Sidebar } from './components'
export default {
name: 'Layout',
components: {
AppMain,
Navbar,
Sidebar,
}
}
要在嵌套的出口中渲染组件,需要在 VueRouter
的参数中使用 children
配置:
{
// 不需要layout
path: '/404',
component: () => import('@/views/error-page/404'),
},
{
path: '/users',
component: Layout,
children: [
{
path: 'index',
component: () => import('@/views/users/index'),
}
]
}
要注意,以 /
开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。
你会发现,children
配置就是像 routes
配置一样的路由配置数组,所以呢,你可以嵌套多层路由。
登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到cookie中,保证刷新页面后能记住用户登录状态),前端会根据token再去拉取一个 user_info 的接口来获取用户的详细信息(如用户权限,用户名等等信息)。
权限验证:通过token获取用户对应的 role,动态根据用户的 role 算出其对应有权限的路由,通过 router.addRoutes 动态挂载这些路由。(vue-router官方推荐通过meta标签来标示 meta: { role: ['admin','super_editor'] }
)
{path: 'form/edit', component: Form, name: '编辑form', meta: {isEdit: true} }
{path: 'form/create', component: Form, name: '创建form' }
computed: {
isEdit() {
return this.$route.meta.isEdit // 根据meta判断
// return this.$route.path.indexOf('edit') !== -1 // 根据路由判断
}
},
created() {
if (this.isEdit) {
this.fetchData();
}
}
const _import = require('./_import_' + process.env.NODE_ENV);
const Foo = _import('Foo');
Component
@/src/components/BackToTop/index.vue
@/src/components/Charts/Line.vue
@/src/views/example/components/Button.vue
JS 文件
@/src/utils/open-window.js
@/src/views/svg-icons/require-icons.js
@/src/components/MarkdownEditor/default-options.js
Views
使用横线连接 (kebab-case)来命名views主要是出于以下几个考虑。
@/src/views/svg-icons/index.vue
@/src/views/svg-icons/require-icons.js
.sky-hearder
, .sky-bread