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.