Merge cef1f11931
into d476e32032
This commit is contained in:
commit
ffba1ce657
159
README.md
159
README.md
|
@ -4,37 +4,37 @@
|
||||||
|
|
||||||
# vue-element-admin
|
# vue-element-admin
|
||||||
|
|
||||||
[](https://github.com/vuejs/vue)
|
[](https://github.com/vuejs/vue)
|
||||||
[](https://github.com/ElemeFE/element)
|
[](https://github.com/ElemeFE/element)
|
||||||
[](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)
|
[](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)
|
||||||
[]()
|
[]()
|
||||||
|
|
||||||
|
**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(剪贴复制)
|
||||||
- 401,404错误页面
|
- 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 // 构建相关
|
||||||
|
@ -121,15 +125,19 @@
|
||||||
│ ├── assets // 主题 字体等静态资源
|
│ ├── assets // 主题 字体等静态资源
|
||||||
│ ├── 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)
|
||||||
|

|
||||||
|
|
||||||
## 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
|
||||||

|

|
||||||
|
|
||||||
## 状态管理
|
|
||||||
后台只有user和app配置相关状态使用vuex存在全局,其它数据都由每个业务页面自己管理。
|
|
||||||
|
|
||||||
|
|
||||||
## 效果图
|
|
||||||
|
|
||||||
#### 两步验证登录 支持微信和qq
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
#### 真正的动态换肤
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
#### tabs
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 可收起侧边栏
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
#### table拖拽排序
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
#### 动态table
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
#### 上传裁剪头像
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
#### 错误统计
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
#### 富文本(整合七牛 打水印等个性化功能)
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
#### 封装table组件
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
#### 图表
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
#### 导出excel
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
## [查看更多demo](http://panjiachen.github.io/vue-element-admin)
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT
|
MIT
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue