This commit is contained in:
Alberto Basalo 2015-05-26 13:51:15 +02:00
Родитель 32bb9fb2ab
Коммит 3a28de51e6
166 изменённых файлов: 21749 добавлений и 708 удалений

18
.gitignore поставляемый
Просмотреть файл

@ -1,9 +1,9 @@
# Logs
**/logs
**/*.log
**/bower_components
**/node_modules
# Logs
**/logs
**/*.log
**/bower_components
**/node_modules

Просмотреть файл

@ -1,17 +1,17 @@
# 7. Hola Mundo
## Scripts en Java-Script
### node 1-mi-script.js
* puro JavaScript
### node 2-javacript-normal.js
* variables
* funciones
* expresiones
### node 3-patrones.js
* Closures con IIF
* Sintáxis extricta
### node 4-el-proceso.js
* Directorios
* Identificadores
* Entorno
# 7. Hola Mundo
## Scripts en Java-Script
### node 1-mi-script.js
* puro JavaScript
### node 2-javacript-normal.js
* variables
* funciones
* expresiones
### node 3-patrones.js
* Closures con IIF
* Sintáxis extricta
### node 4-el-proceso.js
* Directorios
* Identificadores
* Entorno

Просмотреть файл

@ -1,11 +1,11 @@
# 2. Consola
## Argumentos
- process.argv[0] node
- process.argv[1] script
+ process.argv[2..n] argumentos
## Interacción
La respuesta del usuario es asíncrona
# 2. Consola
## Argumentos
- process.argv[0] node
- process.argv[1] script
+ process.argv[2..n] argumentos
## Interacción
La respuesta del usuario es asíncrona

Просмотреть файл

@ -1,3 +1,3 @@
<section name="total">
<h2>No se ha encontrado lo que buscabas</h2>
</section>
</section>

Просмотреть файл

@ -7,4 +7,4 @@
<h1>El Blog de NodeJS</h1>
<p>En construcción...</p>
</body>
</html>
</html>

Просмотреть файл

@ -1,4 +1,4 @@
body {
background: #eeeeee;
font-family: Trebuchet MS, Verdana, Arial, serif;
}
}

Просмотреть файл

@ -4,4 +4,4 @@
<body>
Hola, soy muy simple :-(
</body>
</html>
</html>

Просмотреть файл

@ -1,14 +1,14 @@
# 9. Web
## http
* escuchar en un puerto y responder
## web
* si respondemos enviando html... tenemos un web server
## static server
* podemos sacar el html a ficheros
- localhost:3000
- localhost:3000/blog
- localhost:3000/static/blog
## control caja
- servidor web y apliacacion cliente
- atención rutas locales con #
# 9. Web
## http
* escuchar en un puerto y responder
## web
* si respondemos enviando html... tenemos un web server
## static server
* podemos sacar el html a ficheros
- localhost:3000
- localhost:3000/blog
- localhost:3000/static/blog
## control caja
- servidor web y apliacacion cliente
- atención rutas locales con #

Просмотреть файл

@ -1,23 +1,23 @@
# 4. Pro
## Herramientas
- **nodemon**: sudo npm install -g nodemon
### Módulos externos
- npm init
- npm install q -save
## 1 Módulos
- Clases para representar modelos
- Bibliotecas de funciones
## 2 Operaciones lentas
- por ejemplo llamadas externas http
### 2-1 Callbacks
- Te pueden llevar al infierno
- Al menos organízate y dales nombre
### 2-2 Promesas
- El doctor Q al rescate
# 4. Pro
## Herramientas
- **nodemon**: sudo npm install -g nodemon
### Módulos externos
- npm init
- npm install q -save
## 1 Módulos
- Clases para representar modelos
- Bibliotecas de funciones
## 2 Operaciones lentas
- por ejemplo llamadas externas http
### 2-1 Callbacks
- Te pueden llevar al infierno
- Al menos organízate y dales nombre
### 2-2 Promesas
- El doctor Q al rescate

Просмотреть файл

@ -1,20 +1,20 @@
# 5. Express
## Instalación
* npm init
* npm install express -save
## Hola Mundo
un servidor web en 4 lineas
## Middleware
app.use()
### Log de llamadas
atención al 3º argumento, que llama a la siguiente función en la pila
### Directorio estático
configuración básica
**atención al orden del middleware**
# 5. Express
## Instalación
* npm init
* npm install express -save
## Hola Mundo
un servidor web en 4 lineas
## Middleware
app.use()
### Log de llamadas
atención al 3º argumento, que llama a la siguiente función en la pila
### Directorio estático
configuración básica
**atención al orden del middleware**

Просмотреть файл

@ -4,4 +4,4 @@
<body>
Hola, soy muy simple :-(
</body>
</html>
</html>

Просмотреть файл

@ -1,11 +1,11 @@
# 6. Rutas
## Enrutación básica
- especificar cada función para cada ruta disponible
## Parámetros
- /:parametro/
## Variantes con patrones de cadenas y expresiones regulares
- se usan tando en las rutas como sobre todo en los parámetros
# 6. Rutas
## Enrutación básica
- especificar cada función para cada ruta disponible
## Parámetros
- /:parametro/
## Variantes con patrones de cadenas y expresiones regulares
- se usan tando en las rutas como sobre todo en los parámetros

Просмотреть файл

@ -1,15 +1,15 @@
# 7 API-REST
## Sintaxis: verbos y sustantivos
- CRUD : -> http verbs
## Recursos y rutas
- express router
- recuros anidados
## Documentación
## Organización
- Tener un módulo dónde se definen las rutas y se enlazan a las funciones de respuestas
- Llevar las funciones de respuesta a sus propios módulos
- llevar la configuración a su propio módulo
- mantener el app.js tan limpio como sea posible
# 7 API-REST
## Sintaxis: verbos y sustantivos
- CRUD : -> http verbs
## Recursos y rutas
- express router
- recuros anidados
## Documentación
## Organización
- Tener un módulo dónde se definen las rutas y se enlazan a las funciones de respuestas
- Llevar las funciones de respuesta a sus propios módulos
- llevar la configuración a su propio módulo
- mantener el app.js tan limpio como sea posible

Просмотреть файл

@ -9,4 +9,4 @@
"body-parser": "^1.12.2",
"express": "^4.12.0"
}
}
}

