This commit is contained in:
cshsh 2017-11-29 08:31:49 +00:00 committed by GitHub
commit ffba1ce657
9 changed files with 91 additions and 137 deletions

155
README.md
View File

@ -4,37 +4,37 @@
# vue-element-admin # vue-element-admin
[![vue](https://img.shields.io/badge/vue-2.4.2-brightgreen.svg)](https://github.com/vuejs/vue) [![vue](https://img.shields.io/badge/vue-2.5.9-brightgreen.svg)](https://github.com/vuejs/vue)
[![element-ui](https://img.shields.io/badge/element--ui-1.4.2-brightgreen.svg)](https://github.com/ElemeFE/element) [![element-ui](https://img.shields.io/badge/element--ui-2.0.5-brightgreen.svg)](https://github.com/ElemeFE/element)
[![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE) [![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg)]() [![GitHub release](https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg)]()
**A magical vue admin.**
[线上地址](http://panjiachen.github.io/vue-element-admin) - [线上地址](http://panjiachen.github.io/vue-element-admin)
[English Document](https://github.com/PanJiaChen/vue-element-admin/blob/master/README-en.md) - [使用文档](https://panjiachen.github.io/vue-element-admin-site/#/)
[wiki](https://github.com/PanJiaChen/vue-element-admin/wiki) - [English Document](https://github.com/PanJiaChen/vue-element-admin/blob/master/README-en.md)
[donate](https://github.com/PanJiaChen/vue-element-admin#donate) - [wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)
- [donate](https://panjiachen.github.io/vue-element-admin-site/#/donate)
**本项目的定位是后台集成方案,不适合当基础模板来开发。** **本项目的定位是后台集成方案,不适合当基础模板来开发。**
- 模板建议使用: [vueAdmin-template](https://github.com/PanJiaChen/vueAdmin-template)   - 模板建议使用: [vueAdmin-template](https://github.com/PanJiaChen/vueAdmin-template)  
- 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) - 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
**注意该项目目前使用element-ui@2.0.5版本,所以最低兼容 Vue 2.5.0**
**注意该项目目前使用element-ui@1.4.2版本,所以最低兼容 Vue 2.3.0**
楼主这里有一份调查[问卷](https://www.wjx.cn/m/16866569.aspx) 有空请填写一下,以表对本项目的支持~ps:不是给这个调查问卷网站做广告,所以填完问卷不用点上面抽奖有的没的那些东西 楼主这里有一份调查[问卷](https://www.wjx.cn/m/16866569.aspx) 有空请填写一下,以表对本项目的支持~ps:不是给这个调查问卷网站做广告,所以填完问卷不用点上面抽奖有的没的那些东西
## 前言 ## 前序准备
> 这半年来一直在用vue写管理后台目前后台已经有百来个页面十几种权限但维护成本依然很低所以准备开源分享一下后台开发的经验和成果。目前的技术栈主要的采用vue+element+axios由webpack2打包。由于是个人项目所以数据请求都是用了mockjs模拟。注意在此项目基础上改造开发时请移除mock文件。
你的本地环境需要安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。我们的技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 和 [element-ui](https://github.com/ElemeFE/element),提前了解和学习这些知识会对使用本项目有很大的帮助。
写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目: 同时配套一个系列的教程文章,如何从零构建后一个完整的后台项目,建议大家先看完这些文章再来实践本项目
- [wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)
- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2) - [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac) - [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35) - [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
@ -45,9 +45,9 @@
或者可以加入该 **[圈子](https://jianshiapp.com/circles/1209)** 讨论问题 或者可以加入该 **[圈子](https://jianshiapp.com/circles/1209)** 讨论问题
**如有问题请先看上述文章和Wiki,若不能满足,欢迎 issue 和 pr** **如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr**
**项目并不是一个脚手架,更倾向于是一个集成解决方案** **项目并不是一个脚手架,更倾向于是一个集成解决方案**
**该项目不支持低版本游览器(如ie)有需求请自行添加polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)** **该项目不支持低版本游览器(如ie)有需求请自行添加polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)**
@ -55,37 +55,38 @@
## 功能 ## 功能
- 登录/注销 - 登录/注销
- 权限验证 - 权限验证
- 侧边栏 - 多环境发布
- 面包屑 - 动态侧边栏(支持多级路由)
- 动态面包屑
- 国际化多语言
- 多种动态换肤
- 快捷导航(标签页)
- 富文本编辑器 - 富文本编辑器
- Markdown编辑器 - Markdown编辑器
- JSON编辑器 - JSON编辑器
- Screenfull全屏
- 列表拖拽 - 列表拖拽
- plitPane - Svg Sprite 图标
- Dropzone - Dashboard
- Sticky - 本地mock数据
- CountTo - Echarts 图表
- echarts图表 - Clipboard(剪贴复制)
- 401404错误页面 - 401/404错误页面
- 错误日志 - 错误日志
- 导出excel - 导出excel
- zip - 导出zip
- 前端可视化excel - 前端可视化excel
- table example - Table example
- 动态table example - 动态table example
- 拖拽table example - 拖拽table example
- 内联编辑table example - 内联编辑table example
- form example - Form example
- 多环境发布 - 二步登录
- dashboard - SplitPane
- 二次登录 - Dropzone
- 动态侧边栏(支持多级路由) - Sticky
- mock数据 - CountTo
- cache tabs example - Markdown2html
- screenfull
- markdown2html
- views-tab
- clipboard
## 开发 ## 开发
@ -95,7 +96,8 @@
# 安装依赖 # 安装依赖
npm install npm install
   //or # 建议不要用cnpm  安装有各种诡异的bug 可以通过如下操作解决npm速度慢的问题    
//or # 建议不要用cnpm  安装有各种诡异的bug 可以通过如下操作解决npm速度慢的问题
npm install --registry=https://registry.npm.taobao.org npm install --registry=https://registry.npm.taobao.org
# 本地开发 开启服务 # 本地开发 开启服务
@ -112,6 +114,8 @@
npm run build:prod npm run build:prod
``` ```
更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/#/)
## 目录结构 ## 目录结构
```shell ```shell
├── build // 构建相关   ├── build // 构建相关  
@ -122,14 +126,18 @@
│   ├── components // 全局公用组件 │   ├── components // 全局公用组件
│   ├── directive // 全局指令 │   ├── directive // 全局指令
│   ├── filtres // 全局 filter │   ├── filtres // 全局 filter
│   ├── mock // mock数据 │   ├── icons // 项目所有 svg icons
│   ├── lang // 国际化 language
│   ├── mock // 项目mock 模拟数据
│   ├── router // 路由 │   ├── router // 路由
│   ├── store // 全局 store管理 │   ├── store // 全局 store管理
│   ├── styles // 全局样式 │   ├── styles // 全局样式
│   ├── utils // 全局公用方法 │   ├── utils // 全局公用方法
│   ├── view // view │   ├── vendor // 公用vendor
│   ├── views // view
│   ├── App.vue // 入口页面 │   ├── App.vue // 入口页面
│   └── main.js // 入口 加载组件 初始化等 │   ├── main.js // 入口 加载组件 初始化等
│ └── permission.js // 权限管理
├── static // 第三方不打包资源 ├── static // 第三方不打包资源
│   └── Tinymce // 富文本 │   └── Tinymce // 富文本
├── .babelrc // babel-loader 配置 ├── .babelrc // babel-loader 配置
@ -144,74 +152,13 @@
## Changelog ## Changelog
Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases). Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases).
## [查看更多demo](http://panjiachen.github.io/vue-element-admin)
![](https://wpimg.wallstcn.com/1bc334a6-32a8-4f29-a037-ac3f5ce32588.png)
## Donate ## Donate
If you find this project useful, you can buy me a cup of coffee If you find this project useful, you can buy me a cup of coffee
![donate](https://panjiachen.github.io/donate/donation.png) ![donate](https://panjiachen.github.io/donate/donation.png)
## 状态管理
后台只有user和app配置相关状态使用vuex存在全局其它数据都由每个业务页面自己管理。
## 效果图
#### 两步验证登录 支持微信和qq
![两步验证 here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/2login.gif)
#### 真正的动态换肤
![真正的动态换肤](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/theme.gif)<br />
#### tabs
![tabs](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/tabs.gif)<br />
#### 可收起侧边栏
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/leftmenu.gif)
#### table拖拽排序
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/order.gif)
#### 动态table
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/dynamictable.gif)
#### 上传裁剪头像
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/uploadAvatar.gif)
#### 错误统计
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/errorlog.gif)
#### 富文本(整合七牛 打水印等个性化功能)
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/editor.gif)
#### 封装table组件
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/table.gif)
#### 图表
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/echarts.gif)
#### 导出excel
![enter image description here](https://github.com/PanJiaChen/vue-element-admin/blob/master/gifs/excel.png)
## [查看更多demo](http://panjiachen.github.io/vue-element-admin)
## License ## License
MIT MIT

View File

@ -23,7 +23,7 @@ exports.cssLoaders = function (options) {
var postcssLoader = { var postcssLoader = {
loader: 'postcss-loader', loader: 'postcss-loader',
options: { options: {
sourceMap: options.sourceMap sourceMap: true
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "juicy", "name": "vue-element-admin",
"version": "2.2.1", "version": "3.0.0",
"description": "A Vue.js admin", "description": "A Vue.js admin",
"author": "Pan <panfree23@gmail.com>", "author": "Pan <panfree23@gmail.com>",
"license": "MIT", "license": "MIT",

View File

@ -43,6 +43,7 @@ export default {
.scroll-container { .scroll-container {
white-space: nowrap; white-space: nowrap;
position: relative; position: relative;
overflow: hidden;
.scroll-wrapper { .scroll-wrapper {
position: absolute; position: absolute;
} }

View File

@ -33,9 +33,18 @@ export default {
height: undefined, height: undefined,
child: null, child: null,
stickyHeight: 0 stickyHeight: 0
} }
}, },
mounted() {
this.height = this.$el.getBoundingClientRect().height
window.addEventListener('scroll', this.handleScroll)
},
activated() {
this.handleScroll()
},
destroyed() {
window.removeEventListener('scroll', this.handleScroll)
},
methods: { methods: {
sticky() { sticky() {
if (this.active) { if (this.active) {
@ -62,13 +71,6 @@ export default {
} }
this.reset() this.reset()
} }
},
mounted() {
this.height = this.$el.getBoundingClientRect().height
window.addEventListener('scroll', this.handleScroll)
},
destroyed() {
window.removeEventListener('scroll', this.handleScroll)
} }
} }
</script> </script>

View File

@ -7,6 +7,7 @@
<script> <script>
import { getVersion } from '@/utils/index.js' import { getVersion } from '@/utils/index.js'
const version = getVersion('element-ui') // element-ui version from package.json const version = getVersion('element-ui') // element-ui version from package.json
const ORIGINAL_THEME = '#409EFF' // default color const ORIGINAL_THEME = '#409EFF' // default color

View File

@ -266,9 +266,8 @@ export function deepClone(source) {
return targetObj return targetObj
} }
// get dependencies verison from package.json by webpack.DefinePlugin // get dependencies verison from package.json
export function getVersion(name) { export function getVersion(name) {
import('../../package').then(p => { const p = require('../../package')
return p.dependencies[name] return p.dependencies[name]
})
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<el-card class="box-card" style="margin-left:8px;"> <el-card class="box-card-component" style="margin-left:8px;">
<div slot="header" class="box-card-header"> <div slot="header" class="box-card-header">
<img src='https://wpimg.wallstcn.com/e7d23d71-cf19-4b90-a1cc-f56af8c0903d.png'> <img src='https://wpimg.wallstcn.com/e7d23d71-cf19-4b90-a1cc-f56af8c0903d.png'>
</div> </div>
@ -62,7 +62,7 @@ export default {
</script> </script>
<style rel="stylesheet/scss" lang="scss" > <style rel="stylesheet/scss" lang="scss" >
.box-card { .box-card-component{
.el-card__header { .el-card__header {
padding: 0px!important; padding: 0px!important;
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="app-container"> <div>
<el-card class="box-card"> <el-card class="box-card" style="margin-top:40px;">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<svg-icon icon-class="international" /> <svg-icon icon-class="international" />
<span style='margin-left:10px;'>{{$t('i18nView.title')}}</span> <span style='margin-left:10px;'>{{$t('i18nView.title')}}</span>
@ -13,29 +13,30 @@
<el-tag style='margin-top:15px;display:block;' type="info">{{$t('i18nView.note')}}</el-tag> <el-tag style='margin-top:15px;display:block;' type="info">{{$t('i18nView.note')}}</el-tag>
</div> </div>
</el-card> </el-card>
<el-row :gutter="20" style="margin:100px 50px 50px;">
<el-row :gutter="20" style="margin:100px 15px 50px;">
<el-col :span="12"> <el-col :span="12">
<div class="block"> <div class="block">
<el-date-picker v-model="date" type="date" :placeholder="$t('i18nView.datePlaceholder')"></el-date-picker> <el-date-picker v-model="date" type="date" :placeholder="$t('i18nView.datePlaceholder')"></el-date-picker>
</div> </div>
<div class="block"> <div class="block">
<el-pagination :current-page="currentPage" :page-sizes="[100, 200, 300, 400]" :page-size="100" layout="total, sizes, prev, pager, next, jumper" <el-pagination :current-page="currentPage" :page-sizes="[100, 200, 300, 400]" :page-size="100" layout="total, sizes, prev, pager, next"
:total="400"> :total="400">
</el-pagination> </el-pagination>
</div> </div>
<div class="block"> <div class="block">
<el-button size="small">{{$t('i18nView.default')}}</el-button> <el-button class="item-btn" size="small">{{$t('i18nView.default')}}</el-button>
<el-button size="small" type="primary">{{$t('i18nView.primary')}}</el-button> <el-button class="item-btn" size="small" type="primary">{{$t('i18nView.primary')}}</el-button>
<el-button size="small" type="success">{{$t('i18nView.success')}}</el-button> <el-button class="item-btn" size="small" type="success">{{$t('i18nView.success')}}</el-button>
<el-button size="small" type="info">{{$t('i18nView.info')}}</el-button> <el-button class="item-btn" size="small" type="info">{{$t('i18nView.info')}}</el-button>
<el-button size="small" type="warning">{{$t('i18nView.warning')}}</el-button> <el-button class="item-btn" size="small" type="warning">{{$t('i18nView.warning')}}</el-button>
<el-button size="small" type="danger">{{$t('i18nView.danger')}}</el-button> <el-button class="item-btn" size="small" type="danger">{{$t('i18nView.danger')}}</el-button>
</div> </div>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-table :data="tableData" fit highlight-current-row border style="width: 100%"> <el-table :data="tableData" fit highlight-current-row border style="width: 100%">
<el-table-column prop="date" :label="$t('i18nView.tableDate')" width="180"></el-table-column> <el-table-column prop="name" :label="$t('i18nView.tableName')" width="100" align="center"></el-table-column>
<el-table-column prop="name" :label="$t('i18nView.tableName')" width="180"></el-table-column> <el-table-column prop="date" :label="$t('i18nView.tableDate')" width="120" align="center"></el-table-column>
<el-table-column prop="address" :label="$t('i18nView.tableAddress')"></el-table-column> <el-table-column prop="address" :label="$t('i18nView.tableAddress')"></el-table-column>
</el-table> </el-table>
</el-col> </el-col>
@ -100,7 +101,10 @@ export default {
width: 600px; width: 600px;
margin: 20px auto; margin: 20px auto;
} }
.item-btn{
margin-bottom: 15px;
margin-left: 0px;
}
.block { .block {
padding: 25px; padding: 25px;
} }