sistema_de_gerenciamento
Introdução
Este é um sistema de gerenciamento de segundo plano baseado em koa2
Use jQuery
como estrutura JS de front-end Use bootstrap
como estrutura CSS Use pug
/ jade
e handlebars
como modelo de página HTML Use PostgreSql
para armazenar dados de negócios Use mongodb
para armazenar session
Usando Bookshelf
+ Knex
como ORM
e Query Builder
Use Sentry
como plataforma para coletar feedback sobre informações de erro. Use AJAX
para processar solicitações de front-end. Use a biblioteca CronJob
para concluir a execução de tarefas agendadas.
Para a estrutura de diretórios e configuração do babel, consulte https://github.com/17koa/koa-demo
O link original parece ter sido excluído. Esta é a versão que bifurquei https://github.com/liuyueyi1995/koa2-demo.
O código front-end do site vem de um projeto anterior meu https://github.com/liuyueyi1995/oa
tarefas básicas
- Um registro de login de administrador de back-end
- B Gerenciamento de informações do usuário
- Gerenciamento de função de usuário C
- D Gestão Organizacional
- E gerenciamento de projetos
- F Exibir o conteúdo obtido por consulta e pesquisa através de paginação back-end +
AJAX
- G Criação de usuários temporários e alocação e reciclagem de funções temporárias
- Gerenciamento de log H
Completude
- A estrutura básica do MVC foi concluída;
- A tarefa A foi concluída, incluindo registro, login e leitura e gravação da sessão;
- A tarefa B foi concluída, incluindo consulta de informações do usuário, pesquisa difusa, adição, exclusão, modificação de informações básicas e modificação de senha;
- A tarefa C foi concluída, incluindo consulta em várias tabelas, pesquisa difusa, processamento de menu suspenso em cascata, adição e exclusão de informações;
- A tarefa D foi concluída, incluindo consulta de informações institucionais, pesquisa difusa, adição, exclusão e modificação;
- A tarefa E foi concluída, incluindo consulta de informações do projeto, pesquisa difusa, adição, exclusão e modificação;
- A tarefa F foi concluída. Ao avaliar se a caixa de pesquisa tem conteúdo quando o evento de clique do botão de paginação é acionado, o conjunto de resultados retornado pelo plano de fundo é determinado;
- A tarefa G foi concluída. Ao dividir os usuários em usuários internos e externos, usando diferentes métodos de geração de senha, adicionando atributos de tempo de expiração às funções, o plano de fundo limpa regularmente as informações de funções expiradas;
- A tarefa G foi concluída, incluindo visualização de log e pesquisa difusa;
- A forma de apresentação do formulário foi melhorada, o menu suspenso foi modificado, um controle de data foi adicionado e a entrada do valor booleano está na forma de rádio;
- As duas funções de login de usuário e gerenciamento de dados foram associadas;
- A distinção entre funções externas e funções internas foi concluída e a definição de prazos para as funções foi concluída;
TODOs
- A consulta de datas, números e valores booleanos precisa ser melhorada (por exemplo: timestamp, booleano);
- A verificação da entrada do usuário precisa ser melhorada (por exemplo: e-mail, telefone);
- Melhorar o grau de reutilização de código;
Foco
O arquivo config.js
contendo informações confidenciais foi excluído do repositório e precisa ser adicionado ao usá-lo:
var config = {
database: '',
username: '',
password: '',
host: '',
port:
};
module.exports = config;
Problemas
- Há um bug no menu em cascata. Inicialmente, a lista
site
não pode ser exibida sem alterar type
.- Resolvido.
- Deve ser um problema com
onchange
. - Ao adicionar um valor nulo padrão ao menu suspenso
type
, force o usuário a alterá-lo.
- Após modificar o banco de dados, o valor
updated_at
não foi alterado.- Resolvido.
- Basta adicionar
hasTimestamps:true
ao definir model
.
- Após modificar o banco de dados, a ordem da lista será interrompida.
- Resolvido.
- Use
orderBy
para classificar os resultados da pesquisa antes que o banco de dados os retorne.
- Na página de gerenciamento de funções, quando o valor do site está vazio, a adição pode falhar ocasionalmente.
- Resolvido.
- Quando o
null
do front-end é retornado ao back-end, ele se torna uma string vazia, o que entra em conflito com integer
da chave estrangeira.
- Após a paginação, se o conteúdo subsequente for modificado, ele voltará para a primeira página após a modificação ser bem-sucedida.
- Não resolvido .
- Deve ser um problema
reload
.
- Após a paginação, se os resultados da pesquisa tiverem múltiplas páginas de conteúdo, clicar na segunda página retornará à segunda página dos resultados originais.
- Resolvido.
- Como agora há apenas um processamento
AJAX
de paginação, se você quiser que os resultados da pesquisa sejam exibidos na paginação, será necessário adicionar outro estado. - Adicione julgamento com base na paginação original,
- Se houver conteúdo na caixa de pesquisa neste momento, o banco de dados será consultado com esse conteúdo e o conteúdo da página correspondente será retornado;
- Se a caixa de pesquisa estiver vazia neste momento, será retornado o conteúdo da página correspondente aos dados originais.
- Após a pesquisa, o número de páginas no componente de paginação está incorreto. Por exemplo, os resultados originais têm 5 páginas, mas os resultados da pesquisa têm apenas 2 páginas, mas 5 botões de número de página ainda são exibidos.
- Resolvido.
- Obtenha o número de resultados após pesquisar e redesenhe o botão de paginação.
- Ao pesquisar várias vezes, o número de páginas no componente de paginação está incorreto. Por exemplo, o primeiro resultado da pesquisa tem 2 páginas e o segundo resultado da pesquisa tem 3 páginas, mas apenas 2 botões de número de página são exibidos.
- Resolvido.
- Obtenha o conteúdo da caixa de pesquisa em tempo real e atualize a página quando seu conteúdo ficar vazio.
- Ao usar o modelo
handlebars
, o carimbo de data/hora é analisado incorretamente.- Resolvido.
- Use um
helper
personalizado para analisar carimbos de data/hora.
- Se você não estiver logado, modificar o URL irá ignorar o login e operar o banco de dados diretamente.
- Resolvido.
- Antes de cada solicitação
get
ser retornada, o julgamento session
é adicionado. Se session
estiver vazia, ela irá para login
.
- A exclusão de usuários internos requer join. A exclusão do pgsql oferece suporte apenas
using
e o bookshelf não oferece suporte using
.- Resolvido.
- Use
knex
para completar a consulta diretamente.
- valor do campo data/hora fora do intervalo
- Resolvido.
- Embora o banco de dados de teste local e o banco de dados Alibaba Cloud sejam ambos pgsql9.4, os mecanismos de revisão são diferentes.
- A discriminação de datas do Alibaba Cloud parece não poder aparecer de manhã e à tarde (AM/PM)
- Portanto, um método
format
foi adicionado à classe Date
para formatar datas.
- Alternando entre os resultados da pesquisa e todos os resultados.
- Resolvido.
- O método mais antigo era usar monitoramento em tempo real. Quando a caixa de pesquisa está vazia, a página é atualizada, mas isso é inválido em alguns navegadores e sistemas operacionais;
- Portanto, em vez disso, use o método de link no banner para fornecer um link dos resultados da pesquisa para todos os resultados.
- O formato de data longa ocupa muitas páginas.
- Resolvido.
- No backend, manipule a data formatando-a, simplificando-a.
- Se um erro for relatado na operação do banco de dados em segundo plano, o front-end não receberá feedback de informações relevantes.
- Resolvido.
- Adicione um bloco then().catch() ao back-end para fazer julgamentos de erros.
- A próxima etapa é analisar o código de erro específico e informar o front end com informações detalhadas.
- Ao adicionar funções, os usuários com o mesmo nome não podem ser distinguidos.
- Resolvido.
- Distinga usuários com o mesmo nome indicando seu endereço de e-mail após o nome de usuário.