Просмотреть файл

@ -13,12 +13,12 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
templateUrl: 'nuevo.html'
})
.state('lista', {
url: '/lista',
url: '/lista',
controller: 'CajaCtrl as caja',
templateUrl: 'lista.html'
}).state('not-found', {
url: '*path',
url: '*path',
controller: 'CajaCtrl as caja',
templateUrl: 'total.html'
});
});
});

Просмотреть файл

@ -60,4 +60,4 @@
}
}
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
}());
}());

Просмотреть файл

@ -23,4 +23,4 @@
</tr>
</tbody>
</table>
</section>
</section>

Просмотреть файл

@ -5,4 +5,4 @@
}
}
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
}());
}());

Просмотреть файл

@ -43,4 +43,4 @@
};
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
}());
}());

Просмотреть файл

@ -1,3 +1,3 @@
<section name="total">
<h2>No se ha encontrado lo que buscabas</h2>
</section>
</section>

Просмотреть файл

@ -50,4 +50,4 @@
</fieldset>
</form>
{{caja.movimientos}}
</section>
</section>

Просмотреть файл

@ -35,4 +35,4 @@
</div>
</div>
</div>
</section>
</section>

Просмотреть файл

@ -16,7 +16,7 @@ var total = {
gastos: 0
}
// API - REST
// API - REST
// verbos en protocolo, nombres de recurso en la ruta, parametros en segmentos o body
// ruta en el API que devolverá la lista de maestros
@ -56,4 +56,4 @@ app.get('/api/priv/total', function (req, res, next) {
console.log('steady');
app.listen(3000);
console.log('go');
console.log('go');

Просмотреть файл

@ -14,18 +14,18 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
templateUrl: 'nuevo.html'
})
.state('lista', {
url: '/lista',
url: '/lista',
controller: 'CajaCtrl as caja',
templateUrl: 'lista.html'
})
.state('registro', {
url: '/registro',
url: '/registro',
controller: 'RegistroCtrl as registro',
templateUrl: 'registro.html'
})
.state('not-found', {
url: '*path',
url: '*path',
controller: 'CajaCtrl as caja',
templateUrl: 'total.html'
});
});
});

Просмотреть файл

@ -14,7 +14,7 @@
function funcionInterceptoraSeguridad($injector,$q, $cookieStore, $rootScope) {
// la función interceptora devuelve un objeto que configura el interceptor
var interceptor = {}; // Este objeto almacena funciones a llamar en ciertos momentos
// Función que se ejecutarán antes de cada petición
interceptor.request = function (request) {
// Enviar en la cabecera el token de sesión previamente guardado en una cookie
@ -38,10 +38,10 @@
};
return $q.reject(response);
}
return interceptor;
}
angular.module('controlCajaApp').config(configuradorInterceptores);
}());
}());

Просмотреть файл

@ -56,4 +56,4 @@
}
}
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
}());
}());

Просмотреть файл

@ -44,7 +44,7 @@
<script src="registroCtrl.js"></script>
<script src="menuCtrl.js"></script>
<script src="cajaCtrl.js"></script>
<script src="movimientosFactory.js"></script>
<!-- Inluímos referencia al fichero para la carga de maestros -->
<script src="maestrosFactory.js"></script>

Просмотреть файл

@ -23,4 +23,4 @@
</tr>
</tbody>
</table>
</section>
</section>

Просмотреть файл

@ -4,16 +4,16 @@
var maestrosFactory =   function ($http)  {
// en este caso la ruta es pública, pero a este nivel no influye
var urlBase = "http://localhost:3000/api/";
var factory  =   {};
factory.gettingMaestros =   function ()  {
return $http.get(urlBase+'pub/maestros');
return $http.get(urlBase+'pub/maestros');
};
return factory;
};
angular.module('controlCajaApp').factory('maestrosFactory', maestrosFactory);
}());
}());

Просмотреть файл

