
Continuamos falando sobre projetos de graduação de alunos de nossos projetos educacionais. Nesta edição falaremos sobre três projetos da disciplina "Desenvolvimento em C ++" do Technopark. Publicações anteriores: um , dois , três , quatro .
— . .
JunTracker — CRM
Os autores do projeto queriam fazer algo útil que pudesse ser usado na vida real. Um dos alunos trabalhou como professor de robótica, programação e modelagem 3D em uma escola de educação complementar. No Excel, foi feito um cronograma, uma contabilidade financeira e um diário com as notas dos alunos. Foi muito desagradável perceber tudo isso e você não pode mostrar aos seus pais. Foi assim que surgiu a ideia de criar um serviço cómodo para essas escolas, que permitisse fazer um calendário, monitorizar as finanças escolares e manter um diário electrónico para os alunos. Nesse caso, o serviço deve ser com separação de direitos.
O CRM foi escrito do zero em um semestre. Fizemos muito, mas não conseguimos fazer algumas coisas. No próximo semestre, os autores farão uma segunda versão com frontend em React e servidor em Go.

O lado esquerdo é para o administrador da escola e o lado direito exibe todas as informações sobre o dia atual. Você pode pesquisar o banco de dados do aluno por nome e sobrenome.

Cada aluno tem um cartão pessoal com estatísticas:

A arquitetura de CRM tem esta aparência:

O frontend é escrito em JS, HTML e CSS. Ele usa padrões de estado e composto. O template usa a sintaxe Django e o padrão "fábrica". O servidor usa o padrão de mediador. Para trabalhar com o banco de dados PostgreSQL, os autores escreveram um wrapper.
Equipe do projeto: Mark Bykhovets, Mikhail Truschelev, Timofey Makarov, Andrey Mavrin.
Repositório GitHub .
Vídeo da defesa do projeto .
Desktop Messenger JMICKHENGER
Os alunos queriam tentar criar um mensageiro que tivesse as funções básicas desses aplicativos modernos. JMICKHENGER é executado em Linux e macOS. Ele sabe como criar conversas com pessoas da lista de contatos (suporta um número ilimitado de usuários em um chat), enviar imagens e mostrar o status da mensagem (lida ou não).

O messenger foi criado usando as seguintes tecnologias:
- OpenSSL.
- Qt - usado para renderizar a interface, aplicado o padrão de design MVC.
- Impulso.
- MongoDB.
- SQLite.
Arquitetura geral do sistema:

No lado do aplicativo, há uma biblioteca de partes de rede. Assim que o usuário interage com o aplicativo, uma função cliente específica é chamada. E dependendo da ação, um callback é passado com a funcionalidade desejada, que será executada após a parte da rede processar a resposta do servidor ou notificar o modelo de um erro. Em caso de ações incorretas, o aplicativo processará e notificará o usuário sobre a imprecisão dos dados inseridos ou outras ações (login ou senha incorretos, usuário já cadastrado, amigo inexistente ou amigo já na lista, etc.). O número de solicitações ao servidor foi reduzido: IDs exclusivos são alocados para notificar todos os usuários no chat, que são usados em vez de solicitações. Existe uma proteção contra usuários impacientes: não adianta clicar no mesmo botão várias vezes, sempre enviando uma solicitação,na esperança de obter uma resposta do servidor o mais rápido possível :)
A parte da rede interage com o servidor remoto. O cliente assíncrono é executado em um thread dedicado separado e é escrito usando Boost Asio. O cliente mantém uma conexão TLS com o servidor. O formato de troca de dados é JSON. OpenSSL é usado para segurança. A interação com a parte da rede ocorre por meio de retornos de chamada. Alguns retornos de chamada são executados uma vez depois de receber uma resposta do servidor, enquanto outros são definidos para toda a duração da operação do aplicativo e são acionados sempre que certas informações são recebidas do servidor (análogo ao observador no Google Firestore). Para algumas informações que raramente são atualizadas, um cache é implementado usando SQLite.
O servidor TCP assíncrono também é escrito usando Boost Asio e OpenSSL. O servidor identifica conexões com IDs exclusivos e delega sua execução a uma instância da classe de lógica de negócios usando uma fila de solicitações. Além disso, os autores que usam a biblioteca mongocxx escreveram uma classe de wrapper para trabalhar com o MongoDB. Ao criá-lo, a biblioteca mongocxx foi usada. A lógica de negócios pode ser dividida condicionalmente em três partes: receber uma solicitação de um cliente na forma de JSON e analisá-la; trabalhar com a base de dados e, em alguns casos, verificar a sua correção; formação de uma resposta ao cliente. Além disso, a lógica de negócios foi implementada como uma biblioteca dinâmica, de modo que seria mais conveniente combiná-la com as partes do servidor.
O esquema de troca de dados entre cliente e servidor:

