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 app = express();
|
||||
|
||||
|
||||
app.use(express.static('dist'));
|
||||
// @ts-ignore
|
||||
app.use(history());
|
||||
|
||||
app.use(express.urlencoded());
|
||||
app.use(express.json());
|
||||
|
3
package-lock.json
generated
3
package-lock.json
generated
@ -1772,8 +1772,7 @@
|
||||
"connect-history-api-fallback": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
|
||||
"integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
|
||||
"dev": true
|
||||
"integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo="
|
||||
},
|
||||
"console-browserify": {
|
||||
"version": "1.1.0",
|
||||
|
@ -12,6 +12,7 @@
|
||||
"dependencies": {
|
||||
"@types/express": "^4.16.0",
|
||||
"@types/node": "^10.12.5",
|
||||
"connect-history-api-fallback": "^1.5.0",
|
||||
"express": "^4.16.4",
|
||||
"mysql": "^2.16.0",
|
||||
"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/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>
|
||||
<body>
|
||||
<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',
|
||||
name: 'AnimeView',
|
||||
component: AnimeView
|
||||
},
|
||||
{
|
||||
path: '/a/',
|
||||
name: 'Administracion',
|
||||
component: () => import('./views/Administracion.vue')
|
||||
}
|
||||
],
|
||||
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.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 SQL_CONNECT_DATA:object = {
|
||||
// Solo para produccion habilitar socketPath
|
||||
socketPath: '/cloudsql/pseudosubs:us-central1:base-principal',
|
||||
// socketPath: '/cloudsql/pseudosubs:us-central1:base-principal',
|
||||
user: 'root',
|
||||
password: 'GgwTo5GryvDhAr06wk5opKhd',
|
||||
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