Visão Geral da Arquitetura
O sistema proposto permite o agendamento de sessões fotográficas entre fotógrafos e clientes, utilizando uma arquitetura baseada em Java com o framework Spring MVC (parte do SSM), persistência via MyBatis, visualização com JSP e integração com o front end Vue.js. O banco de dados relacional é gerenciado pelo MySQL, garantindo robustez e escalabilidade.
Stack Tecnológica
Backend com Spring Boot
O Spring Boot simplifica a configuração e o deploy de aplicações Spring, fornecendo um servidor embarcado (como Tomcat) e autoconfiguração para dependências. Isso reduz a complexidade do setup inicial e acelera o desenvolvimento.
Frontend com Vue.js
O Vue.js é empregado para construir interfaces de usuário interativas e responsivas. Seu modelo baseado em componentes e reatividade facilita a gestão de estados complexos em aplicações de página única (SPA).
Banco de Dados MySQL
O MySQL é utilizado como sistema de gerenciamento de banco de dados relacional, oferecendo alta performance, confiabilidade e suporte a múltiplos motores de armazenamento como InnoDB para transações ACID.
Exemplos de Código
Configuração da Aplicação (application.yml)
server:
tomcat:
uri-encoding: UTF-8
port: 8090
servlet:
context-path: /fotografia-app
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_agendamento_fotos?useSSL=false&serverTimezone=UTC
username: app_user
password: s3nh4Segur4!
servlet:
multipart:
max-file-size: 200MB
max-request-size: 200MB
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.fotografia.entity
global-config:
id-type: auto
field-strategy: not_null
db-column-underline: true
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Mapeamento de Entidade com MyBatis (FotografoMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.fotografia.dao.FotografoMapper">
<resultMap id="fotografoResultMap" type="com.fotografia.entity.Fotografo">
<id property="codigo" column="codigo_fotografo"/>
<result property="nomeCompleto" column="nome_completo"/>
<result property="especializacao" column="area_especializacao"/>
<result property="numeroTelefone" column="telefone_contato"/>
<result property="emailContato" column="email"/>
<result property="portfolioUrl" column="link_portfolio"/>
</resultMap>
<select id="buscarTodos" resultMap="fotografoResultMap">
SELECT * FROM fotografos WHERE status_ativo = 1
</select>
<select id="buscarPorEspecializacao" resultMap="fotografoResultMap">
SELECT * FROM fotografos
<where>
area_especializacao = #{especializacao}
AND status_ativo = 1
</where>
</select>
<insert id="inserirFotografo" parameterType="com.fotografia.entity.Fotografo">
INSERT INTO fotografos (nome_completo, area_especializacao, telefone_contato, email, link_portfolio)
VALUES (#{nomeCompleto}, #{especializacao}, #{numeroTelefone}, #{emailContato}, #{portfolioUrl})
</insert>
</mapper>