Commit b2c04af6 authored by Esteban Choque's avatar Esteban Choque
Browse files

Fechas del foro mejoradas

parents
Pipeline #1321 canceled with stages
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
_nuxt
\ No newline at end of file
module.exports = {
root: true,
env: {
browser: true,
node: true
},
parserOptions: {
parser: 'babel-eslint'
},
extends: [
'plugin:vue/recommended'
],
// required to lint *.vue files
plugins: [
'vue'
],
// add your custom rules here
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'vue/html-self-closing': 'off',
'vue/attributes-order': 'off',
'semi': [2, 'always']
}
};
# Created by .ignore support plugin (hsz.mobi)
### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
_nuxt
# Nuxt generate
dist
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
# IDE
.idea
# emacs
*~
\#*\#
.\#*
## Lista de colaboración
Omar Gutierrez <ogutierrez@agetic.gob.bo>
# Guía de instalación
## Requisitos
- NodeJs 10.x LTE
- Wordpress 5.x
- PHP 7.x
## Instalación para desarrollo
### Instalando PHP, Mysql y Apache/Nginx
Se puede instalar [XXAMP](https://www.apachefriends.org/es/index.html), [LAMP](https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mariadb-php-lamp-stack-debian9)*(Recomendado)*, [LEMP](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-debian-9) o instalar de acuerdo a su distribución.
### Instalando Wordpres
Ver la famosa instalación de Wordpress en 5 minutos [aquí](https://codex.wordpress.org/Installing_WordPress#Famous_5-Minute_Installation) realizar esta instalación en una carpeta llamada `wordpress` o `wp` o el nombre que quiera.
Una vez instalado debe ir al administrador de wordpres e **importar** el [Archivo de importación](portal-entidad.xml) en `Herramientas -> Importar` Instalar el plugin `WordPress` de la lista y continuar con la importación una vez instalado.
> **Nota.-** Es posible que no se importe correctamente los `Medios`(Archivos de imágenes) así que hay que ir al administrador de Wordpress ir a Páginas/Posts y eliminar los `Featured Image`(Imagen destacada) y agregar una nueva.
### Instalando el Proyecto
Una vez clonado el repositorio instalarlo con el comando:
```
npm install
```
> **Nota.-** Eliminar el archivo package-lock.json en caso de presentar fallas en la instalación.
### Configurando el proyecto
Toda la configuración del sistema lo encontramos en el archivo `nuxt.config.js` donde colocaremos en `env.wpApi` la ruta donde tengamos instalado nuestro Wordpress.
### Iniciando el proyecto
Iniciar el proyecto con el comando:
```
npm run dev
```
_____________
## Instalación en producción con Nginx (Debian 9)
### Instalando PHP, Mysql y Nginx
Instalar [LEMP](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-debian-9) o de acuerdo a su distribución.
### Configurando Nginx
Se debe configurar Nginx de acuerdo a la siguiente configuración en el archivo que haya creado en el paso anterior.
```
map $sent_http_content_type $expires {
"text/html" epoch;
"text/html; charset=utf-8" epoch;
default off;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _; # setup your domain here
gzip on;
gzip_types text/plain application/xml text/css application/javascript;
gzip_min_length 1000;
location / {
expires $expires;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1m;
proxy_connect_timeout 1m;
proxy_pass http://127.0.0.1:3000; # set the adress of the Node.js instance here
}
location /wp {
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
location = /wp/favicon.ico { log_not_found off; access_log off; }
location = /wp/robots.txt { log_not_found off; access_log off; allow all; }
}
```
Verificar la configuración con `nginx -t` y recargar la configuración con `systemctl reload nginx`.
> **Nota-** Es recomendable eliminar las configuraciones por defecto de nginx como `/etc/nginx/sites-enabled/default`
### Instalando Wordpress
Instalar de acuerdo a este [tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lemp-on-debian-9) **realizar esta instalación en la carpeta `/var/www/html/wp`** es importante que lo haga en este directorio.
Una vez instalado debe ir al administrador de wordpres e **importar** el [Archivo de importación](portal-entidad.xml) en `Herramientas -> Importar` Instalar el plugin `WordPress` de la lista y continuar con la importación una vez instalado.
> **Nota.-** Es posible que no se importe correctamente los `Medios`(Archivos de imágenes) así que hay que ir al administrador de Wordpress ir a Páginas/Posts y eliminar los `Featured Image`(Imagen destacada) y agregar una nueva.
### Instalando el Proyecto
Una vez clonado el repositorio instalarlo con el comando:
```
npm install
```
> **Nota.-** Eliminar el archivo `package-lock.json` en caso de presentar fallas en la instalación.
### Configurando el proyecto
Toda la configuración del sistema lo encontramos en el archivo `nuxt.config.js` donde colocaremos en `env.wpApi` la ruta donde tengamos instalado nuestro Wordpress.
### Compilando el proyecto
Usamos el siguiente comando para minificar los archivos para producción.
```
npm run build
```
### Iniciando el proyecto
Instalar PM2 para mantener la applicación persistente con el comando:
```
npm install -g pm2
```
Iniciar el proyecto con el comando:
```
pm2 start --name portal npm -- start
```
Guardar el inicio del proyecto para que siempre esté activo con el comando:
```
pm2 startup
pm2 save
```
This diff is collapsed.
# Sistema de diseño BASE-PORTAL
Sistema de diseño para los portales del estado con integración con Wordpress para el CMS de la entidad, también el sistema permite interactuar con otros sistemas backend que se requieran es totalmente personalizable.
## Tecnologías empleadas
- Vue.js como Framework principal. [Sitio oficial](https://vuejs.org/) o en [español](https://es-vuejs.github.io/vuejs.org/)
- Nuxt.js como servidor SSR para crear páginas indexables en el servidor [Sitio oficial](https://nuxtjs.org/)
- Vuex para el manejo de estados del sistema. [Documentación oficial](https://vuex.vuejs.org)
- Nuxt-i18n para el manejo de mensajes para la internacionalización del sistema [Sitio oficial](https://nuxt-community.github.io/nuxt-i18n/)
- Módulo Axios para Nuxt.js para el manejo de peticiones AJAX. [Sitio oficial](https://axios.nuxtjs.org/)(https://nuxt-community.github.io/nuxt-i18n/)
- Element-UI como framework de componentes para Vue.js [Sitio oficial](http://element.eleme.io/#/es)
- Sass como preprocesador CSS. [Documentación](http://sass-lang.com/)
- Semistandard como lint configurado para que se use con punto y coma(;) obligatorio. [Documentación](https://standardjs.com/)
- Wordpress como CMS para el portal [Sitio oficial](https://developer.wordpress.org/)
## Estructura general
Para la creación de la estructura general del proyecto base se hizo de la plantilla por defecto que nos proporciona Nuxt.js, el cambio más importante es que se movieron gran parte del código en la carpeta `src` por tema organización.
## Plugins
El proyecto cuenta con plugins(librerías que extienden la funcionalidad de `Vue.js`) para diversos usos y requerimientos:
Plugin | Descripción | Ejemplo |
--- | --- | --- |
$service | Plugin wrapper con funciones para el manejo de peticiones con `axios` su uso es recomendado | `this.$service.post('usuarios', { ... datos ... }).then(response => { ... })` |
$wordpress | Plugin wrapper con funciones para el manejo de peticiones con Wordpress | `this.$wordpress.getPosts().then(response => { ... })` |
## Element-UI
Element-UI es un framework de componentes para Vue.js más orientado a proveer componentes independientes del diseño tal característica hace que el diseño sea muy personalizable y cuenta con casi todos los componentes necesarios para un servicio digital, por defecto solo tiene los componentes básicos habilitados para habilitar otros componentes se lo debe hacer en el archivo `src/plugins/element-ui.js` descomentado el componente que se necesite.
## Instalación
Para instalar la aplicación se recomienda revisar el siguiente enlace:
> [INSTALL.md](INSTALL.md)
## Sobre el proyecto
Licencia: [LPG Bolivia 1](LICENCIA.md)
Lista de colaboración: [COLABORACIÓN.md](COLABORACIÓN.md)
Actualizaciones: [UPGRADE.md](UPGRADE.md)
# Registro de actualizaciones y cambios
import Vue from 'vue'
import NuxtLoading from './components/nuxt-loading.vue'
import '../src/assets/scss/main.scss'
import _3c00a851 from '../src/layouts/autenticado.vue'
import _6f6c098b from '../src/layouts/default.vue'
import _2d2495d5 from '../src/layouts/home.vue'
const layouts = { "_autenticado": _3c00a851,"_default": _6f6c098b,"_home": _2d2495d5 }
export default {
head: {"title":"portal-estado","meta":[{"charset":"utf-8"},{"name":"viewport","content":"width=device-width, initial-scale=1"},{"hid":"description","name":"description","content":"Sistema de diseño para los portales del estado"}],"link":[{"rel":"icon","type":"image\u002Fx-icon","href":"\u002Ffavicon.ico"}],"style":[],"script":[]},
render(h, props) {
const loadingEl = h('nuxt-loading', { ref: 'loading' })
const layoutEl = h(this.layout || 'nuxt')
const templateEl = h('div', {
domProps: {
id: '__layout'
},
key: this.layoutName
}, [ layoutEl ])
const transitionEl = h('transition', {
props: {
name: 'layout',
mode: 'out-in'
},
on: {
beforeEnter(el) {
// Ensure to trigger scroll event after calling scrollBehavior
window.$nuxt.$nextTick(() => {
window.$nuxt.$emit('triggerScroll')
})
}
}
}, [ templateEl ])
return h('div', {
domProps: {
id: '__nuxt'
}
}, [
loadingEl,
transitionEl
])
},
data: () => ({
layout: null,
layoutName: ''
}),
beforeCreate() {
Vue.util.defineReactive(this, 'nuxt', this.$options.nuxt)
},
created() {
// Add this.$nuxt in child instances
Vue.prototype.$nuxt = this
// add to window so we can listen when ready
if (typeof window !== 'undefined') {
window.$nuxt = this
}
// Add $nuxt.error()
this.error = this.nuxt.error
},
mounted() {
this.$loading = this.$refs.loading
},
watch: {
'nuxt.err': 'errorChanged'
},
methods: {
errorChanged() {
if (this.nuxt.err && this.$loading) {
if (this.$loading.fail) this.$loading.fail()
if (this.$loading.finish) this.$loading.finish()
}
},
setLayout(layout) {
if(layout && typeof layout !== 'string') throw new Error('[nuxt] Avoid using non-string value as layout property.')
if (!layout || !layouts['_' + layout]) {
layout = 'default'
}
this.layoutName = layout
this.layout = layouts['_' + layout]
return this.layout
},
loadLayout(layout) {
if (!layout || !layouts['_' + layout]) {
layout = 'default'
}
return Promise.resolve(layouts['_' + layout])
}
},
components: {
NuxtLoading
}
}
import Axios from 'axios'
// Axios.prototype cannot be modified
const axiosExtra = {
setHeader (name, value, scopes = 'common') {
for (let scope of Array.isArray(scopes) ? scopes : [ scopes ]) {
if (!value) {
delete this.defaults.headers[scope][name];
return
}
this.defaults.headers[scope][name] = value
}
},
setToken (token, type, scopes = 'common') {
const value = !token ? null : (type ? type + ' ' : '') + token
this.setHeader('Authorization', value, scopes)
},
onRequest(fn) {
this.interceptors.request.use(config => fn(config) || config)
},
onResponse(fn) {
this.interceptors.response.use(response => fn(response) || response)
},
onRequestError(fn) {
this.interceptors.request.use(undefined, error => fn(error) || Promise.reject(error))
},
onResponseError(fn) {
this.interceptors.response.use(undefined, error => fn(error) || Promise.reject(error))
},
onError(fn) {
this.onRequestError(fn)
this.onResponseError(fn)
}
}
// Request helpers ($get, $post, ...)
for (let method of ['request', 'delete', 'get', 'head', 'options', 'post', 'put', 'patch']) {
axiosExtra['$' + method] = function () { return this[method].apply(this, arguments).then(res => res && res.data) }
}
const extendAxiosInstance = axios => {
for (let key in axiosExtra) {
axios[key] = axiosExtra[key].bind(axios)
}
}
const setupProgress = (axios, ctx) => {
if (process.server) {
return
}
// A noop loading inteterface for when $nuxt is not yet ready
const noopLoading = {
finish: () => { },
start: () => { },
fail: () => { },
set: () => { }
}
const $loading = () => (window.$nuxt && window.$nuxt.$loading && window.$nuxt.$loading.set) ? window.$nuxt.$loading : noopLoading
let currentRequests = 0
axios.onRequest(config => {
if (config && config.progress === false) {
return
}
currentRequests++
})
axios.onResponse(response => {
if (response && response.config && response.config.progress === false) {
return
}
currentRequests--
if (currentRequests <= 0) {
currentRequests = 0
$loading().finish()
}
})
axios.onError(error => {
if (error && error.config && error.config.progress === false) {
return
}
currentRequests--
$loading().fail()
$loading().finish()
})
const onProgress = e => {
if (!currentRequests) {
return
}
const progress = ((e.loaded * 100) / (e.total * currentRequests))
$loading().set(Math.min(100, progress))
}
axios.defaults.onUploadProgress = onProgress
axios.defaults.onDownloadProgress = onProgress
}
export default (ctx, inject) => {
// baseURL
const baseURL = process.browser
? 'http://localhost:3000/'
: (process.env._AXIOS_BASE_URL_ || 'http://localhost:3000/')
// Create fresh objects for all default header scopes
// Axios creates only one which is shared across SSR requests!
// https://github.com/mzabriskie/axios/blob/master/lib/defaults.js
const headers = {
common : {
'Accept': 'application/json, text/plain, */*'
},
delete: {},
get: {},
head: {},
post: {},
put: {},
patch: {}
}
const axiosOptions = {
baseURL,
headers
}
// Proxy SSR request headers headers
axiosOptions.headers.common = (ctx.req && ctx.req.headers) ? Object.assign({}, ctx.req.headers) : {}
delete axiosOptions.headers.common['accept']
delete axiosOptions.headers.common['host']
delete axiosOptions.headers.common['cf-ray']
delete axiosOptions.headers.common['cf-connecting-ip']
if (process.server) {
// Don't accept brotli encoding because Node can't parse it
axiosOptions.headers.common['Accept-Encoding'] = 'gzip, deflate'
}
// Create new axios instance
const axios = Axios.create(axiosOptions)
// Extend axios proto
extendAxiosInstance(axios)
// Setup interceptors
setupProgress(axios, ctx)
// Inject axios to the context as $axios
ctx.$axios = axios
inject('axios', axios)
}
import Vue from 'vue'
import middleware from './middleware'
import {
applyAsyncData,
sanitizeComponent,
resolveRouteComponents,
getMatchedComponents,
getMatchedComponentsInstances,
flatMapComponents,
setContext,
middlewareSeries,
promisify,
getLocation,
compile,
getQueryDiff,
globalHandleError
} from './utils'
import { createApp, NuxtError } from './index'
const noopData = () => { return {} }
const noopFetch = () => {}