Iniciado el desarrollo del CRUD de los recursos.
This commit is contained in:
parent
110819d8a3
commit
0d34789308
3
app.ts
3
app.ts
@ -1,7 +1,10 @@
|
|||||||
let express = require('express');
|
let express = require('express');
|
||||||
let app = express();
|
let app = express();
|
||||||
|
|
||||||
|
|
||||||
app.use(express.static('dist'));
|
app.use(express.static('dist'));
|
||||||
|
// @ts-ignore
|
||||||
|
app.use(history());
|
||||||
|
|
||||||
app.use(express.urlencoded());
|
app.use(express.urlencoded());
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
3
package-lock.json
generated
3
package-lock.json
generated
@ -1772,8 +1772,7 @@
|
|||||||
"connect-history-api-fallback": {
|
"connect-history-api-fallback": {
|
||||||
"version": "1.5.0",
|
"version": "1.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
|
||||||
"integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
|
"integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"console-browserify": {
|
"console-browserify": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/express": "^4.16.0",
|
"@types/express": "^4.16.0",
|
||||||
"@types/node": "^10.12.5",
|
"@types/node": "^10.12.5",
|
||||||
|
"connect-history-api-fallback": "^1.5.0",
|
||||||
"express": "^4.16.4",
|
"express": "^4.16.4",
|
||||||
"mysql": "^2.16.0",
|
"mysql": "^2.16.0",
|
||||||
"vue": "^2.5.17",
|
"vue": "^2.5.17",
|
||||||
|
@ -9,7 +9,11 @@
|
|||||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||||
<link href="https://fonts.googleapis.com/css?family=Muli|Open+Sans" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css?family=Muli|Open+Sans" rel="stylesheet">
|
||||||
|
|
||||||
<title>PseudoSubs - Anime 100% libre de publicidad</title>
|
<title>PseudoSubs - Anime de temporada sin distracciones, HD, Full HD, 24 y 60 fps.</title>
|
||||||
|
<meta name="description" content="Ver anime de temporada nunca fue tan facil. Descarga en 1 click, 0 anuncios,
|
||||||
|
0 acortadores, 0 ventanas emergentes. La mejor calidad.">
|
||||||
|
<meta name="keywords" content="Anime, HD, Full HD, gratis, MEGA, Directo, 60fps">
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>
|
<noscript>
|
||||||
|
4
public/robots.txt
Normal file
4
public/robots.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow: /srv/
|
||||||
|
|
||||||
|
https://pseudosubs.appspot.com/index.html
|
86
src/components/Administracion/crear-anime.vue
Normal file
86
src/components/Administracion/crear-anime.vue
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
<template>
|
||||||
|
<div >
|
||||||
|
<br>
|
||||||
|
Este es un proceso largo y doloroso, pero necesario. <br>
|
||||||
|
<br>
|
||||||
|
<form id="animeNuevo" @submit.prevent="crearAnime" class="form-crear">
|
||||||
|
<span>Nombre: </span><input type="text" placeholder="nombre" required name="nombre"><br>
|
||||||
|
<span>Link: </span><input type="text" placeholder="/Anime/?" required name="link"><br>
|
||||||
|
<span>URL de imagen: </span><input type="text" placeholder="URL" required name="imgUrl"><br>
|
||||||
|
<span>Descripcion</span><br>
|
||||||
|
<textarea placeholder="Descripcion." class="materialize-textarea" required name="descripcion"></textarea><br>
|
||||||
|
<span>Estudio: </span><input type="text" placeholder="Estudio" required name="estudio"><br>
|
||||||
|
<span>Num de episodios: </span><input type="number" placeholder="Num de episodios" required name="eps"><br>
|
||||||
|
<span>Fecha de emisión: </span><input type="text" placeholder="Emision" required name="alAire"><br>
|
||||||
|
<span>Temporada: </span>
|
||||||
|
<select class="browser-default" style="width: auto; display: inline-block" required name="temporada">
|
||||||
|
<option value="Invierno">Invierno</option>
|
||||||
|
<option value="Otono">Otoño</option>
|
||||||
|
<option value="Verano">Verano</option>
|
||||||
|
<option value="Primavera">Primavera</option>
|
||||||
|
</select>
|
||||||
|
<br>
|
||||||
|
<span>Año: </span><input type="number" min="2015" max="2025" placeholder="Año" required name="anio"><br>
|
||||||
|
<span>Fuente: </span><input type="text" placeholder="fuente" required name="fuente"><br>
|
||||||
|
<span>Generos: </span><input type="text" placeholder="Generos" required name="generos"><br>
|
||||||
|
<span>Color: </span><input type="text" placeholder="color" required name="color"><br>
|
||||||
|
<br>
|
||||||
|
<input type="submit" value="Crear">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const YAML = require('yaml');
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "crear-anime",
|
||||||
|
props: {
|
||||||
|
render: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
crearAnime () {
|
||||||
|
const form = document.getElementById("animeNuevo");
|
||||||
|
const respuesta = {
|
||||||
|
titulo: form["nombre"].value,
|
||||||
|
link: form["link"].value,
|
||||||
|
imgUrl: form["imgUrl"].value,
|
||||||
|
descripcion: form["descripcion"].value,
|
||||||
|
estudio: form["estudio"].value,
|
||||||
|
eps: form["eps"].value,
|
||||||
|
alAire: form["alAire"].value,
|
||||||
|
temporada: form["temporada"].value,
|
||||||
|
anio: form["anio"].value,
|
||||||
|
fuente: form["fuente"].value,
|
||||||
|
generos: form["generos"].value,
|
||||||
|
color: form["color"].value
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log("El objeto a enviar es:\n", YAML.stringify(respuesta));
|
||||||
|
console.log("Y en JSON:\n", JSON.stringify(respuesta));
|
||||||
|
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("PUT","/a/");
|
||||||
|
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
|
||||||
|
xhr.onload = () => {
|
||||||
|
console.log("El servidor respondió:\n" + xhr.responseText);
|
||||||
|
};
|
||||||
|
xhr.send(`data=${YAML.stringify(respuesta)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="sass">
|
||||||
|
.form-crear
|
||||||
|
span
|
||||||
|
display: inline-block
|
||||||
|
min-width: 200px
|
||||||
|
input
|
||||||
|
min-width: 300px
|
||||||
|
width: auto
|
||||||
|
|
||||||
|
</style>
|
20
src/components/Administracion/lista-animes.vue
Normal file
20
src/components/Administracion/lista-animes.vue
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div v-for="anime in listaAnimes">
|
||||||
|
lol?
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "lista-animes",
|
||||||
|
props: {
|
||||||
|
listaAnimes: Object
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
@ -24,6 +24,11 @@ const rutas = {
|
|||||||
path: '/Anime/:anio/:temp/:anime',
|
path: '/Anime/:anio/:temp/:anime',
|
||||||
name: 'AnimeView',
|
name: 'AnimeView',
|
||||||
component: AnimeView
|
component: AnimeView
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/a/',
|
||||||
|
name: 'Administracion',
|
||||||
|
component: () => import('./views/Administracion.vue')
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
scrollBehavior (to: any, from: any, savedPosition: any) {
|
scrollBehavior (to: any, from: any, savedPosition: any) {
|
||||||
|
71
src/views/Administracion.vue
Normal file
71
src/views/Administracion.vue
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<template>
|
||||||
|
<div class="container">
|
||||||
|
<div class="caja">
|
||||||
|
Administracion. <br>
|
||||||
|
No voy a hacer muchas cosas por ahora porque esto es para mi :p <br>
|
||||||
|
<br>
|
||||||
|
<button class="btn" @click="verTodosLosAnimes">
|
||||||
|
Ver todos los animes
|
||||||
|
</button>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<form @submit.prevent>
|
||||||
|
Nombre del Anime:
|
||||||
|
<input type="text" placeholder="Nombre del anime">
|
||||||
|
<button class="btn">
|
||||||
|
Buscar
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<lista-animes :lista-animes="listaAnimes" />
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<button class="btn" @click="mostrarCrearAnime">Crear un anime</button>
|
||||||
|
<br>
|
||||||
|
<crear-anime :render="crearAnime" />
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import ListaAnimes from "../components/Administracion/lista-animes";
|
||||||
|
import CrearAnime from "../components/Administracion/crear-anime";
|
||||||
|
export default {
|
||||||
|
name: "Administracion",
|
||||||
|
components: {CrearAnime, ListaAnimes},
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
listaAnimes: {},
|
||||||
|
crearAnime: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
verTodosLosAnimes () {
|
||||||
|
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.open("GET", "/a/");
|
||||||
|
xhr.onload = () => {
|
||||||
|
console.log(xhr.responseText);
|
||||||
|
};
|
||||||
|
xhr.send();
|
||||||
|
},
|
||||||
|
mostrarCrearAnime () {
|
||||||
|
this.crearAnime = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="sass">
|
||||||
|
|
||||||
|
</style>
|
39
srv/Admin/crearAnime.ts
Normal file
39
srv/Admin/crearAnime.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
const crearAnime = (req: any, res: any) => {
|
||||||
|
|
||||||
|
const con = require('../mysql').obtenerConexionMySql();
|
||||||
|
const YAML = require('yaml');
|
||||||
|
|
||||||
|
if (req.body.data) {
|
||||||
|
|
||||||
|
const data = YAML.parse(req.body.data);
|
||||||
|
con.connect((err: any) => {
|
||||||
|
if (!err) {
|
||||||
|
|
||||||
|
con.query(
|
||||||
|
`INSERT INTO animes
|
||||||
|
(titulo, link, imgUrl, descripcion, estudio, eps, alAire, temporada, anio, fuente, generos, color)
|
||||||
|
VALUES ('${data.titulo}', '${data.link}', '${data.imgUrl}', '${data.descripcion}',
|
||||||
|
'${data.estudio}', ${data.eps}, '${data.alAire}', '${data.temporada}', '${data.anio}',
|
||||||
|
'${data.fuente}', '${data.generos}', '${data.color}')`,
|
||||||
|
(err: any, respuesta: any) => {
|
||||||
|
if (!err) {
|
||||||
|
res.send("Exito");
|
||||||
|
} else {
|
||||||
|
res.send("Fracaso :c\n" + err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
res.send("Error al conectarse...\n" + err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
res.send("Error. El servidor no recibio ningun dato.");
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.crearAnime = crearAnime;
|
31
srv/Admin/obtenerTodosAnimes.ts
Normal file
31
srv/Admin/obtenerTodosAnimes.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
const obtenerTodosAnimes = (req: any, res: any) => {
|
||||||
|
|
||||||
|
const con = require('../mysql').obtenerConexionMySql();
|
||||||
|
const YAML = require('yaml');
|
||||||
|
|
||||||
|
con.connect((err: any) => {
|
||||||
|
if (!err) {
|
||||||
|
|
||||||
|
con.query(
|
||||||
|
`SELECT anime_ID ,titulo FROM animes`,
|
||||||
|
(err: any, respuesta: any) => {
|
||||||
|
if (!err) {
|
||||||
|
|
||||||
|
const resultado = YAML.stringify(respuesta);
|
||||||
|
console.log("El resultado en YAML es:\n" + resultado);
|
||||||
|
res.send(resultado);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.obtenerTodosAnimes = obtenerTodosAnimes;
|
@ -18,4 +18,7 @@ export default (app:any) => {
|
|||||||
app.post('/links', require('./LinksAnimes/obtenerLinks').obtenerLinks);
|
app.post('/links', require('./LinksAnimes/obtenerLinks').obtenerLinks);
|
||||||
app.put('/links', require('./LinksAnimes/modificarLink').modificarLinks);
|
app.put('/links', require('./LinksAnimes/modificarLink').modificarLinks);
|
||||||
|
|
||||||
|
app.put('/a/', require('./Admin/crearAnime').crearAnime);
|
||||||
|
app.get('/a/', require('./Admin/obtenerTodosAnimes').obtenerTodosAnimes);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
44
srv/modeloAnime.yaml
Normal file
44
srv/modeloAnime.yaml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
- titulo: nombre
|
||||||
|
link: '/Anime/aot'
|
||||||
|
imgUrl: 'https://taoenaoe'
|
||||||
|
descripcion: aoeaoeaoeuaui
|
||||||
|
estudio: aoteao
|
||||||
|
eps: 13 # numero de eps
|
||||||
|
alAire: 13 de Febrero al 85 de Octubre
|
||||||
|
temporada: aonerao
|
||||||
|
anio: 2020
|
||||||
|
fuente: original
|
||||||
|
generos: Accion, Magia
|
||||||
|
color: black
|
||||||
|
OP:
|
||||||
|
1:
|
||||||
|
nombre: Oonono
|
||||||
|
artista: aoetnaore
|
||||||
|
episodios: 1 al 13
|
||||||
|
2:
|
||||||
|
nombre: trnaontaoe
|
||||||
|
artista: oaeao
|
||||||
|
episodios: 14 al 23
|
||||||
|
ED:
|
||||||
|
1:
|
||||||
|
nombre: aaoeaoe
|
||||||
|
artista: aoena
|
||||||
|
episodios: 2 al 13
|
||||||
|
links:
|
||||||
|
aviso: ooo654
|
||||||
|
sigEp: 2
|
||||||
|
opciones:
|
||||||
|
1:
|
||||||
|
formato: ae # ligero | MP4 | MKV
|
||||||
|
res: aoeao # 60fps | 720p | 1080p | 720p @ 60fps | 1080p @60fps
|
||||||
|
servidor: MEGA
|
||||||
|
color: red
|
||||||
|
eps:
|
||||||
|
1:
|
||||||
|
- 0 # num de clicks
|
||||||
|
- 115 MB # peso
|
||||||
|
- 'https://anoetraoe' # link
|
||||||
|
2:
|
||||||
|
- 0
|
||||||
|
- 335 MB
|
||||||
|
- 'https://onateaoe'
|
@ -3,7 +3,7 @@ const obtenerConexionMySql = () => {
|
|||||||
const mysql = require('mysql');
|
const mysql = require('mysql');
|
||||||
const SQL_CONNECT_DATA:object = {
|
const SQL_CONNECT_DATA:object = {
|
||||||
// Solo para produccion habilitar socketPath
|
// Solo para produccion habilitar socketPath
|
||||||
socketPath: '/cloudsql/pseudosubs:us-central1:base-principal',
|
// socketPath: '/cloudsql/pseudosubs:us-central1:base-principal',
|
||||||
user: 'root',
|
user: 'root',
|
||||||
password: 'GgwTo5GryvDhAr06wk5opKhd',
|
password: 'GgwTo5GryvDhAr06wk5opKhd',
|
||||||
database: 'animes_links',
|
database: 'animes_links',
|
||||||
|
74
srv/tablas.sql
Normal file
74
srv/tablas.sql
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
-- Tabla Animes
|
||||||
|
|
||||||
|
CREATE TABLE animes (
|
||||||
|
anime_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
titulo VARCHAR(100),
|
||||||
|
link VARCHAR(50),
|
||||||
|
imgUrl VARCHAR(100),
|
||||||
|
descripcion TEXT,
|
||||||
|
estudio VARCHAR(50),
|
||||||
|
eps INT,
|
||||||
|
alAire VARCHAR(100),
|
||||||
|
temporada VARCHAR(25),
|
||||||
|
anio VARCHAR(4),
|
||||||
|
fuente VARCHAR(20),
|
||||||
|
generos VARCHAR(100),
|
||||||
|
color VARCHAR(20)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Tabla que registra cuales animes estan en el menu principal
|
||||||
|
|
||||||
|
CREATE TABLE enPagPrin (
|
||||||
|
pagPrin_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
posicion INT,
|
||||||
|
anime_ID INT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Tabla OP
|
||||||
|
|
||||||
|
CREATE TABLE OP (
|
||||||
|
OP_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
anime_ID INT,
|
||||||
|
num_OP INT,
|
||||||
|
nombre VARCHAR(100),
|
||||||
|
artista VARCHAR(100),
|
||||||
|
eps VARCHAR(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Tabla ED
|
||||||
|
|
||||||
|
CREATE TABLE ED (
|
||||||
|
ED_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
anime_ID INT,
|
||||||
|
num_ED INT,
|
||||||
|
nombre VARCHAR(100),
|
||||||
|
artista VARCHAR(100),
|
||||||
|
eps VARCHAR(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Tabla con los links (y sus tablas complementarias)
|
||||||
|
|
||||||
|
CREATE TABLE links (
|
||||||
|
links_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
anime_ID INT,
|
||||||
|
aviso TINYTEXT,
|
||||||
|
sigEp VARCHAR(5)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE links_opciones (
|
||||||
|
opcion_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
links_ID INT,
|
||||||
|
num_opcion INT,
|
||||||
|
formato VARCHAR(20),
|
||||||
|
res VARCHAR(20),
|
||||||
|
servidor VARCHAR(20),
|
||||||
|
color VARCHAR(20)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE eps (
|
||||||
|
ep_ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
opcion_ID INT,
|
||||||
|
num_ep INT,
|
||||||
|
visitas INT DEFAULT 0,
|
||||||
|
link TINYTEXT
|
||||||
|
);
|
Loading…
Reference in New Issue
Block a user