@ -5,4 +5,4 @@
}
}
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
}());
}());

Просмотреть файл

@ -37,4 +37,4 @@
};
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
}());
}());

Просмотреть файл

@ -1,3 +1,3 @@
<section name="total">
<h2>No se ha encontrado lo que buscabas</h2>
</section>
</section>

Просмотреть файл

@ -50,4 +50,4 @@
</fieldset>
</form>
{{caja.movimientos}}
</section>
</section>

Просмотреть файл

@ -2,7 +2,7 @@
// El rootScope mantiene un ViewModel al que se puede 'bindear' cualquier vista
// Es cómodo usarlo para compartir datos de infraestructura
// No conviene abusar, para reducir la posibilidad de conflictos y polución de la memoria
// El servicio $cookieStore, viene en el módulo ngCookies
// El servicio $cookieStore, viene en el módulo ngCookies
var registroCtrl = function ( $state, $http, $cookieStore) {
var urlBase = "http://localhost:3000/api/";
var vm = this;
@ -25,7 +25,7 @@
$state.go("total");
});
}
}
angular.module('controlCajaApp').controller('RegistroCtrl', registroCtrl);
}());
}());

Просмотреть файл

@ -35,4 +35,4 @@
</div>
</div>
</div>
</section>
</section>

Просмотреть файл

@ -31,7 +31,7 @@ app.use('/api/priv/', function (req, res, next) {
// Para que el resto de la pila sepa quien es el usuario actual
req.usuario = sesion.email;
} else {
// La sesión ya está caducada
// La sesión ya está caducada
console.log('Sesión caducada:' + JSON.stringify(sesion));
res.send(419, 'Sesión caducada');
}
@ -49,7 +49,7 @@ app.use('/api/priv/', function (req, res, next) {
// API - REST
// API - REST
// SECURITY
// Gestión de usuarios: Lista y registro
app.route('/api/usuarios')
@ -76,11 +76,11 @@ app.route('/api/usuarios')
app.route('/api/sesiones')
.get(function (req, res, next) {
// Esto devuelve la lista completa de sesiones
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
res.json(sesiones);
})
.post(function (req, res, next) {
// login
// login
var usuario = req.body;
if (esUsuarioValido(usuario)) {
console.log('aceptado:' + usuario.email);
@ -147,7 +147,7 @@ app.route('/api/priv/movimientos')
.post(function (req, res, next) {
var movimiento = req.body;
// Las funciones de negocio trabajan con la info de seguridad
// esto es posible gracias que los parametrs se pssan de unas funiones a otras
// esto es posible gracias que los parametrs se pssan de unas funiones a otras
movimiento.usuario = req.usuario;
movimientos.push(movimiento);
// Tambien tenemos que totalizar adecuadamente
@ -184,4 +184,4 @@ app.get('/api/priv/total', function (req, res, next) {
console.log('steady');
app.listen(3000);
console.log('go');
console.log('go');

Просмотреть файл

@ -14,18 +14,18 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
templateUrl: 'nuevo.html'
})
.state('lista', {
url: '/lista',
url: '/lista',
controller: 'CajaCtrl as caja',
templateUrl: 'lista.html'
})
.state('registro', {
url: '/registro',
url: '/registro',
controller: 'RegistroCtrl as registro',
templateUrl: 'registro.html'
})
.state('not-found', {
url: '*path',
url: '*path',
controller: 'CajaCtrl as caja',
templateUrl: 'total.html'
});
});
});

Просмотреть файл

@ -6,7 +6,7 @@
function funcionInterceptoraSeguridad($q, $injector, $cookieStore, $rootScope) {
var interceptor = {};
var interceptor = {};
interceptor.request = function (request) {
request.headers["sessionId"] = $cookieStore.get("sessionId");
return request || $q.when(request);
@ -27,4 +27,4 @@
}
angular.module('controlCajaApp').config(configuradorInterceptores);
}());
}());

Просмотреть файл

@ -3,7 +3,7 @@
var vm = this;
vm.titulo = "Controla tu Cash Flow";
// Al usar recursos, la sintaxis se asemaja de nuevo al modelo síncrono
// eso es posible porque AngularJS maneja internamente las promesas
@ -12,19 +12,19 @@
vm.maestros = maestros;
});
//vm.maestros = maestrosFactory.get();
vm.nuevoMovimiento = {
esIngreso: 1,
esGasto: 0,
importe: 0,
fecha: new Date()
};
// vm.nuevoMovimiento = new movimientosFactory.movimientos();
// vm.nuevoMovimiento.esIngreso =1;
// vm.nuevoMovimiento.fecha = new Date();
movimientosFactory.gettingMovimientos()
.success(function (movimientos) {
vm.movimientos = movimientos;
@ -32,7 +32,7 @@
// Si el recurso devuelve un array, tenemos usar el método query en lugar de get que es para un elemnto
// vm.movimientos = movimientosFactory.movimientos.query();
// movimientosFactory.gettingTotal()
// .success(function (total) {
// vm.total = total;
@ -65,7 +65,7 @@
// vm.nuevoMovimiento.importe = 0;
// });
}
vm.balance = function () {
return vm.total.ingresos - vm.total.gastos
@ -75,4 +75,4 @@
}
}
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
}());
}());

Просмотреть файл

@ -23,4 +23,4 @@
</tr>
</tbody>
</table>
</section>
</section>

Просмотреть файл

@ -1,20 +1,20 @@
(function () {
var maestrosFactory =   function ($resource)  {
// var urlBase = "http://localhost:3000/api/";
//
//
// var factory  =   {};
//
//
// factory.gettingMaestros =   function ()  {
// return $http.get(urlBase+'pub/maestros');
// return $http.get(urlBase+'pub/maestros');
// };
//
// return factory;
// El uso de recursos simplifica mucho la sintaxis
return $resource("/api/pub/maestros/");
};
angular.module('controlCajaApp').factory('maestrosFactory', maestrosFactory);
}());
}());

Просмотреть файл

@ -5,4 +5,4 @@
}
}
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
}());
}());

Просмотреть файл

@ -13,15 +13,15 @@
return $http.post(urlBase + 'priv/movimientos', movimiento);
};
factory.total =  $resource("/api/priv/total/");
// una alternativa es devolver las promesas y ocultar las llamadas
// pero genera más código del necesario
factory.total.gettingTotal =  $resource("/api/priv/total/").get().$promise;
return factory;
};
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
}());
}());

Просмотреть файл

@ -1,3 +1,3 @@
<section name="total">
<h2>No se ha encontrado lo que buscabas</h2>
</section>
</section>

Просмотреть файл

@ -50,4 +50,4 @@
</fieldset>
</form>
{{caja.movimientos}}
</section>
</section>

Просмотреть файл

@ -23,4 +23,4 @@
}
}
angular.module('controlCajaApp').controller('RegistroCtrl', registroCtrl);
}());
}());

Просмотреть файл

@ -35,4 +35,4 @@
</div>
</div>
</div>
</section>
</section>

Просмотреть файл

@ -35,7 +35,7 @@ app.use('/api/priv/', function (req, res, next) {
// API - REST
// API - REST
// SECURITY
app.route('/api/usuarios')
.get(function (req, res, next) {
@ -58,7 +58,7 @@ app.route('/api/usuarios')
app.route('/api/sesiones')
.get(function (req, res, next) {
// Esto devuelve la lista completa de sesiones
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
res.json(sesiones);
})
.post(function (req, res, next) {
@ -159,4 +159,4 @@ app.get('/api/priv/total', function (req, res, next) {
console.log('steady');
app.listen(3000);
console.log('go');
console.log('go');

Просмотреть файл

@ -13,23 +13,23 @@ angular.module('controlCajaApp').config(function ($stateProvider,$locationProvid
templateUrl: 'nuevo.html'
})
.state('lista', {
url: '/lista',
url: '/lista',
controller: 'CajaCtrl as caja',
templateUrl: 'lista.html'
})
.state('movimiento', {
url: '/movimiento/:id', // declaracion de parametros en rutas
url: '/movimiento/:id', // declaracion de parametros en rutas
controller: 'MovimientoCtrl as vm',
templateUrl: 'movimiento.html'
})
.state('registro', {
url: '/registro',
url: '/registro',
controller: 'RegistroCtrl as registro',
templateUrl: 'registro.html'
})
.state('not-found', {
url: '*path',
url: '*path',
controller: 'CajaCtrl as caja',
templateUrl: 'total.html'
});
});
});

Просмотреть файл

@ -3,12 +3,12 @@
function configuradorInterceptores($httpProvider) {
$httpProvider.interceptors.push(funcionInterceptoraLog);
}
// Esta función se especializa en escribir en la consola
// Esta función se especializa en escribir en la consola
// información sobre llamadas http
function funcionInterceptoraLog($log) {
var interceptor = {};
var interceptor = {};
interceptor.request = function (request) {
$log.info('request:' + request.url);
return request ;
@ -20,4 +20,4 @@
}
angular.module('controlCajaApp').config(configuradorInterceptores);
}());
}());

Просмотреть файл

@ -26,4 +26,4 @@
}
angular.module('controlCajaApp').config(configuradorInterceptores);
}());
}());

Просмотреть файл

@ -3,13 +3,13 @@
var vm = this;
vm.titulo = "Controla tu Cash Flow";
vm.maestros = maestrosFactory.get();
vm.nuevoMovimiento = new movimientosFactory.movimientos();
vm.nuevoMovimiento.esIngreso =1;
vm.nuevoMovimiento.fecha = new Date();
vm.movimientos = movimientosFactory.movimientos.query();
vm.total = movimientosFactory.total.get();
@ -31,4 +31,4 @@
}
}
angular.module('controlCajaApp').controller('CajaCtrl', cajaCtrl);
}());
}());

Просмотреть файл

@ -28,4 +28,4 @@
</tr>
</tbody>
</table>
</section>
</section>

Просмотреть файл

@ -4,6 +4,6 @@
// Una de sus utilidades de 'fábrica' de una caché simple pero potente
return $resource("/api/pub/maestros/",{},{get: {cache: true}});
};
angular.module('controlCajaApp').factory('maestrosFactory', maestrosFactory);
}());
}());