E é assim que funciona a troca de dados com o banco de dados:

Equipe do projeto: Konstantin Pavlov, Sergey Alekseev, Nikolay Manzeev, Nikita Shchelkanov.
Repositório GitHub .
Vídeo da defesa do projeto .
Sistema de código de barras
Os autores criaram um sistema de código de barras para empresas que produzem todos os tipos de eletrônicos. O sistema é capaz de levar em consideração os produtos automaticamente, controlar a passagem dos produtos pelas várias etapas do processo tecnológico e permitir aumentar a automação da produção.
O sistema reduz a carga de controle da produção de produtos. Todas as informações relevantes estão disponíveis online. O sistema também elimina erros humanos ao contar produtos em diferentes estágios de produção.
Esquema de trabalho:

O software cliente permite gerar códigos de barras e cadastrar produtos manufaturados no banco de dados do servidor. Os performers usam leitores sem fio para ler os códigos de barras impressos na embalagem ou nos próprios produtos. O scanner envia informações sobre o código de barras digitalizado e pede ao banco de dados para registrar um novo produto.
O sistema requer um leitor de código de barras sem fio, como este:

Recursos de firmware:
- Um IDE de última geração que suporta exclusivamente a linguagem C.
- API C parcialmente documentada para digitalização e trabalho com teclas, display, luzes, WiFi, armazenamento interno.
- Existe um utilitário para carregar o firmware na memória.
Para tornar o scanner compatível com seu sistema de código de barras, os autores do projeto fizeram a engenharia reversa do IDE. Descobriu-se que o dispositivo está equipado com um microcontrolador STM32F103xx com núcleo ARMv7-M. Também conseguimos encontrar uma biblioteca estática com lógica de negócios para lidar com chamadas de API.
Ferramentas usadas para desenvolver o sistema:
- cc-arm-none-eabi (GNU ARM Toolchain) - um conjunto de ferramentas para desenvolvimento para a arquitetura ARM (compiladores , ++, ASM; ld, objdump).
- linker-script - para marcação Flash e RAM.
- cmake como um sistema de construção + arquivo de cadeia de ferramentas cmake para compilação cruzada para microcontroladores STM32 (graças ao repositório https://github.com/ObKo/stm32-cmake ) /
- Especificações, documentação, Stackoverflow, fóruns temáticos.
Tive que escrever os seguintes módulos:
- Uma classe de wrapper para interação do usuário por meio de chaves.
- "GUI" para trabalhar com o usuário.
- Pilha TCP-HTTP-JSON sobre a camada IP implementada na API do scanner.
- Uma classe wrapper sobre a API do scanner para ler códigos de barras e obter resultados de varredura.
Em seguida, a equipe escreveu um software cliente que permite a você:
- Autorizar usuário.
- Veja todos os modelos de produtos e informações sobre eles.
- Veja todos os dispositivos.
- Adicione dispositivos.
- Adicione modelos.
- Gere código de barras para o modelo.
- Imprimir código de barras na impressora
- Salve o código de barras no arquivo.
Este software foi escrito com:
- QtCreator (interface gráfica).
- Boost (implementação de rede e análise JSON).
- Bibliotecas para converter um ID de produto em um código de barras.
O servidor HTTP é construído usando Boost.beast, MySqlCppConnector, Boost.thread e OpenSSL. Suas tarefas:
- Recebendo solicitações HTTP.
- Acessando o banco de dados.
- Autenticação do usuário / scanner.
- Registro do usuário / scanner.
- Geração de códigos QR exclusivos.
- Enviando respostas HTTP.
O MySQL atua como um banco de dados.
Arquitetura de servidor e banco de dados:

Equipe do projeto: Daniil Cherny, Nikolay Umrikhin, Sergey Chepurnoy.
Vídeo da defesa do projeto .
Você pode ler mais sobre nossos projetos educacionais neste link . E com mais frequência vá ao canal Technostream , regularmente aparecem novos vídeos de treinamento sobre programação, desenvolvimento e outras disciplinas.