89 Commits

Author SHA1 Message Date
danielGe 9eafeab68e Merge pull request 'pruebas' (#3) from pruebas into master
Reviewed-on: #3
2021-01-19 22:24:26 +00:00
danielGe 220b44bd94 cambio de footer 2021-01-19 16:23:34 -06:00
danielGe 4667e34747 cargar el banner 2021-01-19 16:19:54 -06:00
danielGe 185669dd43 Merge pull request 'pruebas' (#2) from pruebas into master
Reviewed-on: #2
2021-01-19 22:02:08 +00:00
danielGe e8fe077b89 contruido con la ruta para produccion 2021-01-19 16:00:12 -06:00
danielGe 4b8defa41a change loading libry 2021-01-14 21:05:06 -06:00
danielGe ced0861cfb add status of new libry 2021-01-14 04:09:04 -06:00
danielGe bc0f37fd33 change placeholder of search bar 2021-01-12 19:08:30 -06:00
danielGe f013f1535a add progress bar 2021-01-12 18:47:40 -06:00
danielGe 2e7f9b5055 change meseje of bannerss image 2021-01-12 18:05:28 -06:00
danielGe 76537e91b2 login create and change version 2021-01-11 23:21:59 -06:00
danielGe 2e8938f863 change routes to update and create lib 2021-01-11 03:19:47 -06:00
danielGe 30d93847a5 construido para pruebas 2021-01-08 13:10:23 -06:00
danielGe f92f0fcc32 panel admin 2021-01-07 23:58:49 -06:00
danielGe 4e10a9015f front temrinado 2021-01-05 18:32:07 -06:00
danielGe 3322b667ee panel admin 2021-01-03 02:50:25 -06:00
casnet1 827cfdbce9 cambio de link a tienda acatlan 2020-11-10 19:12:00 -06:00
casnet1 b5e7d26ed7 cambio de link a tienda acatlan 2020-11-10 19:08:50 -06:00
casnet1 9bb8b6a4fd quitar console logs y arreglo de pagina antes de descripcion 2020-11-10 18:44:50 -06:00
danielGe 0ebd043a45 desabilitar difucion 2020-11-09 22:20:11 -06:00
danielGe ab6f010966 construido para produccion 2020-11-09 22:07:26 -06:00
casnet1 857512a311 boton sin submit 2020-10-27 12:49:19 -06:00
casnet1 d8239668c8 auto reload fixed in correo 2020-10-26 21:36:08 -06:00
casnet1 d86b3b55c5 error reload fixed 2020-10-15 14:45:55 -05:00
eithan ae0da8d77c espacio input 2020-10-13 21:03:18 -05:00
eithan 3616a9bcf6 funciona enviar correo a editoriales 2020-10-13 20:45:55 -05:00
eithan 2505776935 descargar pdf 2020-10-09 19:55:26 -05:00
eithan 546791c162 cambios de nuevo 2020-10-09 19:47:40 -05:00
eithan 6057dfb914 cambios de nuevo 2020-10-09 19:46:22 -05:00
casnet1 6d53fe8d81 correcciones ortograficas 2020-10-06 01:01:35 -05:00
casnet1 13fa25d5f6 contacto y cambios 2020-10-02 18:19:28 -05:00
casnet1 86c74faf70 ruta api cambiada 2020-10-01 11:57:51 -05:00
casnet1 fdd745aca6 cambio de api a produccion 2020-10-01 15:44:26 -05:00
casnet1 8115e50888 arreglo 2020-10-01 11:53:58 -05:00
casnet1 dffe414e01 actualizacion puntos de venta y lineamientos 2020-10-01 02:27:10 -05:00
casnet1 0211f7c116 pdf si funciona 2020-09-24 15:24:57 -05:00
casnet1 da081fe762 prueba3 2020-09-24 15:00:05 -05:00
casnet1 c2c897e319 prueba 2 2020-09-24 14:26:50 -05:00
casnet1 a1c0a89101 prueba 2 2020-09-24 14:24:03 -05:00
casnet1 c727055990 prueba 2020-09-24 14:05:12 -05:00
danielGe 024dffa3eb cambio de la ruta critica 2020-09-24 01:02:26 -05:00
casnet1 fd968e1d4f cambios textuales 2020-09-23 15:32:58 -05:00
casnet1 312415c928 previsualizacion pdf 2020-09-21 20:22:35 -05:00
danielGe 2843a3ec89 pdfModal 2020-09-21 19:38:07 -05:00
casnet1 886d9f2bf9 ruta de peticion nueva 2020-09-21 15:18:00 -05:00
casnet1 801df5d669 tablas arregladas 2020-09-21 02:25:17 -05:00
casnet1 6b6bc2cd4e puntos de venta y modificaciones 2020-09-15 20:53:31 -05:00
casnet1 47050252d1 puntos de venta y modificaciones 2020-09-15 20:52:27 -05:00
casnet1 01b4aee59b conexion a api preview libro 2020-09-15 00:07:40 -05:00
casnet1 3f8580b19a Marcos Normativos a Politica Editorial 2020-09-10 17:54:05 -05:00
casnet1 e1527f74a0 titulos 2020-09-10 13:03:57 -05:00
danielGe 5b7da58307 tabla procesos cambiada 2020-09-09 09:03:07 -05:00
danielGe 4da72ad48e construido para prod 2020-09-08 19:00:38 -05:00
danielGe 043b92e522 cambio de la tabla 2020-09-08 14:33:57 -05:00
casnet1 cbf47c7709 proceso y presentacion 2020-09-07 14:27:10 -05:00
casnet1 216cac71c8 fixed 4 2020-08-28 16:18:56 -05:00
casnet1 d1c4cc0085 fixed 3 2020-08-28 16:07:34 -05:00
casnet1 bbf6ac77af fixed 2 2020-08-28 16:06:47 -05:00
casnet1 6b7f1d55c0 construccion front fixed 2020-08-28 14:19:28 -05:00
casnet1 b7e1a62b68 previsualizacion 2020-08-26 17:42:38 -05:00
danielGe 03718594c6 agregar idLibros originales 2020-08-26 00:26:05 -05:00
casnet1 ac4187e317 construccion del front 3 2020-08-25 18:13:39 -05:00
casnet1 6275d586b4 construccion del front 2 2020-08-24 18:10:04 -05:00
casnet1 762a0335e2 presentacion modificado 2020-08-24 18:07:45 -05:00
danielGe a1d39e8c45 Merge pull request 'construido para presentacion' (#1) from pruebas into master
Reviewed-on: #1
2020-08-24 19:03:54 +00:00
danielGe fbf269e66d construido para produccion# 2020-08-24 13:59:21 -05:00
casnet1 d5a35a523b color hover 2020-08-24 13:50:30 -05:00
casnet1 c7350df32e commit nuevo 2020-08-24 13:07:38 -05:00
casnet1 d0cac70d64 busqueda 2020-08-22 22:49:34 -05:00
danielGe bbe67324d2 actualizacion de ngrok 2020-08-22 16:24:02 -05:00
danielGe 1690545b2a barra de busqeda 2020-08-22 04:50:05 -05:00
danielGe ff4af2e97c Merge branch 'desplegable' into pruebas 2020-08-22 02:29:29 -05:00
danielGe 1f7f93861a rutas ajustadas 2020-08-22 02:25:43 -05:00
casnet1 ad38d4bf33 mas data 2 2020-08-20 18:25:26 -05:00
casnet1 1fdfbc803d update data 2020-08-19 19:06:10 -05:00
casnet1 ae0b3cc02e Lineamientos desplegables 2020-08-19 03:45:34 -05:00
danielGe 6863cf7306 home responsivo terminado 2020-08-14 01:25:28 -05:00
danielGe f2e6840ffa merg con carrusel cool 2020-08-14 00:16:45 -05:00
eithan 673ff9c7fc carrusel dinamico 2020-08-14 00:05:24 -05:00
danielGe c085df460d Carrusel incompleto 2020-08-13 23:38:51 -05:00
eithan ed8b3618db front login 2020-08-13 23:38:34 -05:00
danielGe cecfa871d0 Merge branch 'difusion' into pruebas
sas
2020-08-13 20:25:37 -05:00
danielGe c8eb7eeda2 descipcion Terminada 2020-08-13 19:59:31 -05:00
danielGe 3d33ac2040 integracion de la Api para Desc 2020-08-12 01:52:56 -05:00
eithan e08a7a0cb3 view difusion 2020-08-11 21:54:00 -05:00
eithan 82e6e22152 correcciones 2020-08-10 20:10:29 -05:00
danielGe 118ac4edb0 Integracion descripcion libro 2020-08-08 02:17:26 -05:00
eithan 7d2c85b7c0 carrusel, componenteLibros, componenteTitulo 2020-08-07 23:50:24 -05:00
eithan 660e8fd230 nav sin funcionamiento 2020-08-05 16:07:27 -05:00
99 changed files with 20405 additions and 11892 deletions
+14 -14
View File
@@ -1,14 +1,14 @@
module.exports = {
root: true,
env: {
node: true
},
extends: ["plugin:vue/essential", "eslint:recommended", "@vue/prettier"],
parserOptions: {
parser: "babel-eslint"
},
rules: {
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off"
}
};
module.exports = {
root: true,
env: {
node: true
},
extends: ["plugin:vue/essential", "eslint:recommended", "@vue/prettier"],
parserOptions: {
parser: "babel-eslint"
},
rules: {
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off"
}
};
-1
View File
@@ -1,6 +1,5 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" type=image/png href=assets/icono.png><title>Portal Editorial Acatlán</title><link href=css/app.d2fdfe7d.css rel=preload as=style><link href=css/chunk-vendors.138628b4.css rel=preload as=style><link href=js/app.3c2f55de.js rel=preload as=script><link href=js/chunk-vendors.67046eec.js rel=preload as=script><link href=css/chunk-vendors.138628b4.css rel=stylesheet><link href=css/app.d2fdfe7d.css rel=stylesheet></head><body><noscript><strong>We're sorry but portal doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.67046eec.js></script><script src=js/app.3c2f55de.js></script></body></html>
+2
View File
File diff suppressed because one or more lines are too long
+1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12484 -11539
View File
File diff suppressed because it is too large Load Diff
+36 -28
View File
@@ -1,28 +1,36 @@
{
"name": "portal",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"bootstrap": "^4.5.0",
"core-js": "^3.6.5",
"vue": "^2.6.11",
"vue-router": "^3.3.4"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.4.0",
"@vue/cli-plugin-eslint": "~4.4.0",
"@vue/cli-service": "~4.4.0",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^6.2.2",
"prettier": "^1.19.1",
"vue-template-compiler": "^2.6.11"
}
}
{
"name": "portal",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.21.1",
"bootstrap": "^4.5.2",
"bootstrap-vue": "^2.21.2",
"core-js": "^3.6.5",
"jquery": "^3.5.1",
"popper.js": "^1.16.1",
"sweetalert2": "^10.13.0",
"vue": "^2.6.11",
"vue-router": "^3.3.4",
"vuex": "^3.6.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.4.0",
"@vue/cli-plugin-eslint": "~4.4.0",
"@vue/cli-service": "~4.4.0",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.17.0",
"eslint-config-airbnb-base": "^14.2.1",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^7.4.1",
"prettier": "1.19.1",
"vue-template-compiler": "^2.6.11"
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+17 -17
View File
@@ -1,17 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="shortcut icon" type="image/png" href="assets/icono.png">
<title>Portal Editorial Acatlán</title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
+4 -1
View File
@@ -5,7 +5,6 @@
</template>
<script>
export default {
name: "App"
};
@@ -27,4 +26,8 @@ export default {
.row {
margin: 0 !important;
}
.card-img-top {
height: 18rem;
}
</style>
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+279
View File
@@ -0,0 +1,279 @@
<template>
<b-container fluid>
<div v-if="!cargando">
<b-row class="mb-2">
<b-col class="mt-5 mb-3">
<h1 style="text-align:center;">Agregar Libro</h1>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-input
id="isbn"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="ISBN"
v-model="isbn"
></b-form-input>
</b-col>
<b-col>
<b-form-input
id="titulo"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Titulo"
v-model="titulo"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-dropdown v-model="categoria" v-bind:text="categoria" block split split-variant="outline-primary" variant="primary" class="m-2">
<b-dropdown-item @click="categoria='Ciencias Socioeconómicas'" >Ciencias Socioeconómicas</b-dropdown-item>
<b-dropdown-item @click="categoria='Diseño y Edificación'" >Diseño y Edificación</b-dropdown-item>
<b-dropdown-item @click="categoria='Enseñanza de Idiomas'" >Enseñanza de Idiomas</b-dropdown-item>
<b-dropdown-item @click="categoria='Estudios de Posgrado'" >Estudios de Posgrado</b-dropdown-item>
<b-dropdown-item @click="categoria='Humanidades'" >Humanidades</b-dropdown-item>
<b-dropdown-item @click="categoria='Matemáticas e Ingenieria'" >Matemáticas e Ingenieria</b-dropdown-item>
<b-dropdown-item @click="categoria='Universidad Abierta y Educación a Distancia'" >Universidad Abierta y Educación a Distancia</b-dropdown-item>
</b-dropdown>
</b-col>
<b-col>
<b-form-input
id="autor"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Autor"
v-model="autor"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-input
id="paginas"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Numero de paginas"
v-model="paginas"
type="number"
></b-form-input>
</b-col>
<b-col>
<b-form-input
id="precio"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Precio"
v-model="precio"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-dropdown v-model="version" v-bind:text="version" block split split-variant="outline-primary" variant="primary" class="m-2">
<b-dropdown-item @click="version='Impresa'" >Impresa</b-dropdown-item>
<b-dropdown-item @click="version='Digital'" >Digital</b-dropdown-item>
</b-dropdown>
</b-col>
<b-col>
<b-form-input
id="year"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Año de publicación"
v-model="year"
type="number"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-file
id="pdfNuevo"
placeholder="Seleccione el PDF o arrastre..."
accept=".pdf"
></b-form-file>
</b-col>
<b-col>
<b-form-file
id="imagenNuevo"
placeholder="Seleccione la imagen o arrastre..."
accept=".png, .jpg"
></b-form-file>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-textarea
id="descripcion"
v-model="impresion"
placeholder="Ediciones (Primera edición: 2016)"
rows="3"
max-rows="6"
></b-form-textarea>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-textarea
id="descripcion"
v-model="descripcion"
placeholder="Descripción"
rows="3"
max-rows="6"
></b-form-textarea>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col class="mb-5">
<div style="margin-top: 2rem;">
<b-button block variant="success" @click="agregarLibro()">Agregar</b-button>
</div>
</b-col>
</b-row>
</div>
<div v-else>
<CargandoLibro v-bind:imageLoading="imageLoading" v-bind:pdfLoading="pdfLoading" v-bind:dataLoading="dataLoading" v-bind:imageSaved="imageSaved" v-bind:pdfSaved="pdfSaved" v-bind:dataSaved="dataSaved" />
</div>
</b-container>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
import Swal from 'sweetalert2'
import CargandoLibro from './cargandoDatos.vue';
export default {
components: {
CargandoLibro
},
props: {
nombreLibro: String,
value: String
},
data() {
return {
isbn: "",
titulo: "",
categoria:"Categoria",
autor:"",
paginas:"",
impresion:"",
precio:"",
version:"Versión",
descripcion:"",
year:"",
cargando: false,
imageLoading: true,
pdfLoading: true,
dataLoading: true,
imageSaved: false,
pdfSaved: false,
dataSaved: false
};
},
methods:{
faltaCampo(campo){
Swal.fire(
`Te falta por llenar el campo de ${campo}`,
'',
'warning'
)
},
async agregarLibro(){
try{
var formData = new FormData();
var imagen = document.querySelector('#imagenNuevo');
var pdf = document.querySelector('#pdfNuevo');
if(this.isbn !== "") formData.append("isbn", this.isbn); else return this.faltaCampo("ISBN");
if(this.titulo !== "") formData.append("titulo", this.titulo); else return this.faltaCampo("Titulo");
if(this.categoria !== "Categoria") formData.append("categoria", this.categoria); else return this.faltaCampo("Categoria");
if(this.autor !== "") formData.append("autor", this.autor); else return this.faltaCampo("Autor");
if(this.paginas !== "") formData.append("paginas", this.paginas); else return this.faltaCampo("Paginas");
if(this.impresion !== "") formData.append("edicion", this.impresion); else return this.faltaCampo("Edición");
if(this.precio !== "") formData.append("precio", this.precio); else return this.faltaCampo("Precio");
if(this.version !== "Versión") formData.append("version", this.version); else return this.faltaCampo("Versión");
if(this.descripcion !== "") formData.append("descripcion", this.descripcion); else return this.faltaCampo("Descripción");
if(this.year !== "") formData.append("year", this.year); else return this.faltaCampo("Año de publicación");
if(imagen.files.length === 0) return this.faltaCampo("Imagen");
if(pdf.files.length === 0) return this.faltaCampo("Pdf");
formData.append("type", 'addLibro');
formData.append("seccion", 'datos');
if(imagen.files[0].size > 1200000){
Swal.fire(
`EL tamaño de la Imagen es muy grande`,
'Por favor suba imagenes menores a 1MG',
'warning'
)
return;
}
if(pdf.files[0].size > 1200000){
Swal.fire(
`EL tamaño del PDF es muy grande`,
'Por favor suba PDFs menores a 1MG',
'warning'
)
return;
}
this.cargando = true;
let idLibro = null;
let textoFinal = ``;
await axios.post( `${config.api}/actualizarLibro`, formData ,{ headers: { 'Content-Type': 'multipart/form-data' } }).then(response =>{
console.log('lo que responde datos:', response);
idLibro = response.data.idLibro;
this.dataLoading= false;
this.dataSaved = true;
}).catch(async () =>{
this.dataLoading= false
await Swal.fire({
icon: 'error',
title: 'No se pudieron guardar los datos',
text: `No se pudieron guardar los datos en la base de datos, intentelo en un otro momento`,
});
location.reload();
return;
});
formData.delete('seccion');
formData.append("seccion", 'imagen');
formData.append("idLibro", idLibro);
formData.append("imagen", imagen.files[0]);
await axios.post( `${config.api}/actualizarLibro`, formData ,{ headers: { 'Content-Type': 'multipart/form-data' } }).then(() =>{
this.imageLoading= false;
this.imageSaved = true;
}).catch(() => {
this.imageLoading= false;
textoFinal += `No su pudo guardar la imagen`;
});
formData.delete('seccion');
formData.delete('imagen');
formData.append("seccion", 'pdf');
formData.append("pdf", pdf.files[0]);
await axios.post( `${config.api}/actualizarLibro`, formData ,{ headers: { 'Content-Type': 'multipart/form-data' } }).then(() =>{
this.pdfLoading= false;
this.pdfSaved = true;
}).catch(() =>{
this.pdfLoading= false;
textoFinal += `y tampoco se pude guardar el pdf`;
});
if(textoFinal!== ``)
textoFinal += ` actualize los datos editando el libro`
await Swal.fire(
'Se termino de subir los datos',
textoFinal,
'success'
);
location.reload();
}
catch(error){
console.log(error);
Swal.fire({
icon: 'error',
title: 'El libro no pudo ser agregado',
text: `Algo salio mal, ${error}`,
});
}
}
}
}
</script>
+81
View File
@@ -0,0 +1,81 @@
<template>
<div class="container" style="margin-top: 3rem; margin-bottom: 3rem;">
<div class="d-flex justify-content-center" >
<b-card class="text-left " style="width: 20rem; margin-top: .8rem;" >
<b-container v-if="dataLoading">
<b-row>
<b-col cols="3">
<b-spinner variant="primary" label="Spinning"></b-spinner>
</b-col>
<b-col >
<b-card-text block>
Guardando Datos...
</b-card-text>
</b-col>
</b-row>
</b-container>
<b-alert v-else-if="dataSaved" variant="success" show style="margin: 0rem">Datos Guardados</b-alert>
<b-alert v-else show variant="danger">Los datos no se pudieron guardar</b-alert>
</b-card>
</div>
<div class="d-flex justify-content-center">
<b-card class="text-left" style="width: 20rem; margin-top: .8rem;" >
<b-container v-if="imageLoading">
<b-row>
<b-col cols="3">
<b-spinner variant="primary" label="Spinning"></b-spinner>
</b-col>
<b-col >
<b-card-text block>
Guardando Imagen...
</b-card-text>
</b-col>
</b-row>
</b-container>
<b-alert v-else-if="imageSaved" variant="success" show style="margin: 0rem">Imagen Guardada</b-alert>
<b-alert v-else show variant="danger">La imagen no se pudo guardar</b-alert>
</b-card>
</div>
<div class="d-flex justify-content-center">
<b-card class="text-left" style="width: 20rem; margin-top: .8rem;" >
<b-container v-if="pdfLoading">
<b-row>
<b-col cols="3">
<b-spinner variant="primary" label="Spinning"></b-spinner>
</b-col>
<b-col >
<b-card-text block>
Guardando PDF...
</b-card-text>
</b-col>
</b-row>
</b-container>
<b-alert v-else-if="pdfSaved" variant="success" show style="margin: 0rem">PDF Guardado</b-alert>
<b-alert v-else show variant="danger">El pdf no se pudo guardar</b-alert>
</b-card>
</div>
<h3 style="margin-top: 2rem;"><strong>Cargando...</strong></h3>
</div>
</template>
<script>
export default {
props: {
imageLoading: Boolean,
pdfLoading: Boolean,
dataLoading: Boolean,
imageSaved: Boolean,
pdfSaved: Boolean,
dataSaved: Boolean,
},
data() {
return {
}}
}
</script>
<style scoped>
</style>
+87
View File
@@ -0,0 +1,87 @@
<template>
<div class="divMaster row ">
<div
id="carouselExampleControls"
class="carousel slide col-md-10 col-lg-10 col-xl-10 my-5 col-12 mx-auto"
data-ride="carousel"
>
<div class="carousel-inner">
<div
class="carousel-item"
v-bind:key="libro.id"
v-for="(libro, idx) in Libros"
:class="{ active: idx == 0 }"
>
<img :src="libro.img" class="d-block w-100 img-fluid" alt="img" />
</div>
</div>
<a
class="carousel-control-prev"
href="#carouselExampleControls"
role="button"
data-slide="prev"
>
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a
class="carousel-control-next"
href="#carouselExampleControls"
role="button"
data-slide="next"
>
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
export default {
data() {
return {
Libros: []
};
},
async created() {
try {
let path = `${config.api}/imagenCarrusel?nombre=`;
let nombres = await axios.get(`${config.api}/nombreCarrusel`);
nombres = nombres.data.data;
for (let i = 0; i < nombres.length; i++) {
//console.log(path);
let config = {
// example url
url: `${path}${nombres[i]}`,
method: "GET",
responseType: "blob"
};
try{
await axios(config).then(response => {
let reader = new FileReader();
reader.readAsDataURL(response.data);
reader.onload = () => {
this.Libros.push({ id: i, img: reader.result });
};
});
}
catch(error){
console.log(error);
}
}
} catch (error) {
console.log(`Ocurrio un error msj: ${error}`);
}
}
};
</script>
<style scoped>
.divMaster {
height: auto;
}
</style>
+91
View File
@@ -0,0 +1,91 @@
<template>
<div class="divMaster row mb-5">
<div class="col-10 offset-1 d-flex flex-wrap justify-content-center">
<div
class="card m-3"
style="width: 12rem;"
v-bind:key="libro.id"
v-for="libro in Libros"
@click="descripcion(libro.id)"
>
<router-link :to="{ path: 'home' }" class="textt">
<img :src="libro.img" class="card-img-top rounded" alt="libro" />
<div class="card-body cd textt">
<p class="card-text textt">
{{ libro.title }}
</p>
</div>
</router-link>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
export default {
data() {
return {
Libros: []
};
},
methods: {
async descripcion(idLibro) {
//console.log(` Este es el id del libro ${idLibro}`);
localStorage.clear();
window.localStorage.setItem("idLibro", idLibro);
this.$router.push("/desc");
}
},
async created() {
try {
let novedades = await axios.get(`${config.api}/librosNovedades`);
let path = `${config.api}/libroImagen?idLibro=`;
novedades = novedades.data.data;
//console.log(`${novedades}`);
for (let i = 0; i < novedades.length; i++) {
//alert(novedades[i].titulo);
//this.Libros[i].title = novedades[i].titulo;
let config = {
// example url
url: `${path}${novedades[i].idLibro}`,
method: "GET",
responseType: "blob"
};
try {
await axios(config).then(response => {
let reader = new FileReader();
reader.readAsDataURL(response.data);
reader.onload = () => {
this.Libros.push({
id: novedades[i].idLibro,
title: novedades[i].titulo,
img: reader.result
});
};
});
} catch (error) {
console.log(`No existe esa imagen`);
}
}
} catch (error) {
console.log(`Ocurrio un error ${error}`);
}
}
};
</script>
<style scoped>
.divMaster {
height: auto;
}
.card {
border: none !important;
border-bottom: 5px solid #1b3d70 !important;
}
a {
text-decoration: none !important;
color: black;
}
</style>
+326 -33
View File
@@ -2,61 +2,354 @@
<div class="container">
<div class="row ">
<div class="col-md-6 col-sm-12 py-5">
<img
v-bind:src="rutaIm"
class="libro"
/>
<img :src="src" alt="" class="libro" />
<button class="button pre" @click="showModal()">
Previsualizar
</button>
<div v-if="Visible" @close="closeModal()">
<transition name="modal">
<div class="modal-backdrop" @click.self="closeModal()">
<div
class="modal"
role="dialog"
aria-labelledby="modalTitle"
aria-describedby="modalDescription"
>
<section class="modal-body rounded" id="modalDescription">
<iframe
:src="PDF"
width="100%"
height="100%"
frameborder="0"
></iframe>
</section>
</div>
</div>
</transition>
</div>
<br /><br />
<div class="container">
<div class="row izq">
<b style="font-size: 18px;" class="izq">Compartir</b><br />
</div>
<div class="container izq">
<a href="https://www.facebook.com/" class="img"
><img
style="width: 45px; height: 45px"
src="../assets/facebook.png"
alt="Facebook"
/></a>
<a href="https://www.instagram.com/" class="img"
><img
style="width: 45px; height: 45px"
src="../assets/Instagram.png"
alt="Instagram"
/></a>
<a href="https://www.youtube.com/" class="img"
><img
style="width: 45px; height: 45px"
src="../assets/YouTube.png"
alt="Youtube"
/></a>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 py-5 titulo">
<b >Titulo:</b><p>{{titulo}}</p>
<b >Autor: </b><p>{{autor}}</p>
<b >Paginas: </b><p>{{paginas}}</p>
<b >ISBN: </b><p>{{isbn}}</p>
<b >Año de Impresión: </b><p>{{edicion}}</p>
<b >Precio: </b><p>{{precio}}</p>
<b >Versión:</b>
<b>Titulo:</b>
<p>{{ titulo }}</p>
<b>Autor: </b>
<p>{{ autor }}</p>
<b>Paginas: </b>
<p>{{ paginas }}</p>
<b>ISBN: </b>
<p>{{ isbn }}</p>
<b>Año de Impresión: </b>
<p>{{ edicion }}</p>
<b>Precio: </b>
<p>{{ precio }}</p>
<b>Versión:</b>
<p>{{ version }}</p>
<b>Descripción:</b>
<div class="overflow-auto">{{ desc }}</div>
<a
href="https://tienda.acatlan.unam.mx/"
class="button text-white d-flex justify-content-center align-items-center"
>
<p class="text-center">Comprar</p>
</a>
</div>
</div>
<Title title="Similares" />
<div class="divMaster row ">
<div class="col-10 offset-1 d-flex flex-wrap justify-content-center mb-5">
<div
class="card m-3"
style="width: 12rem;"
v-bind:key="libro.id"
v-for="libro in Libros"
@click="descripcion(libro.id)"
>
<div class="textt">
<img :src="libro.img" class="card-img-top rounded" alt="libro" />
<div class="card-body cd textt">
<p class="card-text textt">
{{ libro.title }}
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
import Title from "../components/titulo.vue";
//import modal from "../components/previsual.vue";
export default {
data() {
return {
titulo: "Competitive programing",
autor: "HALIM",
paginas: "300",
isbn: "POSF-12-43",
edicion: "Primera edicion",
precio: "$3232.00",
rutaIm: `./${__dirname}src/assets/as.jpg`
}
components: {
Title
//modal
},
data() {
return {
idLibro: "",
titulo: "",
autor: "",
paginas: "",
isbn: "",
edicion: "",
precio: "",
src: "",
version: "",
desc: ``,
boton2: "",
categoria: "",
Libros: [],
Visible: false,
isModalVisible: false,
//PDF: "http://www.ataun.eus/bibliotecagratuita/Cl%C3%A1sicos%20en%20Espa%C3%B1ol/Nicol%C3%A1s%20Maquiavelo/El%20pr%C3%ADncipe.pdf#toolbar=0&navpanes=0&scrollbar=0&zoom=80"
PDF: "RUTA.pdf" //nombre del archivo de previsualizacion del libro
// "https://www.imprentanacional.go.cr/editorialdigital/libros/literatura%20infantil/el_principito_edincr.pdf"
};
},
methods: {
close() {
this.$emit("close");
},
async descripcion(idLibro) {
localStorage.clear();
window.localStorage.setItem("idLibro", idLibro);
location.reload();
},
showModal() {
this.Visible = true;
},
closeModal() {
this.Visible = false;
}
},
async created() {
let path = `${config.api}`;
try {
this.idLibro = window.localStorage.getItem("idLibro");
let detalle = await axios.get(
`${config.api}/libroDetalle?idLibro=${this.idLibro}`
);
let detalleDatos = await detalle.data.datos;
this.titulo = detalleDatos.titulo;
this.autor = detalleDatos.autor;
this.paginas = detalleDatos.paginas;
this.isbn = detalleDatos.isbn;
this.edicion = detalleDatos.impresion;
this.precio = detalleDatos.precio;
this.version = detalleDatos.version;
this.desc = detalleDatos.descripcion;
this.categoria = detalleDatos.categoria;
//let path = `${config.api}/PDFget/?nombrePDF=${nombre}`;
this.PDF = `${config.api}/PDFget/?nombrePDF=${detalle.data.pdfVis}`;
//console.log(`datos: `,detalleDatos.data );
//console.log(`Esta es el nombred el pdf ${this.PDF}`);
window.localStorage.setItem("pdfVis", this.PDF);
if (detalleDatos.precio !== "Gratis") this.boton2 = "Comprar";
else this.boton2 = "Descargar";
} catch (error) {
console.log(error);
}
try {
let config = {
// example url
url: `${path}/libroImagen?idLibro=${this.idLibro}`,
method: "GET",
responseType: "blob"
};
await axios(config).then(response => {
let reader = new FileReader();
reader.readAsDataURL(response.data);
reader.onload = () => {
this.src = reader.result;
};
});
} catch (error) {
console.log(error);
}
try {
let similares = await axios.get(
`${config.api}/librosSimilares?categoria=${this.categoria}`
);
similares = similares.data.data;
//console.log(`${similares}`);
for (let i = 0; i < similares.length; i++) {
let config = {
// example url
url: `${path}/libroImagen?idLibro=${similares[i].idLibro}`,
method: "GET",
responseType: "blob"
};
try {
await axios(config).then(response => {
let reader = new FileReader();
reader.readAsDataURL(response.data);
reader.onload = () => {
this.Libros.push({
id: similares[i].idLibro,
title: similares[i].titulo,
img: reader.result
});
//this.Libros[i].img = reader.result;
};
});
} catch (error) {
console.log(`Este libro no se encuentra: ${error}`);
}
}
} catch (error) {
console.log(`Ocurrio un error ${error}`);
}
}
};
</script>
<style scoped>
.titulo{
font-size: 1.3rem;
text-align: left;
color: balck;
.modal-backdrop {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.3);
display: flex;
justify-content: center;
align-items: center;
}
.modal {
background: #ffffff;
box-shadow: 2px 2px 20px 1px;
/* overflow-x: auto; */
display: flex;
flex-direction: column;
position: relative;
width: 90%;
height: 90%;
}
.modal-body {
/* position: relative; */
padding: 20px 10px;
}
.divMaster {
height: auto;
}
.card {
border: none !important;
border-bottom: 5px solid #1b3d70 !important;
}
a {
text-decoration: none !important;
color: black;
}
.img {
margin-left: 1rem;
margin-top: 1rem;
}
.izq {
display: flex;
justify-content: flex-start;
}
.button {
background-color: rgb(187, 136, 0);
border: none;
color: white;
height: 4.5rem;
width: 15rem;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 1.5rem;
border-radius: 1rem;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
margin-top: 2rem;
}
.button:hover {
background-color: #46c200;
color: white;
}
.pre {
background-color: #1e3c70;
}
.pre:hover {
background-color: rgb(187, 136, 0);
}
.titulo {
font-size: 1rem;
text-align: left;
color: balck;
}
p {
margin-bottom: 0.5rem;
}
.libro {
width: 360px;
width: 320px;
height: 480px;
margin-right: auto;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.57);
}
@media (max-width: 450px) {
.libro {
width: 270px;
height: 380px;
margin-right: auto;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.57);
}
.libro {
width: 270px;
height: 380px;
margin-right: auto;
box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.57);
}
.button {
text-align: center;
margin-top: 3rem;
}
}
@media screen and (max-width: 380px) {
.button {
text-align: center;
margin-top: 3rem;
}
}
</style>
+156
View File
@@ -0,0 +1,156 @@
<template>
<b-container class="mt-5">
<div class="mb-5">
<h1 class="mb-4" style="text-align:left;">Agregar Imagen</h1>
<b-row>
<b-col class="p-0" cols="8">
<b-form-file
v-model="nuevaImagenBanner"
id="nuevaImagenBanner"
block
placeholder="Seleccione la imagen o arrastre aqui..."
accept=".png, .jpg"
></b-form-file>
</b-col>
<b-col>
<b-button block variant="success" @click="agregarImagen()">Agregar</b-button>
</b-col>
</b-row>
</div>
<h1 class="mb-4" style="text-align:left;">Eliminar Imagen</h1>
<div class=" row ">
<div class="d-flex flex-wrap" style="justify-content: space-between;">
<div v-bind:key="imagenBanner.id" v-for="imagenBanner in imagenesBanner" >
<b-card class="m-3" style="width: 28rem;">
<b-card-img :src="imagenBanner.img" alt="Image" ></b-card-img>
<b-card-footer><b-button variant="danger" @click="eliminarImagen(imagenBanner.nombreImagen)">Eliminar</b-button></b-card-footer>
</b-card>
</div>
</div>
</div>
</b-container>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
import Swal from 'sweetalert2'
export default {
name: "editarBanner",
data() {
return {
imagenesBanner: [],
nuevaImagenBanner: null,
};
},
methods:{
async eliminarImagen(nombreImagenBanner){
const swalWithBootstrapButtons = Swal.mixin({
customClass: {
confirmButton: 'btn btn-outline-success',
cancelButton: 'btn btn-outline-danger'
},
buttonsStyling: false
})
swalWithBootstrapButtons.fire({
title: '¿Estás seguro de que quieres eliminar la imagen?',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Si, eliminar',
cancelButtonText: 'No, cancelar',
reverseButtons: true
}).then(async (result) => {
if (result.isConfirmed) {
try{
await axios.post( `${config.api}/eliminarImagenCarrusel`,{nombre: nombreImagenBanner} );
await swalWithBootstrapButtons.fire(
'Eliminado!',
'Se ha eliminado la imagen con éxito.',
'success'
);
location.reload();
}
catch(error){
console.log(error);
Swal.fire({
icon: 'error',
title: 'La imagen no pudo ser eliminada',
text: 'algo salio mal, mensaje en consola',
});
}
}
})
},
async agregarImagen(){
try{
let formData = new FormData();
let imagenBanner = document.querySelector('#nuevaImagenBanner');
console.log('tamaño: ',imagenBanner.files.length);
if(imagenBanner.files.length === 0){
Swal.fire(
'¿Aún no has seleccionado la imagen?',
'',
'question'
);
return;
}
formData.append("imagen", imagenBanner.files[0]);
await axios.post( `${config.api}/agregarImagenCarrusel`, formData ,{ headers: {'Content-Type': 'multipart/form-data'}} );
await Swal.fire(
'Imagen agregada con éxito',
'',
'success'
);
location.reload();
}
catch(error){
console.log(error);
Swal.fire({
icon: 'error',
title: 'La imagen no pudo ser agregada',
text: 'Algo salio mal, mensaje en consola',
});
}
}
},
async created() {
try {
let path = `${config.api}/imagenCarrusel?nombre=`;
let nombres = await axios.get(`${config.api}/nombreCarrusel`);
nombres = nombres.data.data;
for (let i = 0; i < nombres.length; i++) {
let config = {
url: `${path}${nombres[i]}`,
method: "GET",
responseType: "blob"
};
try{
await axios(config).then(response => {
let reader = new FileReader();
reader.readAsDataURL(response.data);
reader.onload = () => {
this.imagenesBanner.push({ id: i, img: reader.result, nombreImagen: nombres[i]});
};
});
}
catch(error){
console.log(error);
}
}
} catch (error) {
console.log(`Ocurrio un error msj: ${error}`);
}
}
};
</script>
<style scoped>
.divMaster {
height: auto;
}
</style>
+182
View File
@@ -0,0 +1,182 @@
<template>
<b-container class="mt-2">
<div style="margin-bottom: 2rem">
<h4 style="text-align:left">Libros cargados </h4>
<b-progress :max="librosTotales" height="1.5rem" >
<b-progress-bar :value="Libros.length">
<span>Cargados: <strong>{{ Libros.length }} / {{ librosTotales }}</strong></span>
</b-progress-bar>
</b-progress>
</div>
<div class=" divMaster row row d-flex flex-wrap justify-content-center mb-3">
<b-input-group class="mb-2">
<b-input-group-prepend is-text>
<b-icon icon="search"></b-icon>
</b-input-group-prepend>
<b-form-input type="search" placeholder="Buscar por nombre del libro, autor o categoría" v-model="searchLibro" ></b-form-input>
</b-input-group>
</div>
<div class="divMaster row ">
<div class=" d-flex flex-wrap " style="justify-content: space-between;">
<div v-bind:key="libro.id" v-for="libro in listaLibroFiltrada" >
<b-card class="mb-3" style="width: 14rem; height: 25rem;">
<b-card-img :src="libro.img" alt="Image" style="max-width: 20rem; height: 15rem;" ></b-card-img>
<p class="mt-1" style="text-align: left; font-size: 15px;">{{nombreLibro(libro.titulo)}}</p>
<template #footer>
<b-button variant="outline-warning" class="float-left" @click="libroSelect=libro" v-b-modal.modalEditarLibro>Editar</b-button>
<b-button variant="outline-danger" class="float-right" @click="eliminarLibro(libro.idLibro)" >Eliminar</b-button>
</template>
</b-card>
</div>
</div>
</div>
<ModalEditar v-bind:libro="libroSelect" />
</b-container>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
import ModalEditar from './modalEditar.vue';
import Swal from 'sweetalert2';
export default {
components: {
ModalEditar,
},
data() {
return {
Libros: [],
searchLibro: "",
libroSelect: null,
librosTotales: 0,
};
},
methods: {
async eliminarLibro(idLibro){
const swalWithBootstrapButtons = Swal.mixin({
customClass: {
confirmButton: 'btn btn-outline-success',
cancelButton: 'btn btn-outline-danger'
},
buttonsStyling: false
})
swalWithBootstrapButtons.fire({
title: '¿Estás seguro de que quieres eliminar el libro?',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Si, eliminar',
cancelButtonText: 'No, cancelar',
reverseButtons: true
}).then(async (result) => {
if (result.isConfirmed) {
try{
await axios.post( `${config.api}/eliminarLibro`,{idLibro: idLibro} );
await swalWithBootstrapButtons.fire(
'Eliminado!',
'Se ha eliminado el libro con éxito.',
'success'
);
location.reload();
}
catch(error){
console.log(error);
Swal.fire({
icon: 'error',
title: 'El libro no pudo ser eliminado',
text: 'algo salio mal, mensaje en consola',
});
}
}
})
},
nombreLibro(nombreLibro){
let maxLengthtitulo = 40;
if(nombreLibro.length < maxLengthtitulo)
return nombreLibro;
return `${nombreLibro.substring(0, maxLengthtitulo)}...`;
}
},
async created() {
try {
let todosLibros = await axios.get(`${config.api}/getTodosLibros`);
let path = `${config.api}/libroImagen?idLibro=`;
todosLibros = todosLibros.data.data;
this.librosTotales = todosLibros.length;
for (let i = 0; i < todosLibros.length; i++) {
let config = {
url: `${path}${todosLibros[i].idLibro}`,
method: "GET",
responseType: "blob"
};
try {
axios(config).then( async response => {
let reader = new FileReader();
await reader.readAsDataURL(response.data);
reader.onload = () => {
this.Libros.push({
id: todosLibros[i].idLibro,
titulo: todosLibros[i].titulo,
img: reader.result,
idLibro: todosLibros[i].idLibro,
isbn: todosLibros[i].isbn,
categoria: todosLibros[i].categoria,
autor: todosLibros[i].autor,
paginas: todosLibros[i].paginas,
impresion: todosLibros[i].impresion,
precio: todosLibros[i].precio,
version: todosLibros[i].version,
descripcion: todosLibros[i].descripcion,
year: todosLibros[i].year,
});
};
}).catch(() =>{
this.Libros.push({
id: todosLibros[i].idLibro,
titulo: todosLibros[i].titulo,
idLibro: todosLibros[i].idLibro,
isbn: todosLibros[i].isbn,
categoria: todosLibros[i].categoria,
autor: todosLibros[i].autor,
paginas: todosLibros[i].paginas,
impresion: todosLibros[i].impresion,
precio: todosLibros[i].precio,
version: todosLibros[i].version,
descripcion: todosLibros[i].descripcion,
year: todosLibros[i].year,
});
});
} catch (error) {
console.log(`No existe esa imagen`);
}
}
} catch (error) {
console.log(`Ocurrio un error ${error}`);
}
},
computed:{
listaLibroFiltrada: function()
{
return this.Libros.filter( (item)=>{
let searchTitulo = (item.titulo).toLowerCase().includes(this.searchLibro.toLowerCase()) ;
let searchAutor = (item.autor).toLowerCase().includes(this.searchLibro.toLowerCase()) ;
let searchCategoria = (item.categoria).toLowerCase().includes(this.searchLibro.toLowerCase()) ;
if(searchTitulo || searchAutor || searchCategoria)
return true;
return false;
}
);
}
}
};
</script>
<style scoped>
.divMaster {
height: auto;
}
</style>
+56
View File
@@ -0,0 +1,56 @@
<template>
<div>
<div class="row d-flex align-items-center tamaño cuerpo">
<div class="col-12 col-sm-12 col-md-4 col-lg-6 col-xl-6 p-0">
<img class="card-img" :src="img" alt="Card image cap" />
</div>
<div class="col-12 col-sm-12 col-md-8 col-lg-6 col-xl-6 card-body ">
<h5>{{ title }}</h5>
<br />
<p class="card-text-right">{{ text }}</p>
<a
:href="linkD"
target="_blank"
v-if="linkD != '' && linkW == ''"
download
>
<span> Descargar aquí</span>
</a>
<a :href="linkW" target="_blank" v-if="linkD == '' && linkW != ''">
<span> Visita nuestra página </span>
</a>
</div>
</div>
</div>
</template>
<script>
export default {
props: ["linkD", "linkW", "img", "text", "title"],
data() {
return {};
}
};
</script>
<style scoped>
.tamaño {
width: 40rem;
}
.cuerpo {
-webkit-box-shadow: 1px 9px 17px 0px rgba(0, 0, 0, 0.75);
-moz-box-shadow: 1px 9px 17px 0px rgba(0, 0, 0, 0.75);
box-shadow: 1px 9px 17px 0px rgba(0, 0, 0, 0.75);
}
@media (max-width: 440px) {
.tamaño {
width: 18rem;
}
.cuerpo {
-webkit-box-shadow: 1px 9px 17px 0px rgba(0, 0, 0, 0.75);
-moz-box-shadow: 1px 9px 17px 0px rgba(0, 0, 0, 0.75);
box-shadow: 1px 9px 17px 0px rgba(0, 0, 0, 0.75);
}
}
</style>
+1 -20
View File
@@ -1,26 +1,7 @@
<template>
<footer class="container-fluid Azul-puma footer py-3 ">
<container>
<div row>
<button type="button" class="col-md-6 col-sm-12 btn boton-footer uno">
Comité Editorial
</button>
<button type="button" class="col-md-6 col-sm-12 btn boton-footer dos">
Política Editorial y Lineamentos
</button>
<button type="button" class="col-md-6 col-sm-12 btn boton-footer tres">
Proceso Editorial y Organismos
</button>
<button
type="button"
class="col-md-6 col-sm-12 btn boton-footer cuatro"
>
Puntos de Venta
</button>
</div>
</container>
<div row>
<p class="mb-0 ">Hecho en México, todos los derechos reservados 2020.</p>
<p class="mb-0 ">Hecho en México, todos los derechos reservados 2021.</p>
<p class="my-0 ">
Esta página puede ser reproducida con fines no lucrativos, siempre y
cuando no se mutile, se cite la fuente
+32 -34
View File
@@ -1,39 +1,37 @@
<template>
<container>
<div class="row divMaster header cl-12 azulUnam">
<div
class="logo_unam col-4 offset-1 d-inline-flex my-2 align-items-center"
>
<a href="https://www.unam.mx/" target="_blank">
<img class="sizeImg" src="../assets/Logo-UNAM.png" alt="logo unam" />
</a>
</div>
<div
class="logo_acatlan col-4 offset-2 d-inline-flex justify-content-end my-2 align-items-center"
>
<a href="https://www.acatlan.unam.mx/" target="_blank">
<img
class="sizeImg"
src="../assets/FES-editoriales.png"
alt="logo unam"
/>
</a>
</div>
<div
class="logo_acatlan_resp col-8 offset-2 d-flex justify-content-center my-2 align-items-center"
>
<a href="https://www.acatlan.unam.mx/" target="_blank">
<img
class="sizeImg"
src="../assets/FES-editoriales.png"
alt="logo unam"
/>
</a>
</div>
<div class="row divMaster header cl-12 azulUnam">
<div
class="logo_unam col-4 offset-1 d-inline-flex my-2 align-items-center"
>
<a href="https://www.unam.mx/" target="_blank">
<img class="sizeImg" src="../assets/Logo-UNAM.png" alt="logo unam" />
</a>
</div>
</container>
<div
class="logo_acatlan col-4 offset-2 d-inline-flex justify-content-end my-2 align-items-center"
>
<a href="https://www.acatlan.unam.mx/" target="_blank">
<img
class="sizeImg"
src="../assets/FES-editoriales.png"
alt="logo unam"
/>
</a>
</div>
<div
class="logo_acatlan_resp col-8 offset-2 d-flex justify-content-center my-2 align-items-center"
>
<a href="https://www.acatlan.unam.mx/" target="_blank">
<img
class="sizeImg"
src="../assets/FES-editoriales.png"
alt="logo unam"
/>
</a>
</div>
</div>
</template>
<style>
+333
View File
@@ -0,0 +1,333 @@
<template>
<b-modal size="lg" id="modalEditarLibro" hide-footer title="Editar Libro">
<b-container fluid v-if="!loading">
<b-row class="mb-2">
<b-col >
<h2 style="text-align:left;"> {{libro.titulo}}</h2>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveIsbn" name="check-button" switch><b>ISBN:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.isbn}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="isbn"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveTitulo" name="check-button" switch><b>Titulo:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.titulo}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="titulo"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveCategoria" name="check-button" switch><b>Categoria:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.categoria}}</label>
</b-col>
<b-col cols="6">
<b-dropdown v-model="categoria" v-bind:text="categoria" block split split-variant="outline-primary" variant="primary" class="m-2">
<b-dropdown-item @click="categoria='Ciencias Socioeconómicas'" >Ciencias Socioeconómicas</b-dropdown-item>
<b-dropdown-item @click="categoria='Diseño y Edificación'" >Diseño y Edificación</b-dropdown-item>
<b-dropdown-item @click="categoria='Enseñanza de Idiomas'" >Enseñanza de Idiomas</b-dropdown-item>
<b-dropdown-item @click="categoria='Estudios de Posgrado'" >Estudios de Posgrado</b-dropdown-item>
<b-dropdown-item @click="categoria='Humanidades'" >Humanidades</b-dropdown-item>
<b-dropdown-item @click="categoria='Matemáticas e Ingenieria'" >Matemáticas e Ingenieria</b-dropdown-item>
<b-dropdown-item @click="categoria='Universidad Abierta y Educación a Distancia'" >Universidad Abierta y Educación a Distancia</b-dropdown-item>
</b-dropdown>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveAutor" name="check-button" switch><b>Autor:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.autor}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="autor"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActivePaginas" name="check-button" switch><b>Numero de paginas:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.paginas}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="paginas"
type="number"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActivePrecio" name="check-button" switch><b>Precio:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.precio}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="precio"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveEdicion" name="check-button" switch><b>Edición:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.impresion}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="edicion"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveVersion" name="check-button" switch><b>Versión:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.version}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="version"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveYear" name="check-button" switch><b>Año de publicación:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2">{{libro.year}}</label>
</b-col>
<b-col cols="6">
<b-form-input
id="inline-form-input-name"
class="mb-2 mr-sm-2 mb-sm-0"
placeholder="Editar"
v-model="year"
type="number"
></b-form-input>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveDescripcion" name="check-button" switch><b>Descrpción:</b></b-form-checkbox>
</b-col>
<b-col>
<label class="mr-sm-2" style="font-size: 12px">{{libro.descripcion}}</label>
</b-col>
<b-col cols="6">
<b-form-textarea
id="textarea"
v-model="descripcion"
placeholder="Editar"
rows="3"
max-rows="6"
></b-form-textarea>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActiveImagen" name="check-button" switch><b>Imagen</b></b-form-checkbox>
</b-col>
<b-col>
</b-col>
<b-col cols="6">
<b-form-file
placeholder="Seleccione la imagen o arrastre..."
accept=".png, .jpg"
id="imagen"
></b-form-file>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<b-form-checkbox v-model="isActivePdf" name="check-button" switch><b>PDF Visualización</b></b-form-checkbox>
</b-col>
<b-col>
</b-col>
<b-col cols="6">
<b-form-file
placeholder="Seleccione el PDF o arrastre..."
id="pdf"
accept=".pdf"
></b-form-file>
</b-col>
</b-row>
<b-row class="mb-2">
<b-col>
<div style="margin-top: 2rem;">
<b-button variant="outline-success" class="float-right" @click="actualizarLibro(libro.idLibro)" style="width: 30%; ">Actualizar</b-button>
<b-button @click="$bvModal.hide('modalEditarLibro')" variant="outline-danger" class="btn float-left" style="width: 30%; ">Cancelar</b-button>
</div>
</b-col>
</b-row>
</b-container>
<b-container v-else>
<div class="text-center">
<b-spinner style="width: 10rem; height: 10rem; margin: 3rem;" variant="primary" label="Text Centered"></b-spinner><br />
<strong><h1 style="margin: 3rem;">Guardando...</h1></strong>
</div>
</b-container>
</b-modal>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
import Swal from 'sweetalert2'
export default {
props: {
libro: Object,
},
data() {
return {
isbn: "",
titulo: "",
categoria:"Categoria",
autor:"",
paginas:"",
impresion:"",
precio:"",
version:"",
descripcion:"",
year:"",
edicion:"",
isActiveIsbn: false,
isActiveTitulo: false,
isActiveCategoria: false,
isActiveAutor: false,
isActivePaginas: false,
isActivePrecio: false,
isActiveVersion: false,
isActiveYear: false,
isActiveDescripcion: false,
isActiveImagen: false,
isActivePdf: false,
isActiveEdicion:false,
loading: false
};
},
methods:{
async actualizarLibro(idLibro){
try{
var formData = new FormData();
if(this.isActiveIsbn) formData.append("isbn", this.isbn);
if(this.isActiveTitulo) formData.append("titulo", this.titulo);
if(this.isActiveCategoria) formData.append("categoria", this.categoria);
if(this.isActiveAutor) formData.append("autor", this.autor);
if(this.isActivePaginas) formData.append("paginas", this.paginas);
if(this.isActiveEdicion) formData.append("edicion", this.impresion);
if(this.isActivePrecio) formData.append("precio", this.precio);
if(this.isActiveVersion) formData.append("version", this.version);
if(this.isActiveDescripcion) formData.append("descripcion", this.descripcion);
if(this.isActiveYear) formData.append("year", this.year);
if(this.isActiveImagen){
var imagen = document.querySelector('#imagen');
if(imagen.files[0].size > 1200000){
Swal.fire(
`EL tamaño de la Imagen es muy grande`,
'Por favor suba imagenes menores a 1MG',
'warning'
)
return;
}
formData.append("imagen", imagen.files[0]);
}
if(this.isActivePdf){
var pdf = document.querySelector('#pdf');
if(pdf.files[0].size > 1200000){
Swal.fire(
`EL tamaño del PDF es muy grande`,
'Por favor suba PDFs menores a 1MG',
'warning'
)
return;
}
formData.append("pdf", pdf.files[0]);
}
if( formData.entries().next().done){
Swal.fire(
'¿Aún no has ningún campo a editar?',
'',
'question'
);
return;
}
formData.append("idLibro", idLibro);
formData.append("type", 'editarLibro');
this.loading = true;
await axios.post( `${config.api}/actualizarLibro`, formData ,{ headers: { 'Content-Type': 'multipart/form-data' } });
this.loading = false;
await Swal.fire(
'Libro actualizado con éxito',
'',
'success'
);
location.reload();
}
catch(error){
console.log(error);
Swal.fire({
icon: 'error',
title: 'El libro no pudo ser actualizado',
text: `Algo salio mal, ${error}`,
});
}
}
}
}
</script>
+343
View File
@@ -0,0 +1,343 @@
<template>
<div class="divMaster doradoUnam row d-flex justify-content-center">
<div class="col-10 offset-1">
<nav class="navbar navbar-expand-sm navbar-dark ">
<button
@click="method()"
class="navbar-toggler col-5"
type="button"
data-toggle="collapse"
data-target="#navbarTogglerDemo02"
aria-controls="navbarTogglerDemo02"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon blanco d-flex"></span>
<!-- <span class="mx-2">Menu</span> -->
</button>
<div class="collapse navbar-collapse " id="navbarTogglerDemo02">
<ul
class="navbar-nav mr-auto w-100 d-flex align-items-center justify-content-between mt-0 mt-lg-0"
>
<li class="nav-item">
<a class="nav-link text-white" @click="inicio()">Inicio</a>
</li>
<li class="nav-item">
<a class="nav-link text-white" @click="presentacion()"
>Presentación</a
>
</li>
<li class="nav-item ">
<div class="dropdown">
<a
class="btn nav-link dropdown-toggle text-white"
role="button"
id="dropdownMenuLink"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
Libros
</a>
<div
class="dropdown-menu azulUnam"
aria-labelledby="navbarDropdown"
>
<a
class="dropdown-item text-white"
@click="tema('Ciencias Socioeconomicas')"
>Ciencias Socioeconómicas</a
>
<div class="dropdown-divider"></div>
<a
class="dropdown-item text-white"
@click="tema('Diseño y Edificacion')"
>Diseño y Edificación</a
>
<div class="dropdown-divider"></div>
<a
class="dropdown-item text-white"
@click="tema('Enseñanza de Idiomas')"
>Enseñanza de Idiomas</a
>
<div class="dropdown-divider"></div>
<a
class="dropdown-item text-white"
@click="tema('Estudios de Posgrado')"
>Estudios de Posgrado</a
>
<div class="dropdown-divider "></div>
<a
class="dropdown-item text-white "
@click="tema('Humanidades')"
>Humanidades</a
>
<div class="dropdown-divider"></div>
<a
class="dropdown-item text-white"
@click="tema('Matematicas e Ingenieria')"
>Matemáticas e Ingenieria</a
>
<div class="dropdown-divider"></div>
<a
class="dropdown-item text-white"
@click="tema('Universidad Abierta y Educación a Distancia')"
>Universidad Abierta y Educación a Distancia</a
>
</div>
</div>
</li>
<!-- <li class="nav-item">
<a class="nav-link text-white" @click="difusion()"
>Difusión Editorial</a
>
</li>-->
</ul>
</div>
<form
id="buscador"
v-if="isExist"
class="form-inline my-0 my-lg-0 buscador col-4 d-flex justify-content-end"
>
<div class="input-group input-group-sm mb-0">
<input
type="text"
class="form-control reIzq "
placeholder="Buscar"
aria-label="Recipient's username"
aria-describedby="basic-addon2"
v-model="nombre"
/>
<div class="input-group-append reDer bg-white dropdown">
<button class="btn my-0" type="submit">
<svg
width="1em"
height="1em"
viewBox="0 0 16 16"
class="bi bi-search blanco"
fill="currentColor"
>
<path
fill-rule="evenodd"
d="M10.442 10.442a1 1 0 0 1 1.415 0l3.85 3.85a1 1 0 0 1-1.414 1.415l-3.85-3.85a1 1 0 0 1 0-1.415z"
/>
<path
fill-rule="evenodd"
d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"
/>
</svg>
</button>
</div>
</div>
<!-- <div>-->
<div v-if="nombre.length > 2" class=" rescont ">
<ul class=" dropdown-menu d-block dropdown-menu-right ">
<li
class=" dropdown-item dropdown-itemBusqueda text-wrap "
v-for="item in buscarLibro"
v-bind:key="item.idLibro"
@click="descripcion(item.idLibro)"
>
{{ item.titulo }}
</li>
</ul>
<!-- <ul class=" dropdown-menu d-block dropdown-menu-right">
<li class="dropdown-item text-wrap">Lorem ipsum dolor sit amet consectetur adipisicing elit.</li>
<li class="dropdown-item dropdown-itemBusqueda text-wrap">Lorem ipsum dolor sit amet consectetur adipisicing elit. Repellat nam molestiae delectus aliquid dignissimos ullam illo provident laborum perspiciatis sapiente. Officiis eveniet animi ad beatae iusto cupiditate earum quo enim?</li>
<li class=" dropdown-item text-wrap">Lorem ipsum dolor sit amet consectetur adipisicing elit. Repellat nam molestiae delectus aliquid dignissimos ullam illo provident laborum perspiciatis sapiente. Officiis eveniet animi ad beatae iusto cupiditate earum quo enim?</li>
<li class=" dropdown-item text-wrap">Lorem ipsum dolor sit amet consectetur adipisicing elit. Repellat nam molestiae delectus aliquid dignissimos ullam illo provident laborum perspiciatis sapiente. Officiis eveniet animi ad beatae iusto cupiditate earum quo enim?</li>
</ul> -->
</div>
</form>
</nav>
</div>
</div>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
export default {
data() {
return {
isExist: true,
libros: [],
nombre: ""
};
},
methods: {
async descripcion(idLibro) {
//console.log(` Este es el id del libro ${idLibro}`);
localStorage.clear();
window.localStorage.setItem("idLibro", idLibro);
this.$router.push("/desc").catch(() => {
location.reload();
});
},
inicio() {
this.$router.push("/").catch(() => {
location.reload();
});
},
difusion() {
this.$router.push("/difusion").catch(() => {
location.reload();
});
},
presentacion() {
this.$router.push("/presentacion").catch(() => {
location.reload();
});
},
async tema(categoria) {
window.localStorage.setItem("categoria", categoria);
this.$router.push("/tema").catch(() => {
location.reload();
});
},
method() {
this.isExist = !this.isExist;
}
},
async created() {
let path = `${config.api}`;
try {
let libros = await axios.get(`${path}/getLibros`);
this.libros = await libros.data.data;
} catch (error) {
console.log(`Error ${error}`);
}
},
computed: {
buscarLibro: function() {
return this.libros.filter(item =>
item.titulo.toLowerCase().includes(this.nombre.toLowerCase())
);
}
}
};
</script>
<style scoped>
* {
margin: 0;
padding: 0;
}
.divMaster {
/* max-width: 1280px; */
height: auto;
margin: 0 auto;
}
nav {
padding: 0.5rem 0;
}
.azulUnam {
background-color: #1e3c70;
}
.doradoUnam {
background-color: #bb8800;
}
.dropdown-item:hover {
background-color: #bb8800;
}
.dropdown-itemBusqueda:hover {
background-color: #1e3c70;
color: white;
}
.nav-link:focus {
background-color: #1e3c70;
border-radius: 1rem;
}
.nav-link:hover {
background-color: #1e3c70;
color: white;
border-radius: 0.2rem;
}
.nav-link {
transition: 0.3s;
font-size: 20px;
}
.dropdown-item {
padding: 0.3rem 1rem;
}
.menuText {
display: none;
}
.reDer {
border-top-right-radius: 20px 20px !important;
border-bottom-right-radius: 20px 20px !important;
}
.reIzq {
border-top-left-radius: 20px 20px !important;
border-bottom-left-radius: 20px 20px !important;
}
/*
.dropdown-menu {
width: 10% !important;
} */
.dropdown {
position: relative;
display: inline-block;
height: auto;
}
.dropdown-content {
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
/* padding: 12px 16px; */
top: 0.8rem;
left: -10rem;
display: block;
}
.rescont {
z-index: 2;
}
.list-group-item {
padding: 12px 16px;
}
.navbar-toggler {
font-size: 1rem;
}
.navbar-dark .navbar-toggler {
border: none;
}
@media (max-width: 450px) {
.menuText,
.buscador {
display: block !important;
}
.dropdown-menu {
width: 80vw !important;
}
}
</style>
+220
View File
@@ -0,0 +1,220 @@
<template>
<div class="divMaster azulUnam row d-flex justify-content-center">
<div class="col-10 offset-1">
<nav class="navbar navbar-expand-sm navbar-dark ">
<button
@click="method()"
class="navbar-toggler col-5"
type="button"
data-toggle="collapse"
data-target="#navbarTogglerDemo03"
aria-controls="navbarTogglerDemo03"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon blanco d-flex"></span>
<!-- <span class="mx-2"> spa</span> -->
</button>
<div class="collapse navbar-collapse " id="navbarTogglerDemo03">
<ul
class="navbar-nav mr-auto w-100 d-flex align-items-center justify-content-between mt-0 mt-lg-0"
>
<li class="nav-item">
<a class="nav-link text-white" @click="comite()"
>Comité Editorial</a
>
</li>
<li class="nav-item">
<a class="nav-link text-white" @click="lineamientos()"
>Política Editorial y Lineamentos</a
>
</li>
<li class="nav-item">
<a class="nav-link text-white" @click="proceso()"
>Proceso Editorial y Organismos</a
>
</li>
<li class="nav-item">
<a class="nav-link text-white" @click="puntos()"
>Puntos de Venta</a
>
</li>
<li class="nav-item">
<a class="nav-link text-white" @click="contacto()">Contáctanos</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
export default {
data() {
return {
isExist: true,
libros: [],
nombre: ""
};
},
methods: {
comite() {
this.$router.push("/comite").catch(() => {
location.reload();
});
},
lineamientos() {
this.$router.push("/lineamientos").catch(() => {
location.reload();
});
},
proceso() {
this.$router.push("/proceso").catch(() => {
location.reload();
});
},
puntos() {
this.$router.push("/puntos").catch(() => {
location.reload();
});
},
contacto() {
this.$router.push("/contacto").catch(() => {
location.reload();
});
},
method() {
this.isExist = !this.isExist;
}
},
async created() {
let path = `${config.api}`;
try {
let libros = await axios.get(`${path}/getLibros`);
this.libros = await libros.data.data;
} catch (error) {
console.log(`Error ${error}`);
}
},
computed: {
buscarLibro: function() {
return this.libros.filter(item =>
item.titulo.toLowerCase().includes(this.nombre.toLowerCase())
);
}
}
};
</script>
<style scoped>
* {
margin: 0;
padding: 0;
}
.divMaster {
/* max-width: 1280px; */
height: auto;
margin: 0 auto;
}
nav {
padding: 0.5rem 0;
}
.azulUnam {
background-color: #1e3c70;
}
.doradoUnam {
background-color: #bb8800;
}
.dropdown-item:hover {
background-color: #1e3c70;
}
.dropdown-itemBusqueda:hover {
background-color: #bb8800;
color: white;
}
.nav-link:focus {
background-color: #bb8800;
border-radius: 1rem;
}
.nav-link:hover {
background-color: #bb8800;
color: white;
border-radius: 0.2rem;
}
.nav-link {
transition: 0.3s;
font-size: 15px;
}
.dropdown-item {
padding: 0.3rem 1rem;
}
.menuText {
display: none;
}
/*
.dropdown-menu {
width: 10% !important;
} */
.dropdown {
position: relative;
display: inline-block;
height: auto;
}
.dropdown-content {
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
/* padding: 12px 16px; */
top: 0.8rem;
left: -10rem;
display: block;
}
.rescont {
z-index: 2;
}
.list-group-item {
padding: 12px 16px;
}
.navbar-toggler {
font-size: 1rem;
}
.navbar-dark .navbar-toggler {
border: none;
}
@media (max-width: 450px) {
.menuText,
.buscador {
display: block !important;
}
.dropdown-menu {
width: 80vw !important;
}
.nav-link {
font-size: 20px;
margin-top: 1rem;
}
}
</style>
+102
View File
@@ -0,0 +1,102 @@
<template>
<div>
<b-nav vertical class="mt-3">
<b-nav-item class="m-2">
<div class="accordion" role="tablist">
<b-card no-body >
<b-card-header header-tag="header" role="tab">
<b-button block squared v-b-toggle.user class="p-1 azulUnam">
<b-icon icon="person-fill" style="margin-bottom: 4px;"></b-icon>
{{user}}
</b-button>
</b-card-header>
<b-collapse id="user" accordion="my-accordion" role="tabpanel">
<b-card-body>
<b-button block variant="light" class="p-1 m-0 rojo" @click="cerrarSesion()">Cerrar sesión</b-button>
</b-card-body>
</b-collapse>
</b-card>
</div>
</b-nav-item>
<b-nav-item class="m-2">
<div class="accordion" role="tablist">
<b-card no-body >
<b-card-header header-tag="header" role="tab">
<b-button block squared v-b-toggle.banner @click="$store.commit('cambiarNav','EditarBanner')" class="p-1 azulUnam">Banner principal</b-button>
</b-card-header>
<b-collapse id="banner" accordion="my-accordion" role="tabpanel">
<b-card-body>
</b-card-body>
</b-collapse>
</b-card>
</div>
</b-nav-item>
<b-nav-item class="m-2">
<div class="accordion" role="tablist">
<b-card no-body >
<b-card-header header-tag="header" role="tab">
<b-button block squared v-b-toggle.libros class="p-1 azulUnam">Libros</b-button>
</b-card-header>
<b-collapse id="libros" accordion="my-accordion" role="tabpanel">
<b-card-body>
<b-button block variant="light" class="p-1 m-0" @click="$store.commit('cambiarNav','EditarLibro')">Editar</b-button>
<b-button block variant="light" class="p-1 m-0" @click="$store.commit('cambiarNav','AgregarLibro')">Agregar</b-button>
</b-card-body>
</b-collapse>
</b-card>
</div>
</b-nav-item>
</b-nav>
</div>
</template>
<script>
import Swal from 'sweetalert2'
export default {
props:{
user: String
},
methods:{
cerrarSesion(){
const swalWithBootstrapButtons = Swal.mixin({
customClass: {
confirmButton: 'btn btn-outline-success',
cancelButton: 'btn btn-outline-danger'
},
buttonsStyling: false
})
swalWithBootstrapButtons.fire({
title: '¿Estás seguro de que quieres cerrar la sesión?',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Si, salir',
cancelButtonText: 'No',
reverseButtons: true
}).then(async (result) => {
if (result.isConfirmed) {
localStorage.clear();
this.$router.replace('/login');
}
});
}
}
}
</script>
<style scoped>
* {
margin: 0;
padding: 0;
}
.azulUnam {
background-color: #1e3c70;
}
.rojo:hover{
background-color: #CA230C;
color: white;
}
</style>
-174
View File
@@ -1,174 +0,0 @@
<template>
<nav
class="navbar navbar-expand-md navbar-light "
style="background-color:#BB8800;"
>
<div class="container">
<nav class=" ">
<button
class=" navbar-toggler van text-whitee btn-sm"
type="button"
id="toggle-menu"
data-toggle="collapse"
data-target="#navbarNav"
aria-controls="navbarNav"
aria-expanded="false"
aria-label="Toggle navigation"
v-on:click="toggle()"
>
<span
class=" navbar-toggler-icon x m-1"
style="color:white !important;"
></span>
Menú
</button>
</nav>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav mr-auto mt-0 mt-lg-0">
<li class="nav-item dropdown">
<router-link to="#" class="nav-item nav-link "
><a> Inicio</a></router-link
>
</li>
<li class="nav-item dropdown">
<router-link to="#" class="nav-item nav-link"
><a>Presentacion</a></router-link
>
</li>
<li class="nav-item dropdown">
<router-link to="#" class="nav-item nav-link"
><a>Libros</a></router-link
>
</li>
<li class="nav-item dropdown">
<router-link to="#" class="nav-item nav-link"
><a>Difusión Editorial</a></router-link
>
</li>
</ul>
<form class="form-inline my-0 my-lg-0">
<div class="input-group input-group-sm mb-0">
<input
type="text"
class="form-control reIzq "
placeholder="Buscar"
aria-label="Recipient's username"
aria-describedby="basic-addon2"
/>
<div class="input-group-append reDer bg-white">
<button class="btn my-0" type="submit">
<svg
width="1em"
height="1em"
viewBox="0 0 16 16"
class="bi bi-search"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
d="M10.442 10.442a1 1 0 0 1 1.415 0l3.85 3.85a1 1 0 0 1-1.414 1.415l-3.85-3.85a1 1 0 0 1 0-1.415z"
/>
<path
fill-rule="evenodd"
d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"
/>
</svg>
</button>
</div>
</div>
</form>
</div>
</div>
</nav>
</template>
<script>
export default {
methods: {
toggle: function() {
let element = document.getElementById("navbarNav");
element.classList.toggle("block");
element.classList.add("mystyle");
}
}
};
</script>
<style scoped>
.reDer {
border-top-right-radius: 20px 20px !important;
border-bottom-right-radius: 20px 20px !important;
}
.reIzq {
border-top-left-radius: 20px 20px !important;
border-bottom-left-radius: 20px 20px !important;
}
body {
overflow-x: hidden;
}
.mystyle {
text-align: left;
}
.block {
display: block;
}
a {
max-height: 100%;
}
.menu {
background-color: #bb8800;
}
.menu nav ul {
display: flex;
justify-content: space-between;
margin: 0 0rem;
}
.menu nav ul div {
display: flex;
justify-content: space-between;
}
.menu nav ul li {
list-style: none;
}
.menu nav ul li a {
display: block;
}
a {
color: white;
transition: 0.5s;
padding-left: 0.3rem;
padding-right: 0.3rem;
}
a:hover {
background-color: #1e3c70;
color: white;
}
.active {
background-color: #936900;
}
.van {
display: flex;
align-items: center;
justify-content: center;
}
.x {
color: white;
}
@media (min-width: 768px) {
.van {
display: none;
}
}
</style>
+97
View File
@@ -0,0 +1,97 @@
<template>
<div class="divMaster row ">
<div class="col-10 offset-1 d-flex flex-wrap justify-content-center mb-5">
<div
class="card m-3"
style="width: 12rem;"
v-bind:key="libro.id"
v-for="libro in Libros"
@click="descripcion(libro.id)"
>
<router-link :to="{ path: 'home' }" class="textt">
<img :src="libro.img" class="card-img-top rounded" alt="libro" />
<div class="card-body cd textt">
<p class="card-text textt">
{{ libro.title }}
</p>
</div>
</router-link>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
import config from "../config/config.js";
export default {
data() {
return {
categoria: "",
Libros: []
};
},
methods: {
async descripcion(idLibro) {
localStorage.clear();
window.localStorage.setItem("idLibro", idLibro);
this.$router.push("/desc");
}
},
async created() {
let path = `${config.api}`;
this.categoria = window.localStorage.getItem("categoria");
try {
let similares = await axios.get(
`${config.api}/temaLibro?categoria=${this.categoria}`
);
similares = similares.data.data;
//console.log(` este es el resutlado${similares}`);
for (let i = 0; i < similares.length; i++) {
let config = {
// example url
url: `${path}/libroImagen?idLibro=${similares[i].idLibro}`,
method: "GET",
responseType: "blob"
};
try {
await axios(config).then(response => {
let reader = new FileReader();
reader.readAsDataURL(response.data);
reader.onload = () => {
this.Libros.push({
id: similares[i].idLibro,
title: similares[i].titulo,
img: reader.result
});
//this.Libros[i].img = reader.result;
};
});
} catch (error) {
console.log(`Ocurrio un error con la imagen desc: ${error}`);
}
}
} catch (error) {
console.log(`Ocurrio un error ${error}`);
}
},
beforeCreate() {
if (!window.localStorage.getItem("categoria")) this.$router.push("/");
else this.categoria = window.localStorage.getItem("categoria");
}
};
</script>
<style scoped>
.divMaster {
height: auto;
}
.card {
border: none !important;
border-bottom: 5px solid #1b3d70 !important;
}
a {
text-decoration: none !important;
color: black;
}
</style>
+45
View File
@@ -0,0 +1,45 @@
<template>
<div class="divMaster">
<div class="row">
<div class="col-10 offset-1 bor d-flex justify-content-center">
<div class="bgAzul">
<p class="text-white pTitulo">{{ title }}</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ["title"]
};
</script>
<style>
.bor {
border: none !important;
border-bottom: 5px solid #1b3d70 !important;
}
.bgAzul {
background-color: #1b3d70;
width: 40%;
border-top-right-radius: 20px 20px !important;
border-top-left-radius: 20px 20px !important;
}
.pTitulo {
margin: 0;
font-size: 30px;
}
@media screen and (max-width: 450px) {
.pTitulo {
font-size: 20px;
padding: 0px 3px;
}
.bgAzul {
width: 60%;
}
}
</style>
+14
View File
@@ -0,0 +1,14 @@
const config = {
//ngrok
//api: "https://f8d86328e778.ngrok.io"
//Local
//api: "http://localhost:3000"
//Pruebas
//api: "https://venus.acatlan.unam.mx/portal"
//Produccion
api: "https://venus.acatlan.unam.mx/portal_editorial"
};
module.exports = config;
+38 -21
View File
@@ -1,21 +1,38 @@
import Vue from "vue";
import App from "./App.vue";
import "bootstrap/dist/css/bootstrap.css";
import VueRouter from "vue-router";
import { routes } from "./routes";
Vue.config.productionTip = false
Vue.use(VueRouter);
const router = new VueRouter({
routes
});
new Vue({
el: "#app",
render: h => h(App),
router
});
import Vue from "vue";
import App from "./App.vue";
import "bootstrap";
import "bootstrap/dist/css/bootstrap.min.css";
import { BootstrapVue, IconsPlugin } from 'bootstrap-vue'
import Vuex from 'vuex'
import VueRouter from "vue-router";
import { routes } from "./routes";
Vue.config.productionTip = false;
Vue.use(Vuex)
Vue.use(BootstrapVue);
Vue.use(IconsPlugin);
Vue.use(VueRouter);
const router = new VueRouter({
routes
});
const store = new Vuex.Store({
state: {
selectNav: "EditarLibro",
},
mutations: {
cambiarNav (state, selectNav) {
state.selectNav = selectNav
}
}
})
new Vue({
el: "#app",
render: h => h(App),
router,
store: store,
});
+22 -3
View File
@@ -1,9 +1,28 @@
import home from "./view/home.vue";
import login from "./view/login.vue";
import libroDescripcion from "./view/libroDescripcion.vue";
import difusion from "./view/difusion.vue";
import lineamientos from "./view/lineamiento.vue";
import tema from "./view/tema.vue";
import comite from "./view/comite.vue";
import presentacion from "./view/presentacion.vue";
import proceso from "./view/proceso.vue";
import puntos from "./view/puntos.vue";
import contacto from "./view/contacto.vue";
import panelAdmin from "./view/panelAdmin.vue";
export const routes = [
{ path: "/", component: home, name: "form" },
{ path: "/panelAdmin", component: login, name: "Login" },
{ path: "/desc", component: libroDescripcion, name: "LibroDesc" }
{ path: "/", component: home, name: "/" },
{ path: "/home", component: home, name: "home" },
{ path: "/login", component: login, name: "Login" },
{ path: "/desc", component: libroDescripcion, name: "LibroDesc" },
{ path: "/difusion", component: difusion, name: "difusion" },
{ path: "/lineamientos", component: lineamientos, name: "lineamientos" },
{ path: "/tema", component: tema, name: "tema" },
{ path: "/comite", component: comite, name: "comite" },
{ path: "/presentacion", component: presentacion, name: "presentacion" },
{ path: "/proceso", component: proceso, name: "proceso" },
{ path: "/puntos", component: puntos, name: "puntos" },
{ path: "/contacto", component: contacto, name: "contacto" },
{ path: "/panelAdmin", component: panelAdmin, name: "panelAdmin" }
];
+133
View File
@@ -0,0 +1,133 @@
<template>
<div>
<Header></Header>
<Nav></Nav>
<Nav2 />
<div class="my-4 gente">
<h1 class="text-center">Comité Editorial</h1>
<div class="row">
<div class="col-10 mx-auto">
<p class="text-justify">
En este apartado, se muestran los 17 miembros que componen el Comité
Editorial de la Facultad de Estudios Superiores Acatlán, quienes, en
apego a las normativas institucionales, establecen y regulan los
procedimientos para la recepción, dictamen, selección, edición,
impresión, difusión, promoción, almacenamiento, preservación,
distribución y comercialización de sus publicaciones.
</p>
</div>
</div>
<div>
<p>Dr. Manuel Martínez Justo</p>
<strong> Presidente del Comité Editorial</strong>
</div>
<div>
<p>Mtro. Fernando Martínez Ramírez</p>
<strong> Secretario Ejecutivo del Comité Editorial</strong>
</div>
<div>
<p>Mtra. Nora Goris Mayans</p>
<strong> Secretaria General Académica</strong>
</div>
<div>
<p>Dr. Alejandro Byrd Orozco</p>
<strong>
Secretario de Extensión Universitaria y Vinculación
Institucional</strong
>
</div>
<div>
<p>Mtro. Carlos Nandayapa Hernández</p>
<strong> Secretario de Estudios Profesionales</strong>
</div>
<div>
<p>Dra. Laura Páez Díaz de León</p>
<strong> Secretaria de Posgrado e Investigación</strong>
</div>
<div>
<p>Lic. Verónica Puma Galicia</p>
<strong> Coordinadora del Centro de Enseñanza de Idiomas</strong>
</div>
<div>
<p>Lic. Jorge Reyes Caldera Arroyo</p>
<strong> Jefe de la División de Ciencias Jurídicas</strong>
</div>
<div>
<p>Dra. Claudia Márquez Díaz</p>
<strong> Jefa de la División de Ciencias Socioeconómicas</strong>
</div>
<div>
<p>Mtro. Rubén Juárez Santana</p>
<strong> Jefe de la División de Diseño y Edificación</strong>
</div>
<div>
<p>Mtra. María Luisa Morales Martínez</p>
<strong> Jefa de la División de Humanidades</strong>
</div>
<div>
<p>Act. Luz María Lavín Alanís</p>
<strong> Jefa de la División de Matemáticas e Ingeniería</strong>
</div>
<div>
<p>Lic. Aída Villalobos Sosa</p>
<strong>
Jefa de la División del Sistema Universidad Abierta y Educación a
Distancia</strong
>
</div>
<div>
<p>D.G. Norma Guadalupe Rojas Borja</p>
<strong> Secretaria de Actas</strong>
</div>
<div>
<p>Lic. Yareth Pérez Salgado</p>
<strong>Jefa de la Unidad de la Oficina Jurídica</strong>
</div>
<div>
<p>Lic. Hugo Espinoza Rubio</p>
<strong
>Académico de la Facultad de Filosofía y Letras, UNAM / Miembro
externo
</strong>
</div>
<div>
<p>Dr. Gregorio Hernández Zamora</p>
<strong
>Académico de la Universidad Autónoma Metropolitana / Miembro
externo</strong
>
</div>
</div>
<Footer></Footer>
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Footer from "./../components/footer.vue";
export default {
components: {
Header,
Nav,
Nav2,
Footer
}
};
</script>
<style scoped>
.gente div {
margin: 1rem 0px;
}
p {
margin-bottom: 0px;
}
</style>
+143
View File
@@ -0,0 +1,143 @@
<template>
<div>
<Header></Header>
<Nav></Nav>
<Nav2 />
<div class="row">
<div class="my-5 col-10 offset-1">
<h1 class="mb-4">Contáctanos</h1>
<p class="text-justify">
En caso de tener dudas sobre el catálogo de publicaciones de Ediciones
Acatlán, los distintos puntos de venta, de nuestros procesos de
publicación, o acerca del cuerpo colegiado editorial de la Facultad de
Estudios Superiores Acatlán, favor de llenar los siguientes campos y
te responderemos a la brevedad.
</p>
<form class="my-5">
<div class="form-group row">
<div
class="col-12 col-md-12 col-xl-7 col-lg-7 d-flex flex-column justify-content-around "
>
<div
class="form-group row d-flex justify-content-between align-items-center"
>
<label for="formGroupExampleInput">Nombre</label>
<div class="col-sm-8">
<input
type="text"
class="form-control mb-4"
id="formGroupExampleInput"
v-model="nombre"
/>
</div>
</div>
<div class="form-group row d-flex justify-content-between">
<label for="inputEmail3">Correo electrónico</label>
<div class="col-sm-8">
<input
type="email"
class="form-control"
id="inputEmail3"
v-model="correo"
/>
</div>
</div>
</div>
<div class="col-12 col-md-8 col-lg-8 col-xl-8 mx-auto mt-3">
<div class="form-group">
<label for="comment">Comentario</label>
<textarea
class="form-control"
rows="5"
id="comment"
v-model="mensaje"
></textarea>
</div>
</div>
</div>
</form>
<button
class="btn btn-primary mt-5"
@click="enviar()"
v-show="nombre != '' && correo != '' && mensaje != ''"
>
Enviar
</button>
</div>
</div>
<Footer></Footer>
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Footer from "./../components/footer.vue";
import axios from "axios";
import config from "../config/config.js";
import Swal from "sweetalert2";
export default {
name: "contacto",
components: {
Header,
Nav,
Nav2,
Footer
},
data() {
return {
nombre: "",
correo: "",
mensaje: ""
};
},
methods: {
async enviar() {
if (this.nombre == "") return alert("falta agregar nombre");
if (this.mensaje == "") return alert("falta agregar comentario");
if (this.correo == "") return alert("falta agregar correo");
let arroba = 0;
for (let i = 0; i < this.correo.length; i++) {
if (`${this.correo[i]}` === `@`) arroba = 1;
}
if (!arroba) return alert("El correo no es valido");
await axios
.post(`${config.api}/email`, {
correo: this.correo,
mensaje: this.mensaje,
nombre: this.nombre
})
.then(function() {
Swal.fire({
icon: "success",
title: "Correo enviado correctamente",
timer: 2000
});
//console.log(response);
})
.catch(function(error) {
Swal.fire({
icon: "error",
title: "Oops...",
text: "hubo un error. Intentalo más tarde "
});
console.log(error);
});
}
}
};
</script>
<style></style>
+100
View File
@@ -0,0 +1,100 @@
<template>
<div>
<Header />
<Nav />
<Nav2 />
<!-- <div class="row">
<div class="col-10 offset-1"> -->
<Title title="Conoce más" class="mt-5" />
<!-- </div>
</div> -->
<div class="container">
<div class="row my-5" v-bind:key="de.id" v-for="de in des">
<div class="titulo col-12 mb-5">
<h1>{{ de.titulo }}</h1>
</div>
<div class="libro col-10 col-sm-5 col-md-5 col-lg-5 col-xl-5 offset-1">
<img
:src="de.img"
class=" figure-img img-fluid rounded"
alt="libro"
/>
</div>
<div
class="texto col-10 col-sm-5 col-md-5 col-lg-5 col-xl-5 d-flex align-items-center justify-content-center flex-column"
>
<h4>Descripción:</h4>
<p class="scroll">
{{ de.descrip }}
</p>
</div>
<div class="video col-12 d-flex my-4 justify-content-center">
<iframe
width="560"
height="315"
:src="de.video"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
></iframe>
</div>
</div>
</div>
<Footer />
</div>
</template>
<script>
import Header from "../components/header.vue";
import Nav from "../components/nav.vue";
import Nav2 from "../components/nav2.vue";
import Footer from "../components/footer.vue";
import Title from "../components/titulo.vue";
export default {
components: {
Header,
Nav,
Nav2,
Footer,
Title
},
data() {
return {
des: [
{
id: 0,
titulo: "Algebra lineal productos internos y teoremas de estructura",
img:
"https://edit.org/img/blog/xwdn-editar-portadas-de-libros-gratis.jpg.pagespeed.ic.PmNhyGc59r.jpg",
descrip: ` Los símbolos se encuentran relacionados a través de signos que
indican las operaciones que se necesitan efectuar, bien sea
multiplicación, suma, resta, entre otros, con el objetivo de
conseguir el resultado de las variables. En este sentido, los
términos se distinguen o separan por medio de signos, y en el caso
de estar separadas por el signo de igualdad se llama ecuación.`,
video: "https://www.youtube.com/embed/CHR9xhkv8u8"
}
]
};
}
};
</script>
<style>
.imgLibro {
height: 600px;
}
.scroll {
width: 100%;
height: 60%;
overflow: auto;
}
@media (max-width: 400px) {
.scroll {
height: 90%;
}
}
</style>
+15 -4
View File
@@ -2,22 +2,33 @@
<div>
<Header />
<Nav />
<Nav2 />
<Carr />
<Title title="Recientes" />
<Cart />
<Footer />
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/navPrincipal.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Footer from "./../components/footer.vue";
import Carr from "../components/carrusel.vue";
import Cart from "../components/cartLibro.vue";
import Title from "../components/titulo.vue";
export default {
name: "App",
name: "home",
components: {
Header,
Nav,
Footer
Nav2,
Footer,
Carr,
Cart,
Title
}
};
</script>
+6 -3
View File
@@ -2,16 +2,18 @@
<div>
<Header />
<Nav />
<p>descripcion</p>
<Nav2 />
<Descrip />
<Footer />
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/navPrincipal.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Descrip from "./../components/descripcion.vue";
import Footer from "./../components/footer.vue";
@@ -20,6 +22,7 @@ export default {
components: {
Header,
Nav,
Nav2,
Descrip,
Footer
}
File diff suppressed because it is too large Load Diff
+78
View File
@@ -0,0 +1,78 @@
<template>
<div>
<Header />
<h1 class="my-5">Inicia Sesión</h1>
<div class="row d-flex justify-content-center">
<div class="col-12 col-md-8 col-lg-6 col-xl-6">
<form class="row d-flex justify-content-center">
<input
type="text"
v-model="email"
class="form-control col-8"
name="login"
placeholder="Usuario"
/>
<input
type="password"
v-model="password"
class="form-control col-8 my-3"
name="login"
placeholder="Contraseña"
/>
<input
type="button"
@click="login"
class="btn bg-primary text-white col-5"
value="Ingresar"
/>
</form>
</div>
</div>
</div>
</template>
<script>
import Header from "./../components/header.vue";
import axios from "axios";
import config from "../config/config.js";
import Swal from 'sweetalert2'
export default {
data() {
return {
email: "",
password: ""
};
},
methods: {
login() {
const datos = {
usuario: this.email,
password: this.password
}
axios.post( `${config.api}/loginAdmin`, datos ).then(async response =>{
localStorage.setItem('tokenPortal', response.data.token);
await Swal.fire(
'Bienvenido',
'',
'success'
);
this.$router.replace('/panelAdmin');
}).catch(() =>{
Swal.fire({
icon: 'error',
title: 'El usuario o la contraseña es incorrecta',
text: `Intentalo de nuevo.`,
});
});
}
},
components: {
Header
},
};
</script>
<style></style>
+82
View File
@@ -0,0 +1,82 @@
<template>
<div>
<Header />
<b-row>
<b-col cols="2" style="background-color: #bb8800;" class="p-0 m-0">
<div class="p-0 m-0">
<NavAdmin v-bind:user="usuario"/>
</div>
</b-col>
<b-col cols="10">
<b-row v-if="this.$store.state.selectNav=='EditarBanner'">
<EditarBanner />
</b-row>
<b-row v-if="this.$store.state.selectNav=='EditarLibro'">
<EditarLibro />
</b-row>
<b-row v-if="this.$store.state.selectNav=='AgregarLibro'">
<AgregarLibro />
</b-row>
</b-col>
</b-row>
<Footer />
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Footer from "./../components/footer.vue";
import EditarLibro from './../components/editarLibro.vue';
import EditarBanner from './../components/editarBanner.vue';
import AgregarLibro from './../components/agregarLibro.vue';
import NavAdmin from './../components/navAdmin.vue';
import axios from "axios";
import config from "../config/config.js";
import Swal from 'sweetalert2'
export default {
name: "panelAdmin",
components: {
Header,
Footer,
EditarLibro,
NavAdmin,
EditarBanner,
AgregarLibro
},
data() {
return {
usuario: ""
};
},
beforeCreate(){
let token = localStorage.getItem('tokenPortal');
console.log(token);
if(token === null) this.$router.replace('/login');
axios.post( `${config.api}/checkToken`, {token: token}, {
headers: {
authorization: 'Bearer ' + token,
}}).then(async response =>{
console.log('lo que responde', response.data.datos.user.user);
this.usuario = response.data.datos.user.user;
}).catch(async (error) =>{
console.log(error);
await Swal.fire({
icon: 'error',
title: 'La sesión ha expirado',
text: `Ingrese de nuevo.`,
});
this.$router.replace('/login')
});
}
};
</script>
<style scoped>
.divMaster {
height: auto;
}
</style>
+126
View File
@@ -0,0 +1,126 @@
<template>
<div>
<Header></Header>
<Nav></Nav>
<Nav2 />
<div>
<h1 class="my-4">Presentación</h1>
<div class="row presentacion">
<div class="col-10 offset-1 text-justify mb-5">
<p>
Bienvenido/a al Portal Editorial de la Facultad de Estudios
Superiores Acatlán, el sitio en línea que presenta todo tópico
relacionado con la publicación y difusión de los materiales del
sello Ediciones Acatlán.
</p>
<p>
Desarrollada por la Unidad del Centro de Desarrollo Tecnológico y la
Unidad de Servicios Editoriales, ambas pertenecientes a la
Coordinación de Servicios Académicos, esta plataforma fue creada
para dar a conocer el catálogo de publicaciones emanadas de esta
entidad multidisciplinaria.
</p>
<p>
Actualmente, En atención al Programa Estratégico 3. Facultad del
Siglo XXI, del Plan de Desarrollo Institucional 2017-2021 de la
Facultad de Estudios Superiores Acatlán, en el cual, mediante la
línea de acción 3.2. Modernización de la gestión, se establece la
actualización del portal editorial de la Facultad, la Coordinación
de Servicios Académicos, a través de las áreas ya enunciadas, tiene
en desarrollo dos proyectos: la Tienda Virtual Acatlán y el Portal
Editorial de Ediciones Acatlán.
</p>
<p>
El primero de los proyectos, la Tienda Virtual Acatlán, es la
plataforma destinada a la venta de las publicaciones de Ediciones
Acatlán, habilitada desde el mes de marzo del presente año (véase
Puntos de Venta).
</p>
<p>
El segundo de ellos, el Portal Editorial, tiene el objetivo de
difundir toda aquella información relacionada con los procesos y
cuerpos colegiados en materia editorial, establecer vínculos con la
comunidad universitaria interesada en la publicación de materiales y
en la promoción de la labor intelectual de los académicos de la
Facultad de Estudios Superiores Acatlán.
</p>
<p>
En ese sentido, quien navegue en esta plataforma podrá conocer el
catálogo de publicaciones emanadas de la labor académica e
intelectual de la planta docente de esta entidad multidisciplinaria.
De igual manera, tendrá a su disposición los lineamientos
editoriales y la información concerniente al proceso de publicación
así como las distintas partes institucionales involucradas. Por otra
parte, en caso de desear adquirir alguno de los títulos que ofrece
el sello editorial de Acatlán, están disponibles los datos de la
Tienda Virtual Acatlán y la Librería Universitaria, para compra de
libros en línea o de manera presencial, respectivamente.
</p>
<p>
De manera complementaria, la publicación, difusión, distribución y
venta de nuestros libros se hacen mediante diversas estrategias que
buscan involucrar a otras instancias universitarias e, incluso, a
editoras externas a la Universidad:
</p>
<ul>
<li>
Puntos de venta: Se pueden adquirir títulos de Ediciones Acatlán
de forma presencial y en línea. Para conocer más, favor de
dirigirse al apartado «Puntos de Venta»
</li>
<li>
Presencia de eventos culturales: En aras de compartir las
novedades editoriales de nuestra entidad, se ha buscado tener
presencia en eventos nacionales que promuevan la lectura y la
cultura del libro. Tal es el caso de la Feria Internacional del
Libro del Palacio de Minería.
</li>
<li>
Coediciones: En el caso de que una editorial universitaria o de
otro ámbito desee publicar con la FES Acatlán, bajo el seguimiento
de las instancias correspondientes, se puede gestionar la firma de
un contrato de coedición, mediante el cual se acordarían cómo
apoyaría en la edición y distribución cada una de las entidades
involucradas.
</li>
<li>
Venta interinstitucional: Por medio de la firma de una Bases de
Colaboración Interinstitucional, la FES Acatlán puede colocar a la
venta su producción editorial en otras instancias de la UNAM, y
viceversa.
</li>
</ul>
<p>
De tener alguno duda sobre lo anterior, favor de dirigirse al
apartado de Contacto.
</p>
</div>
</div>
</div>
<Footer></Footer>
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Footer from "./../components/footer.vue";
export default {
components: {
Header,
Nav,
Nav2,
Footer
}
};
</script>
<style scoped></style>
+1052
View File
File diff suppressed because it is too large Load Diff
+151
View File
@@ -0,0 +1,151 @@
<template>
<div>
<Header></Header>
<Nav></Nav>
<Nav2 />
<div>
<div class="row">
<div class="col-10 offset-1 mb-5">
<h1 class="my-4">Puntos de Venta</h1>
<p class="mb-4">
La venta y difusión de las publicaciones de Ediciones Acatlán se
llevan a cabo a partir de cuatro maneras. En caso de que desee
adquirir alguna de las publicaciones emanadas de esta entidad
multidisciplinaria, podría hacer a través de los puntos que se
enlistan continuación:
</p>
</div>
</div>
<Title title="Compra presencial" />
<div class=" row marcos">
<div class="col-12 offset-0 mb-5 d-flex">
<div
class="col-12 offset-0 d-flex flex-wrap justify-content-center align-items-center px-0"
>
<Enlace
class="enlaces w-auto my-3"
v-for="link in Links"
:key="link.id"
v-show="link.mode == 'presencial'"
:linkW="link.linkW"
:linkD="link.linkD"
:img="link.img"
:text="link.text"
:title="link.title"
/>
</div>
</div>
</div>
<Title title="Compra en Línea" />
<div class=" row marcos">
<div class="col-12 offset-0 mb-5 d-flex">
<div
class="col-12 offset-0 d-flex flex-wrap justify-content-center align-items-center px-0"
>
<Enlace
class="enlaces w-auto my-3"
v-for="link in Links"
:key="link.id"
v-show="link.mode == 'linea'"
:linkW="link.linkW"
:linkD="link.linkD"
:img="link.img"
:text="link.text"
:title="link.title"
/>
</div>
</div>
</div>
</div>
<Footer></Footer>
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Footer from "./../components/footer.vue";
import Enlace from "./../components/enlace.vue";
import Title from "../components/titulo.vue";
export default {
components: {
Header,
Nav,
Nav2,
Footer,
Enlace,
Title
},
data() {
return {
Links: [
{
id: 0,
title: "Librería Universitaria",
text:
"Ubicada en las instalaciones de la FES Acatlán, para la adquisición de publicaciones impresas, tanto de nuestro sello como de otras editoriales.",
img: "assets/puntos/LIBRERÍA-ACATLÁN.png",
linkW: "",
linkD: "",
mode: "presencial"
},
{
id: 1,
title: "Tienda Virtual Acatlán",
text:
"Plataforma que soporta ventas en línea (obras impresas), de reciente habilitación.",
img: "assets/puntos/logotienda.png",
linkW: "https://tienda.acatlan.unam.mx/",
linkD: "",
mode: "linea"
},
{
id: 2,
title: "Librería Ambulante",
text:
"Extensión de la Librería Universitaria que, de manera presencial, acude a los eventos institucionales con publicaciones de temas afines a éstos.",
img: "assets/puntos/LIBRERÍA-ACATLÁN-ambulante.png",
linkW: "",
linkD: "",
mode: "presencial"
},
{
id: 3,
title: "Libros UNAM",
text:
"Plataforma en línea de la Universidad Nacional Autónoma de México, mediante la cual se pueden adquirir todas las publicaciones (impresas y electrónicas) de todas las dependencias editoras.",
img: "assets/puntos/libros-unam.png",
linkW: "http://www.libros.unam.mx/",
linkD: "",
mode: "linea"
}
]
};
}
};
</script>
<style scoped>
.lugares li {
margin: 1rem 0;
}
.marcos div p {
text-align: left;
}
.marcos div a {
text-decoration: none;
text-align: left;
margin: 0.5rem 0;
}
.marcos div {
display: flex;
flex-direction: column;
}
</style>
+31
View File
@@ -0,0 +1,31 @@
<template>
<div>
<Header />
<Nav />
<Nav2 />
<Title title="Resultado" class="my-5" />
<Cart />
<Footer />
</div>
</template>
<script>
import Header from "./../components/header.vue";
import Nav from "./../components/nav.vue";
import Nav2 from "./../components/nav2.vue";
import Footer from "./../components/footer.vue";
import Cart from "../components/temaLibro.vue";
import Title from "../components/titulo.vue";
export default {
name: "home",
components: {
Header,
Nav,
Nav2,
Footer,
Cart,
Title
}
};
</script>
+3
View File
@@ -0,0 +1,3 @@
module.exports = {
publicPath: "./"
};