Просмотреть файл

@ -5,4 +5,4 @@
}
}
angular.module('controlCajaApp').controller('MenuCtrl',menuCtrl);
}());
}());

Просмотреть файл

@ -38,4 +38,4 @@
</div>
</fieldset>
</form>
</section>
</section>

Просмотреть файл

@ -1,12 +1,12 @@
(function () {
// $stateParams es el servicio de ui-router para acceder a los parámetros de la ruta
// $stateParams es el servicio de ui-router para acceder a los parámetros de la ruta
var movimientoCtrl = function ($stateParams, movimientosFactory) {
var vm = this;
// El acceso es por nombre de parámetro
var movId = $stateParams.id;
// Se llama al recurso expuesto por la factoría de recursos
// Se llama al recurso expuesto por la factoría de recursos
// enviándole el objeto que sirve de consulta al método get
vm.movimiento = movimientosFactory.movimientos.get({id:movId});
}
angular.module('controlCajaApp').controller('MovimientoCtrl', movimientoCtrl);
}());
}());

Просмотреть файл

@ -22,4 +22,4 @@
};
angular.module('controlCajaApp').factory('movimientosFactory', movimientosFactory);
}());
}());

Просмотреть файл

@ -1,3 +1,3 @@
<section name="total">
<h2>No se ha encontrado lo que buscabas</h2>
</section>
</section>

Просмотреть файл

@ -50,4 +50,4 @@
</fieldset>
</form>
{{caja.movimientos}}
</section>
</section>

Просмотреть файл

@ -23,4 +23,4 @@
}
}
angular.module('controlCajaApp').controller('RegistroCtrl', registroCtrl);
}());
}());

Просмотреть файл

@ -35,4 +35,4 @@
</div>
</div>
</div>
</section>
</section>

Просмотреть файл

