sistema_de_gestion
Introducción
Este es un sistema de gestión en segundo plano basado en koa2
Utilice jQuery
como marco JS de front-end. Utilice bootstrap
como marco CSS. Utilice pug
/ jade
y handlebars
como plantilla de página HTML. Utilice PostgreSql
para almacenar datos comerciales. Utilice mongodb
para almacenar session
Usando Bookshelf
+ Knex
como ORM
y Query Builder
Utilice Sentry
como plataforma para recopilar comentarios sobre información de errores. Utilice AJAX
para procesar solicitudes de front-end. Utilice la biblioteca CronJob
para completar la ejecución de tareas programadas.
Para conocer la estructura del directorio y la configuración de Babel, consulte https://github.com/17koa/koa-demo
El enlace original parece haber sido eliminado. Esta es la versión que bifurqué https://github.com/liuyueyi1995/koa2-demo.
El código de interfaz del sitio web proviene de uno de mis proyectos anteriores https://github.com/liuyueyi1995/oa
tareas básicas
- Un registro de inicio de sesión de administrador backend
- B Gestión de la información del usuario
- Gestión de roles de usuario C
- D Gestión Organizacional
- gestión de proyectos electrónicos
- F Mostrar el contenido obtenido mediante consulta y búsqueda a través de paginación back-end +
AJAX
- G Creación de usuarios temporales y asignación y reciclaje de roles temporales
- Gestión de registros H
Lo completo
- Se ha completado la estructura básica de MVC;
- Se ha completado la tarea A, incluido el registro, el inicio de sesión y la lectura y escritura de la sesión;
- Se ha completado la tarea B, que incluye consulta de información del usuario, búsqueda difusa, adición, eliminación, modificación de información básica y modificación de contraseña;
- Se ha completado la tarea C, que incluye consultas de varias tablas, búsqueda difusa, procesamiento de menús desplegables en cascada, adición y eliminación de información;
- Se ha completado la tarea D, que incluye consulta de información institucional, búsqueda difusa, adición, eliminación y modificación;
- Se ha completado la tarea E, incluida la consulta de información del proyecto, búsqueda difusa, adición, eliminación y modificación;
- La tarea F se ha completado Al juzgar si el cuadro de búsqueda tiene contenido cuando se activa el evento de clic en el botón de paginación, se determina el conjunto de resultados devuelto por el fondo;
- La tarea G se ha completado al dividir a los usuarios en usuarios internos y externos, utilizar diferentes métodos de generación de contraseñas y agregar atributos de tiempo de vencimiento a los roles, y el fondo limpia periódicamente la información de los roles vencidos;
- Se ha completado la tarea G, incluida la visualización de registros y la búsqueda difusa;
- Se ha mejorado la forma de presentación del formulario, se ha modificado el menú desplegable, se ha agregado un control de fecha y la entrada de valores booleanos es en forma de radio;
- Se han asociado las dos funciones de inicio de sesión de usuarios y gestión de datos;
- Se ha completado la distinción entre roles externos e internos, y se ha completado la fijación de plazos para los roles;
TODO
- Es necesario mejorar la consulta de fechas, números y valores booleanos (por ejemplo: marca de tiempo, booleano);
- Es necesario mejorar la verificación de las entradas del usuario (por ejemplo: correo electrónico, teléfono);
- Mejorar el grado de reutilización del código;
Enfocar
El archivo config.js
que contiene información confidencial se eliminó del repositorio y debe agregarse al usarlo:
var config = {
database: '',
username: '',
password: '',
host: '',
port:
};
module.exports = config;
Asuntos
- Hay un error en el menú en cascada Inicialmente, la lista
site
no se puede mostrar sin cambiar type
.- Resuelto.
- Debería ser un problema con
onchange
. - Al agregar un valor nulo predeterminado al menú desplegable
type
, obliga al usuario a cambiarlo.
- Después de modificar la base de datos, el valor
updated_at
no ha cambiado.- Resuelto.
- Simplemente agregue
hasTimestamps:true
al definir model
.
- Después de modificar la base de datos, se alterará el orden de la lista.
- Resuelto.
- Utilice
orderBy
para ordenar los resultados de la búsqueda antes de que la base de datos los devuelva.
- En la página de administración de roles, cuando el valor del sitio está vacío, la adición puede fallar ocasionalmente.
- Resuelto.
- Cuando el
null
del front-end se devuelve al back-end, se convierte en una cadena vacía, lo que entra en conflicto con integer
de la clave externa.
- Después de la paginación, si se modifica el contenido posterior, volverá a la primera página después de que la modificación sea exitosa.
- No resuelto .
- Debería ser un problema
reload
.
- Después de la paginación, si los resultados de la búsqueda tienen varias páginas de contenido, al hacer clic en la segunda página se volverá a la segunda página de los resultados originales.
- Resuelto.
- Debido a que ahora solo hay un procesamiento
AJAX
de paginación, si desea que los resultados de la búsqueda se muestren en paginación, debe agregar otro estado. - Agregue juicio basado en la paginación original,
- Si hay contenido en el cuadro de búsqueda en este momento, se consultará la base de datos con este contenido y se devolverá el contenido de la página correspondiente;
- Si el cuadro de búsqueda está vacío en este momento, se devolverá el contenido de la página correspondiente a los datos originales.
- Después de la búsqueda, el número de páginas en el componente de paginación es incorrecto. Por ejemplo, los resultados originales tienen 5 páginas, pero los resultados de la búsqueda solo tienen 2 páginas, pero aún se muestran 5 botones de números de página.
- Resuelto.
- Después de buscar, obtenga la cantidad de resultados y vuelva a dibujar el botón de paginación.
- Al buscar varias veces, el número de páginas en el componente de paginación es incorrecto. Por ejemplo, el primer resultado de la búsqueda tiene 2 páginas y el segundo resultado de la búsqueda tiene 3 páginas, pero aún así solo se muestran 2 botones de número de página.
- Resuelto.
- Obtenga el contenido del cuadro de búsqueda en tiempo real y actualice la página cuando su contenido quede vacío.
- Cuando se utiliza la plantilla
handlebars
, la marca de tiempo se analiza incorrectamente.- Resuelto.
- Utilice un
helper
personalizado para analizar marcas de tiempo.
- Si no ha iniciado sesión, modificar la URL omitirá el inicio de sesión y operará la base de datos directamente.
- Resuelto.
- Antes de devolver cada solicitud
get
, agregue el juicio session
. Si session
está vacía, salte a login
.
- La eliminación de usuarios internos requiere unirse. La eliminación de pgsql solo admite
using
, y la estantería no admite using
.- Resuelto.
- Utilice
knex
para completar la consulta directamente.
- valor del campo de fecha/hora fuera de rango
- Resuelto.
- Aunque la base de datos de prueba local y la base de datos de Alibaba Cloud son pgsql9.4, los mecanismos de revisión son diferentes.
- La discriminación de fechas de Alibaba Cloud parece no poder aparecer en la mañana y en la tarde (AM/PM)
- Por lo tanto, se agregó un método
format
a la clase Date
para formatear fechas.
- Cambiar entre los resultados de búsqueda y todos los resultados.
- Resuelto.
- El primer método fue utilizar el monitoreo en tiempo real. Cuando el cuadro de búsqueda está vacío, la página se actualiza, pero esto no es válido en algunos navegadores y sistemas operativos;
- Por lo tanto, utilice el método de vinculación en el banner para proporcionar un vínculo desde los resultados de la búsqueda a todos los resultados.
- El formato de fecha larga ocupa demasiadas páginas.
- Resuelto.
- En el backend, maneje la fecha formateándola y simplificándola.
- Si se informa un error en la operación de la base de datos en segundo plano, la interfaz no recibirá información relevante.
- Resuelto.
- Agregue un bloque then().catch() al backend para realizar juicios de error.
- El siguiente paso es analizar el código de error específico e informar al front-end la información detallada.
- Al agregar roles, no se pueden distinguir usuarios con el mismo nombre.
- Resuelto.
- Distinga a los usuarios con el mismo nombre indicando su dirección de correo electrónico después del nombre de usuario.