Iniciado el desarrollo del CRUD de los recursos.

This commit is contained in:
Fernando 2018-11-22 11:46:11 -05:00
parent 110819d8a3
commit 0d34789308
15 changed files with 388 additions and 4 deletions

3
app.ts
View File

@ -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
View File

@ -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",

View File

@ -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",

View File

@ -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
View File

@ -0,0 +1,4 @@
User-agent: *
Disallow: /srv/
https://pseudosubs.appspot.com/index.html

View 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>

View 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>

View File

@ -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) {

View 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
View 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;

View 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;

View File

@ -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
View 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'

View File

@ -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
View 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
);