@ -42,14 +42,14 @@ app.use('/api/priv/', function (req, res, next) {
} else {
res.status(401).send('Credencial inválida');
}
});
// API - REST
// API - REST
// SECURITY
app.route('/api/usuarios')
.get(function (req, res, next) {
@ -73,7 +73,7 @@ app.route('/api/usuarios')
app.route('/api/sesiones')
.get(function (req, res, next) {
// Esto devuelve la lista completa de sesiones
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
res.json(sesiones);
})
.post(function (req, res, next) {
@ -193,4 +193,4 @@ function getTotalUsuario(usuario) {
console.log('steady');
app.listen(3000);
console.log('go');
console.log('go');

Просмотреть файл

@ -12,7 +12,7 @@
// Usar Transclude para reutilizar el contenido del usuario y hacer la vista más dinámica
function cabecera() {
return {
restrict: 'AE',
restrict: 'EA',
replace: 'true',
transclude: true,
templateUrl: '/tpl-cabecera.html'

Просмотреть файл

@ -1,6 +1,6 @@
<section name="Lista">
<!-- <p class="lead">Estos son tus movimientos recientes.</p>-->
<ab-cabecera>Estos son tus movimientos recientes.</ab-cabecera>
<div ab-cabecera>Estos son tus movimientos recientes.</div>
<br>
<label class="control-label" for="importe">Filtrar:</label>
<input type="text" name="filtro" placeholder="qué buscas?" class="input" ng-model="valorBuscado">

Просмотреть файл

@ -1,46 +1,46 @@
Directivas
==========
- Se usan de forma **declarativa** en el HTML
- Su función es extender y enriquecer el HTML encapsulando el **acceso al DOM**
- Se definen como **objetos JS** con propiedades específicas
Propiedades
-----------
### Restrict
Sirve para determinar dónde se puede aplicar la directiva
Valores posibles:
- **A** – Attribute ` <div rating> `
- **E** – Element ` <rating> `
- **C** – Class ` <div class=”rating”> `
- **M** – Comment ` <!– directive: rating –> `
### Replace
Indica si el elemento al que se aplica debe ser sustituído por el resultado de la ejecución
### Transclude
Indica si el elemento al que se aplicaca incluirá el resultado de la ejecución de la directiva en su interior
### Template y template URL
Cadena de texto o enlace a fichero que contine el HTML que va a devolver la directiva
### Scope
Intercambio de datos con el elemento que declara la directiva.
Valores posibles:
- **@** Interpolating, para enlazar un texto dentro de la directiva. ` scope: { soloLectura: '@' } `
- **=** Data bind, un objeto para doble-enlace que la directiva pueda cambiar ` scope: { valor: '=alias' } `
- **&** Expression `scope: { onEvaluado: '&' } `
### Link
Una función que enlazará la directiva con el scope
### Compile
Una función que podrá manipular el DOM creando una función link
### Controller
Una función que actuará como contrlador para esta directiva
Directivas
==========
- Se usan de forma **declarativa** en el HTML
- Su función es extender y enriquecer el HTML encapsulando el **acceso al DOM**
- Se definen como **objetos JS** con propiedades específicas
Propiedades
-----------
### Restrict
Sirve para determinar dónde se puede aplicar la directiva
Valores posibles:
- **A** – Attribute ` <div rating> `
- **E** – Element ` <rating> `
- **C** – Class ` <div class=”rating”> `
- **M** – Comment ` <!– directive: rating –> `
### Replace
Indica si el elemento al que se aplica debe ser sustituído por el resultado de la ejecución
### Transclude
Indica si el elemento al que se aplicaca incluirá el resultado de la ejecución de la directiva en su interior
### Template y template URL
Cadena de texto o enlace a fichero que contine el HTML que va a devolver la directiva
### Scope
Intercambio de datos con el elemento que declara la directiva.
Valores posibles:
- **@** Interpolating, para enlazar un texto dentro de la directiva. ` scope: { soloLectura: '@' } `
- **=** Data bind, un objeto para doble-enlace que la directiva pueda cambiar ` scope: { valor: '=alias' } `
- **&** Expression `scope: { onEvaluado: '&' } `
### Link
Una función que enlazará la directiva con el scope
### Compile
Una función que podrá manipular el DOM creando una función link
### Controller
Una función que actuará como contrlador para esta directiva

Просмотреть файл

@ -1,7 +1,7 @@
https://angular-ui.github.io/
http://ngmodules.org/c
http://angular-js.in/
http://www.directiv.es/
http://www.tamas.io/node-jsexpress-cors-implementation/
https://angular-ui.github.io/
http://ngmodules.org/c
http://angular-js.in/
http://www.directiv.es/
http://www.tamas.io/node-jsexpress-cors-implementation/
http://stackoverflow.com/questions/23823010/how-to-enable-cors-in-angularjs

Просмотреть файл

@ -0,0 +1,2 @@
angular.module('controlCajaApp', ['ui.router','ngCookies', 'ngResource', 'abFiltros','abDirectivas']);

Просмотреть файл

@ -1,6 +1,4 @@
angular.module('controlCajaApp', ['ui.router','ngCookies', 'ngResource', 'abFiltros','abDirectivas']);
angular.module('controlCajaApp').config(function ($stateProvider,$locationProvider) {
angular.module('controlCajaApp').config(function ($stateProvider) {
$stateProvider
.state('total', {
url: '/',

Просмотреть файл

@ -41,18 +41,20 @@
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-cookies.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-resource.min.js"></script>
<script src="http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js"></script>
<script src="app.js"></script>
<script src="appHttpLog.js"></script>
<script src="appSecurity.js"></script>
<script src="registroCtrl.js"></script>
<script src="menuCtrl.js"></script>
<script src="cajaCtrl.js"></script>
<script src="movimientoCtrl.js"></script>
<script src="movimientosFactory.js"></script>
<script src="maestrosFactory.js"></script>
<script src="filtros.js"></script>
<script src="directivas.js"></script>
<script src="valoracion.js"></script>
<!-- reorganización de referencias-->
<script src="_comun/app.js"></script>
<script src="_comun/states.js"></script>
<script src="_comun/appHttpLog.js"></script>
<script src="_comun/appSecurity.js"></script>
<script src="registro/registroCtrl.js"></script>
<script src="_comun/menuCtrl.js"></script>
<script src="controlcaja/cajaCtrl.js"></script>
<script src="movimiento/movimientoCtrl.js"></script>
<script src="data/movimientosFactory.js"></script>
<script src="data/maestrosFactory.js"></script>
<script src="filtros/filtros.js"></script>
<script src="directivas/directivas.js"></script>
<script src="directivas/valoracion/valoracion.js"></script>
</body>
</html>

Просмотреть файл

@ -1,15 +0,0 @@
{
"name": "ControlCashFlow",
"version": "0.0.0",
"description": "Controla tu flujo de caja",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Alberto Basalo",
"license": "BSD-2-Clause",
"dependencies": {
"express": "~4.12.1",
"body-parser": "~1.0.2"
}
}

Просмотреть файл

@ -1,7 +0,0 @@
https://angular-ui.github.io/
http://ngmodules.org/c
http://angular-js.in/
http://www.directiv.es/
http://www.tamas.io/node-jsexpress-cors-implementation/
http://stackoverflow.com/questions/23823010/how-to-enable-cors-in-angularjs

Просмотреть файл

@ -1,187 +0,0 @@
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser());
app.use(express.static(__dirname + '/client'));
app.use(function (peticion, respuesta, siguiente) {
console.log("recibida petición: " + peticion.url);
if (peticion.body && Object.keys(peticion.body).length>0) {
console.log("body: " + JSON.stringify(peticion.body));
}
siguiente();
});
console.log('ready');
var maxId = 0;
var movimientos = [];
var totales = [];
var usuarios = [];
var sesiones = [];
app.use('/api/priv/', function (req, res, next) {
var sessionId = req.get('sessionId');
var sesion = getSesion(sessionId);
if (sesion) {
if (esSesionValida(sesion)) {
sesion.timeStamp = new Date();
req.usuario = sesion.email;
next();
} else {
console.log('Sesión caducada:' + JSON.stringify(sesion));
res.status(419).send('Sesión caducada');
}
} else {
res.status(401).send('Credencial inválida');
}
});
// API - REST
// SECURITY
app.route('/api/usuarios')
.get(function (req, res, next) {
// Esto devuelve la lista completa de usuarios y contraseñas
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
res.json(usuarios);
})
.post(function (req, res, next) {
var usuario = req.body;
if (existeUsuario(usuario)) {
console.log('email ya registrado:' + usuario.email);
res.status(409).send('email ' + usuario.email + ' ya registrado');
} else {
console.log('registrado:' + usuario.email);
usuarios.push(usuario);
res.json(newSession(usuario.email));
}
});
// Gestión de sesiones: listado y login
app.route('/api/sesiones')
.get(function (req, res, next) {
// Esto devuelve la lista completa de sesiones
// PELIGRO: Usar sólo a modo de debug mientras desarrollamos
res.json(sesiones);
})
.post(function (req, res, next) {
var usuario = req.body;
if (esUsuarioValido(usuario)) {
console.log('aceptado:' + usuario.email);
res.json(newSession(usuario.email));
} else {
console.log('Credencial inválida:' + usuario.email);
res.status(401).send('Credencial inválida');
}
});
function existeUsuario(usuario) {
return usuarios.some(function (u) {
return u.email == usuario.email;
});
}
function esUsuarioValido(usuario) {
return usuarios.filter(function (u) {
return u.email == usuario.email && u.password == usuario.password;
})[0];
}
function getSesion(sessionId) {
return sesiones.filter(function (s) {
return s.sessionId == sessionId;
})[0]
}
function esSesionValida(sesion) {
return (new Date() - sesion.timeStamp) < 20 * 60 * 1000;
}
function newSession(email) {
var sessionId = Math.random() * (88888) + 11111;
var timeStamp = new Date();
sesiones.push({
sessionId: sessionId,
email: email,
timeStamp: timeStamp
});
return sessionId;
}
// BUSINESS
app.get('/api/pub/maestros', function (req, res, next) {
var maestros = {
categoriasIngresos: ['Nómina', 'Ventas', 'Intereses Depósitos'],
categoriasGastos: ['Hipotéca', 'Compras', 'Impuestos']
};
res.json(maestros);
});
app.route('/api/priv/movimientos')
.get(function (req, res, next) {
var movimientosUsuario = movimientos.filter(function (m) {
return m.usuario = req.usuario;
});
res.json(movimientosUsuario);
})
.post(function (req, res, next) {
var movimiento = req.body;
movimiento.usuario = req.usuario;
maxId++;
movimiento.id = maxId;
movimientos.push(movimiento);
var totalUsuario = getTotalUsuario(req.usuario);
if (movimiento.tipo == 'Ingreso')
totalUsuario.ingresos += movimiento.importe;
else
totalUsuario.gastos += movimiento.importe;
res.status(200).send();
});
app.get('/api/priv/movimientos/:id', function (req, res, next) {
var movId = req.params.id;
movimientoBuscado = getMovimientoById(movId, req.usuario);
res.json(movimientoBuscado);
});
function getMovimientoById(id,usuario) {
var movimientoBuscado = movimientos.filter(function (movimiento) {
return movimiento.id == id && movimiento.usuario == usuario;
})[0];
return movimientoBuscado;
}
app.get('/api/priv/total', function (req, res, next) {
var totalUsuario = getTotalUsuario(req.usuario);
res.json(totalUsuario);
});
function getTotalUsuario(usuario) {
if(usuario===undefined) return {};
var totalUsuario = totales.filter(function (t) {
return t.usuario == usuario;
})[0];
if (totalUsuario===undefined) {
totalUsuario = {
usuario : usuario,
ingresos: 0,
gastos: 0
};
totales.push(totalUsuario);
}
return totalUsuario;
}
console.log('steady');
app.listen(3000);
console.log('go');

Просмотреть файл

@ -1,3 +1,4 @@
"use strict";
module.exports.routeMaestros = function (app) {
app.get('/api/pub/maestros', function (req, res, next) {
var maestros = {

Просмотреть файл

@ -0,0 +1,26 @@
"use strict";
var movimientosData = require('../data/movimientosData.js');
module.exports.routeMovimientos = function (app) {
app.route('/api/priv/movimientos')
.get(function (req, res, next) {
res.json(movimientosData.getMovimientos(req.usuario));
})
.post(function (req, res, next) {
var movimiento = req.body;
movimiento.usuario = req.usuario;
movimientosData.postMovimiento(movimiento);
res.status(200).send();
});
app.get('/api/priv/movimientos/:id', function (req, res, next) {
res.json(movimientosData.getMovimiento(req.params.id, req.usuario));
});
app.get('/api/priv/total', function (req, res, next) {
res.json(movimientosData.getTotalUsuario(req.usuario));
});
}

Просмотреть файл

@ -0,0 +1,45 @@
"use strict";
var seguridadData = require('../data/seguridadData.js');
module.exports.seguridad = function (app) {
app.use('/api/priv/', function (req, res, next) {
var sessionId = req.get('sessionId');
var sesion = seguridadData.getSesion(sessionId);
if (sesion) {
if (sesion.timeStamp) {
req.usuario = sesion.email;
next();
} else {
res.status(419).send('Sesión caducada');
}
} else {
res.status(401).send('Credencial inválida');
}
});
// API - REST
// SECURITY
app.route('/api/usuarios')
.post(function (req, res, next) {
var usuario = req.body;
var sesion = seguridadData.postUsuario(usuario);
if (sesion) {
res.json(sesion);
} else {
res.status(409).send('email ' + usuario.email + ' ya registrado');
}
});
// Gestión de sesiones: listado y login
app.route('/api/sesiones')
.post(function (req, res, next) {
var usuario = req.body;
var sesion = seguridadData.postSesion(usuario);
if (sesion) {
res.json(sesion);
} else {
res.status(401).send('Credencial inválida');
}
});
}

Просмотреть файл

@ -0,0 +1,12 @@
"use strict";
var settings = require("./settings.js");
var app = require('./express.js').configApp();
console.log('ready... settings ok', settings);
require('./api/seguridadAPI.js').seguridad(app);
require('./api/maestrosAPI.js').routeMaestros(app);
require('./api/movimientosAPI.js').routeMovimientos(app);
console.log('steady... routes OK');
app.listen(settings.port);
console.log('go... listening on port: ' + settings.port);

Просмотреть файл

@ -0,0 +1,58 @@
"use strict";
var maxId = 0;
var movimientos = [];
var totales = [];
module.exports.getMovimientos = function (usuario) {
var movimientosUsuario = movimientos.filter(function (m) {
return m.usuario = usuario;
});
return movimientosUsuario;
}
module.exports.getMovimiento = function (movId, usuario) {
var movimientoBuscado = movimientos.filter(function (movimiento) {
return movimiento.id == movId && movimiento.usuario == usuario;
})[0];
return movimientoBuscado;
}
module.exports.getTotalUsuario = function (usuario) {
var totalUsuario = getTotalUsuario(usuario);
return totalUsuario;
}
module.exports.postMovimiento = function (movimiento) {
maxId++;
movimiento.id = maxId;
movimientos.push(movimiento);
var totalUsuario = getTotalUsuario(movimiento.usuario);
if (movimiento.tipo == 'Ingreso')
totalUsuario.ingresos += movimiento.importe;
else
totalUsuario.gastos += movimiento.importe;
return getMovimientosUsuario(movimiento.usuario);
}
function getMovimientosUsuario(usuario) {
var movimientosUsuario = movimientos.filter(function (m) {
return m.usuario = usuario;
});
return movimientosUsuario;
}
function getTotalUsuario(usuario) {
if (usuario === undefined) return {};
var totalUsuario = totales.filter(function (t) {
return t.usuario == usuario;
})[0];
if (totalUsuario === undefined) {
totalUsuario = {
usuario: usuario,
ingresos: 0,
gastos: 0
};
totales.push(totalUsuario);
}
return totalUsuario;
}

Просмотреть файл

@ -0,0 +1,75 @@
"use strict";
var usuarios = [];
var sesiones = [];
module.exports.postUsuario = function (usuario) {
if (existeUsuario(usuario)) {
console.log('email ya registrado:' + usuario.email);
return null;
} else {
console.log('registrado:' + usuario.email);
usuarios.push(usuario);
return newSession(usuario.email);
}
}
module.exports.postSesion = function (usuario) {
if (esUsuarioValido(usuario)) {
console.log('aceptado:' + usuario.email);
return newSession(usuario.email);
} else {
console.log('Credencial inválida:' + usuario.email);
return null;
}
}
module.exports.getSesion = function (sessionId) {
var sesion = getSesion(sessionId);
if (sesion) {
if (esSesionValida(sesion)) {
sesion.timeStamp = new Date();
return sesion;
} else {
console.log('Sesión caducada:' + JSON.stringify(sesion));
sesion.timeStamp = null;
return sesion;
}
} else {
console.log('Credencial inválida:' + sessionId);
return null;
}
}
function existeUsuario(usuario) {
return usuarios.some(function (u) {
return u.email == usuario.email;
});
}
function esUsuarioValido(usuario) {
return usuarios.filter(function (u) {
return u.email == usuario.email && u.password == usuario.password;
})[0];
}
function getSesion(sessionId) {
return sesiones.filter(function (s) {
return s.sessionId == sessionId;
})[0]
}
function esSesionValida(sesion) {
return (new Date() - sesion.timeStamp) < 20 * 60 * 1000;
}
function newSession(email) {
var sessionId = Math.random() * (88888) + 11111;
var timeStamp = new Date();
sesiones.push({
sessionId: sessionId,
email: email,
timeStamp: timeStamp
});
return sessionId;
}

Просмотреть файл

@ -1,3 +1,4 @@
"use strict";
module.exports.configApp = function () {
var express = require('express');
@ -5,8 +6,12 @@ module.exports.configApp = function () {
var app = express();
app.use(bodyParser());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use(express.static(__dirname + './../client'));
console.log("bodyParser y servidor de ficheros estáticos en uso");
app.use(function (peticion, respuesta, siguiente) {
console.log("recibida petición: " + peticion.url);

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше