merge
This commit is contained in:
commit
5b70eba9a0
|
@ -1,8 +0,0 @@
|
||||||
// https://github.com/michael-ciniawsky/postcss-load-config
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
"plugins": {
|
|
||||||
// to edit target browsers: use "browserslist" field in package.json
|
|
||||||
"autoprefixer": {}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
<p align="center">
|
||||||
|
<img width="320" src="https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/vuejs/vue">
|
||||||
|
<img src="https://img.shields.io/badge/vue-2.6.10-brightgreen.svg" alt="vue">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ElemeFE/element">
|
||||||
|
<img src="https://img.shields.io/badge/element--ui-2.7.0-brightgreen.svg" alt="element-ui">
|
||||||
|
</a>
|
||||||
|
<a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow">
|
||||||
|
<img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Estado de Construcción">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE">
|
||||||
|
<img src="https://img.shields.io/github/license/mashape/apistatus.svg" alt="Licencia">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/PanJiaChen/vue-element-admin/releases">
|
||||||
|
<img src="https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg" alt="Liberación Github">
|
||||||
|
</a>
|
||||||
|
<a href="https://gitter.im/vue-element-admin/discuss">
|
||||||
|
<img src="https://badges.gitter.im/Join%20Chat.svg" alt="Gitter">
|
||||||
|
</a>
|
||||||
|
<a href="https://panjiachen.github.io/vue-element-admin-site/donate">
|
||||||
|
<img src="https://img.shields.io/badge/%24-donate-ff69b4.svg" alt="Donación">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
Español | [English](./README.md) | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md)
|
||||||
|
|
||||||
|
## Introducción
|
||||||
|
|
||||||
|
[vue-element-admin](https://panjiachen.github.io/vue-element-admin) es una interfáz de administración preparada para producción. Está basada en [vue](https://github.com/vuejs/vue) y usa [element-ui](https://github.com/ElemeFE/element) como conjunto de herramientas de interfáz de usuario.
|
||||||
|
|
||||||
|
Vue Element Admin es una solución práctica basada en la nueva plataforma de desarrollo de vue, construida con soporte a i18 para el manejo de múltiples lenguajes, plantillas estándares para aplicaciones de negocio y un conjunto de asombrosas características. Esta herramienta ayuda a construir largas y complejas Aplicacones de una sola página (SPA). Creo que lo que necesites hacer, este proyecto te ayudará.
|
||||||
|
|
||||||
|
- [Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin)
|
||||||
|
|
||||||
|
- [Documentación](https://panjiachen.github.io/vue-element-admin-site/)
|
||||||
|
|
||||||
|
- [Canal de Gitter](https://gitter.im/vue-element-admin/discuss)
|
||||||
|
|
||||||
|
- [Para Donaciones](https://panjiachen.github.io/vue-element-admin-site/donate/)
|
||||||
|
|
||||||
|
- [Enlace de Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)
|
||||||
|
|
||||||
|
- [Canal de Gitee](https://panjiachen.gitee.io/vue-element-admin/)
|
||||||
|
|
||||||
|
- Plantilla base recomendada para usar: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)
|
||||||
|
- Aplicación de Escritorio: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
|
||||||
|
- Plantilla de Typescript: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Créditos: [@Armour](https://github.com/Armour))
|
||||||
|
|
||||||
|
**Después de la versión `v4.1.0+`, la rama por defecto master no tendrá soporte para i18n. Por favor use [i18n](https://github.com/PanJiaChen/vue-element-admin/tree/i18n), los cambios serán incluidos en la rama master**
|
||||||
|
|
||||||
|
**la versión actual es `v4.0+` construida con `vue-cli`. Si encuentra algún problema, por favor coloque un [issue](https://github.com/PanJiaChen/vue-element-admin/issues/new). Si desea usar la versión anterior, puede cambiar de rama a [tag/3.11.0](https://github.com/PanJiaChen/vue-element-admin/tree/tag/3.11.0), no relacionado con `vue-cli`**
|
||||||
|
|
||||||
|
**Este proyecto no está soportado para versiones muy viejas de navegadores (e.g. IE).**
|
||||||
|
|
||||||
|
## Preparación
|
||||||
|
|
||||||
|
Necesita instalar [node](https://nodejs.org/) y [git](https://git-scm.com/) localmente. El proyecto es basado en [ES2015+](https://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/), [vue-cli](https://github.com/vuejs/vue-cli) , [axios](https://github.com/axios/axios) and [element-ui](https://github.com/ElemeFE/element), toda la solicitud de datos simulada se realiza a través de [Mock.js](https://github.com/nuysoft/Mock).
|
||||||
|
Entendiendo y aprendiendo esto pudiera ayudarle con su proyecto.
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img width="900" src="https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## Patrocinantes
|
||||||
|
|
||||||
|
Se un patrocinante y pon tu logo en nuestro README on GitHub con un enlace directo a tu sitio web. [[Se un Patrocinante]](https://www.patreon.com/panjiachen)
|
||||||
|
|
||||||
|
<a href="https://flatlogic.com/admin-dashboards?from=vue-element-admin"><img width="150px" src="https://wpimg.wallstcn.com/9c0b719b-5551-4c1e-b776-63994632d94a.png" /></a><p>Plantilla de Dashboard de administración hecha con Vue, React y Angular.</p>
|
||||||
|
|
||||||
|
## Características
|
||||||
|
|
||||||
|
```
|
||||||
|
- Iniciar / Cerrar Sesión
|
||||||
|
|
||||||
|
- Permisos de Authentication
|
||||||
|
- Página de Permisos
|
||||||
|
- Directivas de permisos
|
||||||
|
- Página de configuración de permisos
|
||||||
|
- Autenticación por dos pasos
|
||||||
|
|
||||||
|
- Construcción Multi-entorno
|
||||||
|
- dev sit stage producción
|
||||||
|
|
||||||
|
- Características Globales
|
||||||
|
- I18n
|
||||||
|
- Temas dinámicos
|
||||||
|
- Dynamic sidebar (soporte a rutas multi-nivel)
|
||||||
|
- Barra de rutas dinámica
|
||||||
|
- Tags-view (Tab page Support right-click operation)
|
||||||
|
- Svg Sprite
|
||||||
|
- Datos de simulación con Mock
|
||||||
|
- Pantalla completa
|
||||||
|
- Responsive Sidebar
|
||||||
|
|
||||||
|
- Editor
|
||||||
|
- Editor de Texto Enriquecido
|
||||||
|
- Editor Markdown
|
||||||
|
- Editor JSON
|
||||||
|
|
||||||
|
- Excel
|
||||||
|
- Exportación a Excel
|
||||||
|
- Carga de Excel
|
||||||
|
- Visualización de Excel
|
||||||
|
- Exportación como zip
|
||||||
|
|
||||||
|
- Tabla
|
||||||
|
- Tabla Dinámica
|
||||||
|
- Tabla con Arrastrar y Soltar
|
||||||
|
- Tabla de edición en línea
|
||||||
|
|
||||||
|
- Páginas de Error
|
||||||
|
- 401
|
||||||
|
- 404
|
||||||
|
|
||||||
|
- Componentes
|
||||||
|
- Carga de Avatar
|
||||||
|
- Botón para subir al inicio
|
||||||
|
- Arrastrar y Soltar (Diaglogo)
|
||||||
|
- Arrastrar y Soltar (Seleccionar)
|
||||||
|
- Arrastrar y Soltar (Kanban)
|
||||||
|
- Arrastrar y Soltar (Lista)
|
||||||
|
- Panel de división
|
||||||
|
- Componente para soltar archivos
|
||||||
|
- Adhesión de objetos
|
||||||
|
- Contador hasta
|
||||||
|
|
||||||
|
- Ejemplo Avanzado
|
||||||
|
- Registro de Errores
|
||||||
|
- Tablero de indicadores
|
||||||
|
- Página de Guías
|
||||||
|
- ECharts (Gráficos)
|
||||||
|
- Portapapeles
|
||||||
|
- Convertidor de Markdown a html
|
||||||
|
```
|
||||||
|
|
||||||
|
## Iniciando
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# clone el proyecto
|
||||||
|
git clone https://github.com/PanJiaChen/vue-element-admin.git
|
||||||
|
|
||||||
|
# vaya al directorio clonado
|
||||||
|
cd vue-element-admin
|
||||||
|
|
||||||
|
# instale las dependencias
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# corra el proyecto como desarrollador
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Automáticamente se abrirá el siguiente enlace en su navegador http://localhost:9527
|
||||||
|
|
||||||
|
## Construcción
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Construcción para entornos de prueba
|
||||||
|
npm run build:stage
|
||||||
|
|
||||||
|
# Construcción para entornos de producción
|
||||||
|
npm run build:prod
|
||||||
|
```
|
||||||
|
|
||||||
|
## Avanzado
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Vista previa con efectos de entorno
|
||||||
|
npm run preview
|
||||||
|
|
||||||
|
# Vista previa con efectos + análisis de recursos estáticos
|
||||||
|
npm run preview -- --report
|
||||||
|
|
||||||
|
# Chequeo de formato de código
|
||||||
|
npm run lint
|
||||||
|
|
||||||
|
# Chequeo de formato de código y auto-corrección
|
||||||
|
npm run lint -- --fix
|
||||||
|
```
|
||||||
|
|
||||||
|
Vaya a [Documentación](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) para mayor información
|
||||||
|
|
||||||
|
## Registro de Cambios
|
||||||
|
|
||||||
|
Los cambios detallados por cada liberación se encuentran en [notas de liberación](https://github.com/PanJiaChen/vue-element-admin/releases).
|
||||||
|
|
||||||
|
## Demostración en línea
|
||||||
|
|
||||||
|
[Vista Prévia de la Aplicación](https://panjiachen.github.io/vue-element-admin)
|
||||||
|
|
||||||
|
## Donación
|
||||||
|
|
||||||
|
Si este proyecto es de mucha ayuda para ti, puedes comprarle al autor un vaso de jugo :tropical_drink:
|
||||||
|
|
||||||
|
![Donar](https://wpimg.wallstcn.com/bd273f0d-83a0-4ef2-92e1-9ac8ed3746b9.png)
|
||||||
|
|
||||||
|
[dona por Paypal](https://www.paypal.me/panfree23)
|
||||||
|
|
||||||
|
[Comprame un Café](https://www.buymeacoffee.com/Pan)
|
||||||
|
|
||||||
|
## Navegadores Soportados
|
||||||
|
|
||||||
|
Navegadores modernos e Internet Explorer 10+.
|
||||||
|
|
||||||
|
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](https://godban.github.io/browsers-support-badges/)</br>Safari |
|
||||||
|
| --------- | --------- | --------- | --------- |
|
||||||
|
| IE10, IE11, Edge| últimas 2 versiones| últimas 2 versiones| últimas 2 versiones
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)
|
||||||
|
|
||||||
|
Copyright (c) 2017-presente PanJiaChen
|
|
@ -26,7 +26,7 @@
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md)
|
日本語 | [English](./README.md) | [简体中文](./README.zh-CN.md) | [Spanish](./README.es.md)
|
||||||
|
|
||||||
## 概要
|
## 概要
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md)
|
English | [简体中文](./README.zh-CN.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md)
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
简体中文 | [English](./README.md)
|
简体中文 | [English](./README.md) | [日本語](./README.ja.md) | [Spanish](./README.es.md)
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "vue-element-admin",
|
"name": "vue-element-admin",
|
||||||
"version": "4.0.1",
|
"version": "4.2.0",
|
||||||
"description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
|
"description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
|
||||||
"author": "Pan <panfree23@gmail.com>",
|
"author": "Pan <panfree23@gmail.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
@ -110,7 +110,6 @@
|
||||||
},
|
},
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
"> 1%",
|
"> 1%",
|
||||||
"last 2 versions",
|
"last 2 versions"
|
||||||
"not ie <= 8"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
autoprefixer: {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,10 +9,6 @@
|
||||||
<title><%= webpackConfig.name %></title>
|
<title><%= webpackConfig.name %></title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- import cdn js -->
|
|
||||||
<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
|
|
||||||
<script src="<%=js%>"></script>
|
|
||||||
<% } %>
|
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<!-- built files will be auto injected -->
|
<!-- built files will be auto injected -->
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -21,7 +21,11 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
$route() {
|
$route(route) {
|
||||||
|
// if you go to the redirect page, do not update the breadcrumbs
|
||||||
|
if (route.path.startsWith('/redirect/')) {
|
||||||
|
return
|
||||||
|
}
|
||||||
this.getBreadcrumb()
|
this.getBreadcrumb()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -86,32 +86,27 @@ export default {
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.rightPanel-background {
|
.rightPanel-background {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity .3s cubic-bezier(.7, .3, .1, 1);
|
transition: opacity .3s cubic-bezier(.7, .3, .1, 1);
|
||||||
background: rgba(0, 0, 0, .2);
|
background: rgba(0, 0, 0, .2);
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
position: fixed;
|
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rightPanel {
|
.rightPanel {
|
||||||
background: #fff;
|
|
||||||
z-index: 3000;
|
|
||||||
position: fixed;
|
|
||||||
height: 100vh;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 260px;
|
max-width: 260px;
|
||||||
top: 0px;
|
height: 100vh;
|
||||||
left: 0px;
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05);
|
box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05);
|
||||||
transition: all .25s cubic-bezier(.7, .3, .1, 1);
|
transition: all .25s cubic-bezier(.7, .3, .1, 1);
|
||||||
transform: translate(100%);
|
transform: translate(100%);
|
||||||
|
background: #fff;
|
||||||
z-index: 40000;
|
z-index: 40000;
|
||||||
left: auto;
|
|
||||||
right: 0px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.show {
|
.show {
|
||||||
|
@ -130,20 +125,18 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
.handle-button {
|
.handle-button {
|
||||||
position: absolute;
|
|
||||||
left: -48px;
|
|
||||||
border-radius: 6px 0 0 6px !important;
|
|
||||||
width: 48px;
|
width: 48px;
|
||||||
height: 48px;
|
height: 48px;
|
||||||
pointer-events: auto;
|
position: absolute;
|
||||||
z-index: 0;
|
left: -48px;
|
||||||
cursor: pointer;
|
|
||||||
pointer-events: auto;
|
|
||||||
font-size: 24px;
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
font-size: 24px;
|
||||||
|
border-radius: 6px 0 0 6px !important;
|
||||||
|
z-index: 0;
|
||||||
|
pointer-events: auto;
|
||||||
|
cursor: pointer;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
line-height: 48px;
|
line-height: 48px;
|
||||||
|
|
||||||
i {
|
i {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
line-height: 48px;
|
line-height: 48px;
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
<template>
|
<template>
|
||||||
<svg :class="svgClass" aria-hidden="true" v-on="$listeners">
|
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
|
||||||
|
<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
|
||||||
<use :xlink:href="iconName" />
|
<use :xlink:href="iconName" />
|
||||||
</svg>
|
</svg>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
|
||||||
|
import { isExternal } from '@/utils/validate'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'SvgIcon',
|
name: 'SvgIcon',
|
||||||
props: {
|
props: {
|
||||||
|
@ -18,6 +22,9 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
isExternal() {
|
||||||
|
return isExternal(this.iconClass)
|
||||||
|
},
|
||||||
iconName() {
|
iconName() {
|
||||||
return `#icon-${this.iconClass}`
|
return `#icon-${this.iconClass}`
|
||||||
},
|
},
|
||||||
|
@ -27,6 +34,12 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
return 'svg-icon'
|
return 'svg-icon'
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
styleExternalIcon() {
|
||||||
|
return {
|
||||||
|
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
|
||||||
|
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,4 +53,10 @@ export default {
|
||||||
fill: currentColor;
|
fill: currentColor;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.svg-external-icon {
|
||||||
|
background-color: currentColor;
|
||||||
|
mask-size: cover!important;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
const dynamicLoadScript = (src, callback) => {
|
||||||
|
const existingScript = document.getElementById(src)
|
||||||
|
const cb = callback || function() {}
|
||||||
|
|
||||||
|
if (!existingScript) {
|
||||||
|
const script = document.createElement('script')
|
||||||
|
script.src = src // src url for the third-party library being loaded.
|
||||||
|
script.id = src
|
||||||
|
document.body.appendChild(script)
|
||||||
|
|
||||||
|
const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd
|
||||||
|
onEnd(script, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existingScript && cb) cb(null, existingScript)
|
||||||
|
|
||||||
|
function stdOnEnd(script, cb) {
|
||||||
|
script.onload = function() {
|
||||||
|
// this.onload = null here is necessary
|
||||||
|
// because even IE9 works not like others
|
||||||
|
this.onerror = this.onload = null
|
||||||
|
cb(null, script)
|
||||||
|
}
|
||||||
|
script.onerror = function() {
|
||||||
|
this.onerror = this.onload = null
|
||||||
|
cb(new Error('Failed to load ' + src), script)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ieOnEnd(script, cb) {
|
||||||
|
script.onreadystatechange = function() {
|
||||||
|
if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
|
||||||
|
this.onreadystatechange = null
|
||||||
|
cb(null, script) // there is no way to catch loading errors in IE8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default dynamicLoadScript
|
|
@ -15,6 +15,10 @@
|
||||||
import editorImage from './components/EditorImage'
|
import editorImage from './components/EditorImage'
|
||||||
import plugins from './plugins'
|
import plugins from './plugins'
|
||||||
import toolbar from './toolbar'
|
import toolbar from './toolbar'
|
||||||
|
import load from './dynamicLoadScript'
|
||||||
|
|
||||||
|
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
|
||||||
|
const tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymce.min.js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Tinymce',
|
name: 'Tinymce',
|
||||||
|
@ -91,10 +95,12 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.initTinymce()
|
this.init()
|
||||||
},
|
},
|
||||||
activated() {
|
activated() {
|
||||||
|
if (window.tinymce) {
|
||||||
this.initTinymce()
|
this.initTinymce()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
deactivated() {
|
deactivated() {
|
||||||
this.destroyTinymce()
|
this.destroyTinymce()
|
||||||
|
@ -103,12 +109,20 @@ export default {
|
||||||
this.destroyTinymce()
|
this.destroyTinymce()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
init() {
|
||||||
|
// dynamic load tinymce from cdn
|
||||||
|
load(tinymceCDN, (err) => {
|
||||||
|
if (err) {
|
||||||
|
this.$message.error(err.message)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.initTinymce()
|
||||||
|
})
|
||||||
|
},
|
||||||
initTinymce() {
|
initTinymce() {
|
||||||
const _this = this
|
const _this = this
|
||||||
window.tinymce.init({
|
window.tinymce.init({
|
||||||
language: this.language,
|
language: this.language,
|
||||||
// language cnd URL, detail see https://github.com/PanJiaChen/tinymce-lang
|
|
||||||
language_url: this.language === 'en' ? '' : `https://cdn.jsdelivr.net/npm/tinymce-lang/langs/${this.language}.js`,
|
|
||||||
selector: `#${this.tinymceId}`,
|
selector: `#${this.tinymceId}`,
|
||||||
height: this.height,
|
height: this.height,
|
||||||
body_class: 'panel-body ',
|
body_class: 'panel-body ',
|
||||||
|
|
15
src/main.js
15
src/main.js
|
@ -21,15 +21,24 @@ import './utils/error-log' // error log
|
||||||
import * as filters from './filters' // global filters
|
import * as filters from './filters' // global filters
|
||||||
|
|
||||||
import VueAnalytics from 'vue-analytics'
|
import VueAnalytics from 'vue-analytics'
|
||||||
import { mockXHR } from '../mock' // simulation data
|
|
||||||
|
|
||||||
Vue.use(VueAnalytics, {
|
Vue.use(VueAnalytics, {
|
||||||
id: 'UA-109340118-1',
|
id: 'UA-109340118-1',
|
||||||
router
|
router
|
||||||
})
|
})
|
||||||
|
|
||||||
// mock api in github pages site build
|
/**
|
||||||
if (process.env.NODE_ENV === 'production') { mockXHR() }
|
* If you don't want to use mock-server
|
||||||
|
* you want to use MockJs for mock api
|
||||||
|
* you can execute: mockXHR()
|
||||||
|
*
|
||||||
|
* Currently MockJs will be used in the production environment,
|
||||||
|
* please remove it before going online! ! !
|
||||||
|
*/
|
||||||
|
import { mockXHR } from '../mock'
|
||||||
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
mockXHR()
|
||||||
|
}
|
||||||
|
|
||||||
Vue.use(Element, {
|
Vue.use(Element, {
|
||||||
size: Cookies.get('size') || 'medium', // set element-ui default size
|
size: Cookies.get('size') || 'medium', // set element-ui default size
|
||||||
|
|
|
@ -5,7 +5,7 @@ import getters from './getters'
|
||||||
Vue.use(Vuex)
|
Vue.use(Vuex)
|
||||||
|
|
||||||
// https://webpack.js.org/guides/dependency-management/#requirecontext
|
// https://webpack.js.org/guides/dependency-management/#requirecontext
|
||||||
const modulesFiles = require.context('./modules', false, /\.js$/)
|
const modulesFiles = require.context('./modules', true, /\.js$/)
|
||||||
|
|
||||||
// you do not need `import app from './modules/app'`
|
// you do not need `import app from './modules/app'`
|
||||||
// it will auto require all vuex module from modules file
|
// it will auto require all vuex module from modules file
|
||||||
|
|
|
@ -115,6 +115,9 @@ const actions = {
|
||||||
// dynamically add accessible routes
|
// dynamically add accessible routes
|
||||||
router.addRoutes(accessRoutes)
|
router.addRoutes(accessRoutes)
|
||||||
|
|
||||||
|
// reset visited views and cached views
|
||||||
|
dispatch('tagsView/delAllViews', null, { root: true })
|
||||||
|
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,10 +95,6 @@
|
||||||
margin-left: 54px;
|
margin-left: 54px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.svg-icon {
|
|
||||||
margin-right: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.submenu-title-noDropdown {
|
.submenu-title-noDropdown {
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
|
@ -185,12 +185,16 @@ export default {
|
||||||
fetchData(id) {
|
fetchData(id) {
|
||||||
fetchArticle(id).then(response => {
|
fetchArticle(id).then(response => {
|
||||||
this.postForm = response.data
|
this.postForm = response.data
|
||||||
// Just for test
|
|
||||||
|
// just for test
|
||||||
this.postForm.title += ` Article Id:${this.postForm.id}`
|
this.postForm.title += ` Article Id:${this.postForm.id}`
|
||||||
this.postForm.content_short += ` Article Id:${this.postForm.id}`
|
this.postForm.content_short += ` Article Id:${this.postForm.id}`
|
||||||
|
|
||||||
// Set tagsview title
|
// set tagsview title
|
||||||
this.setTagsViewTitle()
|
this.setTagsViewTitle()
|
||||||
|
|
||||||
|
// set page title
|
||||||
|
this.setPageTitle()
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
})
|
})
|
||||||
|
@ -200,6 +204,10 @@ export default {
|
||||||
const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` })
|
const route = Object.assign({}, this.tempRoute, { title: `${title}-${this.postForm.id}` })
|
||||||
this.$store.dispatch('tagsView/updateVisitedView', route)
|
this.$store.dispatch('tagsView/updateVisitedView', route)
|
||||||
},
|
},
|
||||||
|
setPageTitle() {
|
||||||
|
const title = 'Edit Article'
|
||||||
|
document.title = `${title} - ${this.postForm.id}`
|
||||||
|
},
|
||||||
submitForm() {
|
submitForm() {
|
||||||
console.log(this.postForm)
|
console.log(this.postForm)
|
||||||
this.$refs.postForm.validate(valid => {
|
this.$refs.postForm.validate(valid => {
|
||||||
|
|
|
@ -116,13 +116,18 @@ export default {
|
||||||
capsTooltip: false,
|
capsTooltip: false,
|
||||||
loading: false,
|
loading: false,
|
||||||
showDialog: false,
|
showDialog: false,
|
||||||
redirect: undefined
|
redirect: undefined,
|
||||||
|
otherQuery: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
$route: {
|
$route: {
|
||||||
handler: function(route) {
|
handler: function(route) {
|
||||||
this.redirect = route.query && route.query.redirect
|
const query = route.query
|
||||||
|
if (query) {
|
||||||
|
this.redirect = query.redirect
|
||||||
|
this.otherQuery = this.getOtherQuery(query)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
immediate: true
|
immediate: true
|
||||||
}
|
}
|
||||||
|
@ -169,7 +174,7 @@ export default {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
this.$store.dispatch('user/login', this.loginForm)
|
this.$store.dispatch('user/login', this.loginForm)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.$router.push({ path: this.redirect || '/' })
|
this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
|
@ -180,6 +185,14 @@ export default {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
getOtherQuery(query) {
|
||||||
|
return Object.keys(query).reduce((acc, cur) => {
|
||||||
|
if (cur !== 'redirect') {
|
||||||
|
acc[cur] = query[cur]
|
||||||
|
}
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
}
|
}
|
||||||
// afterQRScan() {
|
// afterQRScan() {
|
||||||
// if (e.key === 'x-admin-oauth-code') {
|
// if (e.key === 'x-admin-oauth-code') {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
beforeCreate() {
|
created() {
|
||||||
const { params, query } = this.$route
|
const { params, query } = this.$route
|
||||||
const { path } = params
|
const { path } = params
|
||||||
this.$router.replace({ path: '/' + path, query })
|
this.$router.replace({ path: '/' + path, query })
|
||||||
|
|
|
@ -57,16 +57,6 @@ module.exports = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
chainWebpack(config) {
|
chainWebpack(config) {
|
||||||
const cdn = {
|
|
||||||
// inject tinymce into index.html
|
|
||||||
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
|
|
||||||
js: ['https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.2/tinymce.min.js']
|
|
||||||
}
|
|
||||||
config.plugin('html')
|
|
||||||
.tap(args => {
|
|
||||||
args[0].cdn = cdn
|
|
||||||
return args
|
|
||||||
})
|
|
||||||
config.plugins.delete('preload') // TODO: need test
|
config.plugins.delete('preload') // TODO: need test
|
||||||
config.plugins.delete('prefetch') // TODO: need test
|
config.plugins.delete('prefetch') // TODO: need test
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue