Registrador de Museu
Crie com Agente de IA
Backend do Registrador de Museu

Modelo de Backend do Aplicativo do Registrador de Museu
Controle de Localização de MuseuObjeto e Fluxos de Trabalho do Registrador

Um backend registrador de museu pronto para produção na Back4app com rastreamento de MuseuObjeto, propriedade de Coleção, atualizações de localização, fluxos de trabalho de Acordo de Empréstimo, histórico de Registro de Desacesso e auditoria de Registro de Atividade. Inclui diagrama ER, dicionário de dados, esquema JSON, playground de API e um prompt de Agente de IA para configuração rápida.

Registrar aprendizados

Este modelo fornece a você um backend de registrador de museu para registros de MuseumObject, atualizações de Localização, fluxos de trabalho de LoanAgreement, entradas de DeaccessionLog e histórico de ActivityLog, para que as equipes de coleções possam trabalhar a partir de uma única fonte compartilhada de verdade.

  1. Controle de localização de MuseumObjectModele cada MuseumObject com currentLocation, status, coleção, conditionSummary e provenanceNote para que os registradores possam acompanhar uma aquisição desde a galeria até o armazenamento.
  2. Fluxo de trabalho de LoanAgreementRastreie empréstimos de saída e entrada com status de LoanAgreement, loanNumber, borrowingInstitution, startDate, dueDate e signedBy da equipe.
  3. Responsabilidade de DeaccessionLogRegistre decisões de deacessão, etapas de aprovação e notas de finalDisposition em entradas de DeaccessionLog vinculadas a cada MuseumObject.
  4. Permissões amigáveis para registradoresUse regras de ACL e CLP para que registradores, curadores, gestores de coleções e conservadores toquem apenas nas classes às quais estão designados.
  5. API única para operações de coleçõesAtenda ferramentas web, móveis e administrativas por meio de uma camada REST e GraphQL para MuseumObject, Location, Collection, LoanAgreement, DeaccessionLog e ActivityLog.

O que é o Template do Aplicativo de Registrador de Museu?

Prazos em registradores de museus raramente são opcionais; uma camada de registro estruturada transforma datas em alertas em vez de surpresas. O ímpeto depende de um estado preciso. Com Collection, Location, MuseumObject, LoanAgreement e DeaccessionLog em Back4app, equipes de registradores de museus podem impor a separação de funções enquanto ainda colaboram no mesmo registro de caso. O esquema abrange User (username, email, password, role, fullName), Collection (accessionNumber, title, department, primaryCurator), Location (code, name, type, isSecure), MuseumObject (accessionNumber, objectTitle, objectType, collection, currentLocation, status), LoanAgreement (loanNumber, museumObject, loanType, borrowingInstitution, startDate, dueDate, signedBy, agreementStatus), DeaccessionLog (deaccessionNumber, museumObject, decisionDate, reason, approvedBy, finalDisposition, recordStatus) e ActivityLog (actor, museumObject, actionType, actionAt) com fluxos de trabalho de autenticação e registro incorporados. Conecte seu frontend preferido e entregue mais rápido.

Melhor para:

Sistemas de registradores de museusFerramentas de rastreamento de coleçõesFluxos de trabalho de contrato de empréstimoSistemas de registro de desinvestimentoAplicativos de localização de exibição e armazenamentoEquipes selecionando BaaS para operações de museus

Como este backend de Registro de Museu é organizado

Semanas de pico expõem a dívida do registrador do museu: os atalhos que pareciam adequados em janeiro se tornam a razão pela qual você perde os compromissos de fevereiro.

Use Collection, Location e MuseumObject como a lista de verificação para o escopo do MVP: se não estiver modelado, se tornará um paliativo em forma de planilha.

Recursos do Registrador de Museu

Cada cartão de tecnologia neste hub usa o mesmo esquema de backend do registrador de museu com User, Collection, Location, MuseumObject, LoanAgreement, DeaccessionLog e ActivityLog.

Gestão de MuseumObject

MuseumObject armazena accessionNumber, objectTitle, objectType, status, collection e currentLocation.

Rastreamento de localização

A localização captura código, nome, tipo e é seguro.

Fluxo de Trabalho do Acordo de Empréstimo

Acordo de Empréstimo links museumObject, loanNumber, loanType, borrowingInstitution, dueDate e agreementStatus.

RegistroDeDesacesso rastreando

RegistroDeDesacesso registra deaccessionNumber, decisionDate, reason, finalDisposition e recordStatus.

Por que construir o backend do seu aplicativo de Registrador de Museu com Back4app?

Back4app oferece aos registradores, curadores e gerentes de coleções as classes de que precisam para que a equipe possa se concentrar em números de acesso, localAtual e histórico de movimentação, em vez de infraestrutura.

  • MuseumObject e Location permanecem conectados: Os ponteiros de MuseumObject e Location mantêm o localAtual, status e propriedade da Coleção fáceis de consultar.
  • Os registros de LoanAgreement permanecem auditáveis: LoanAgreement armazena loanNumber, loanType, borrowingInstitution, startDate, dueDate, agreementStatus e signedBy para objetos de saída e entrada.
  • As entradas de DeaccessionLog são estruturadas desde o primeiro dia: DeaccessionLog captura deaccessionNumber, decisionDate, reason, approvedBy, finalDisposition e recordStatus para cada caso de remoção de objeto.

Construa o backend do registrador uma vez, e depois reutilize o mesmo esquema em todos os fluxos de trabalho de coleções e clientes.

Benefícios do Registrador

Um backend de museu que ajuda as equipes de coleção a manter o movimento, empréstimos e desacessos em ordem.

Busca de objetos mais rápida

Comece com MuseumObject e Location em vez de construir tabelas de acompanhamento de acesso e prateleira manualmente.

Administração de empréstimos mais limpa

Use os campos LoanAgreement como agreementStatus, dueDate, borrowingInstitution e signedBy para manter os empréstimos de saída e entrada visíveis.

Histórico de desassociação rastreável

Armazene decisões de desassociação no DeaccessionLog com decisionDate, reason, finalDisposition e approvedBy para revisão posterior.

Limites de permissão para funções de staff

Aplique regras de ACL e CLP para que os registradores possam editar registros de MuseumObject enquanto o restante da equipe só pode ler as localizações de objetos aprovadas.

Operações de coleção pesquisáveis

Consulte entradas de MuseumObject, Location, LoanAgreement, DeaccessionLog e ActivityLog sem redefinir o esquema a cada temporada.

Escorço assistido por IA

Gere um backend de registrador de museu e integrações iniciais a partir de um prompt estruturado.

Pronto para lançar seu aplicativo de registrador de museu?

Deixe o Agente de IA Back4app escorar seu backend de registrador e gerar fluxos de trabalho MuseumObject, LoanAgreement, DeaccessionLog e ActivityLog a partir de um prompt.

Gratuito para começar — 50 prompts de Agente de IA/mês, sem necessidade de cartão de crédito

Stack de Tecnologia de Museus

Tudo incluído neste modelo de backend de registro de museus.

Frontend
13+ tecnologias
Backend
Back4app
Banco de dados
MongoDB
Autenticação
Autenticação integrada + sessões
API
REST e GraphQL
Em tempo real
Live Queries

Diagrama ER do Museu

Modelo de relacionamento de entidades para o esquema de backend do registrador do museu.

Ver fonte do diagrama
Mermaid
erDiagram
    User ||--o{ Collection : "primaryCurator"
    User ||--o{ LoanAgreement : "signedBy"
    User ||--o{ DeaccessionLog : "approvedBy"
    User ||--o{ ActivityLog : "actor"
    Collection ||--o{ MuseumObject : "collection"
    Location ||--o{ MuseumObject : "currentLocation"
    MuseumObject ||--o{ LoanAgreement : "museumObject"
    MuseumObject ||--o{ DeaccessionLog : "museumObject"
    MuseumObject ||--o{ ActivityLog : "museumObject"

    User {
        String objectId PK
        String username
        String email
        String password
        String role
        String fullName
        Date createdAt
        Date updatedAt
    }

    Collection {
        String objectId PK
        String accessionNumber
        String title
        String department
        String primaryCuratorId FK
        Date createdAt
        Date updatedAt
    }

    Location {
        String objectId PK
        String code
        String name
        String type
        Boolean isSecure
        Date createdAt
        Date updatedAt
    }

    MuseumObject {
        String objectId PK
        String accessionNumber
        String objectTitle
        String objectType
        String collectionId FK
        String currentLocationId FK
        String status
        String conditionSummary
        String provenanceNote
        Date createdAt
        Date updatedAt
    }

    LoanAgreement {
        String objectId PK
        String loanNumber
        String museumObjectId FK
        String loanType
        String borrowingInstitution
        Date startDate
        Date dueDate
        String signedById FK
        String agreementStatus
        Date createdAt
        Date updatedAt
    }

    DeaccessionLog {
        String objectId PK
        String deaccessionNumber
        String museumObjectId FK
        Date decisionDate
        String reason
        String approvedById FK
        String finalDisposition
        String recordStatus
        Date createdAt
        Date updatedAt
    }

    ActivityLog {
        String objectId PK
        String actorId FK
        String museumObjectId FK
        String actionType
        String notes
        Date actionAt
        Date createdAt
        Date updatedAt
    }

Registrar Fluxo de Integração

Fluxo típico de execução para autenticação, consulta de MuseumObject, atualizações de localização, criação de LoanAgreement, registros de DeaccessionLog e atualizações de ActivityLog.

Ver fonte do diagrama
Mermaid
sequenceDiagram
  participant User
  participant App as Museum Registrar App
  participant Back4app as Back4app Cloud

  User->>App: Sign in as registrar, curator, or collections manager
  App->>Back4app: POST /login
  Back4app-->>App: Session token

  User->>App: Open object location board
  App->>Back4app: GET /classes/MuseumObject?include=collection,currentLocation&order=accessionNumber
  Back4app-->>App: MuseumObject list with Location and Collection pointers

  User->>App: Record a transfer to storage or gallery
  App->>Back4app: PUT /classes/MuseumObject/{objectId}
  Back4app-->>App: Updated currentLocation and status

  User->>App: Create a loan agreement or deaccession log
  App->>Back4app: POST /classes/LoanAgreement or /classes/DeaccessionLog
  Back4app-->>App: Agreement or log saved

  App->>Back4app: Subscribe to ActivityLog updates
  Back4app-->>App: Live updates for object movements and record changes

Guia de Campo do Museu

Referência completa em nível de campo para cada classe no esquema de registro do museu.

CampoTipoDescriçãoObrigatório
objectIdStringAuto-generated unique identifierAuto
usernameStringUser login name
emailStringUser email address
passwordStringHashed password (write-only)
roleStringRole of the user (e.g., registrar, curator, collections-manager, conservator, read-only-staff)
fullNameStringDisplay name for staff and stakeholders
createdAtDateAuto-generated creation timestampAuto
updatedAtDateAuto-generated last-update timestampAuto

8 campos em User

Registrar Segurança e Permissões

Como a estratégia de ACL e CLP protege os registros de MuseumObject, documentos de empréstimo e notas de deacessão.

Acesso baseado em função de registrador

Registradores podem criar e editar entradas de MuseumObject, Localização, Acordo de Empréstimo e Log de Deacessão; outros funcionários têm acesso somente leitura, quando apropriado.

Controle de empréstimo e deacessão

Restringir o acesso de gravação a Acordo de Empréstimo e Log de Deacessão para que as aprovações fiquem com a equipe de coleções autorizada.

Integridade do histórico do objeto

Use o Cloud Code para validar atualizações de currentLocation e adicionar ActivityLog antes de salvar as alterações de movimento.

Esquema JSON

Definição do esquema JSON bruto pronta para copiar para Back4app ou usar como referência de implementação.

JSON
{
  "classes": [
    {
      "className": "User",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "username": {
          "type": "String",
          "required": true
        },
        "email": {
          "type": "String",
          "required": true
        },
        "password": {
          "type": "String",
          "required": true
        },
        "role": {
          "type": "String",
          "required": true
        },
        "fullName": {
          "type": "String",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Collection",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "accessionNumber": {
          "type": "String",
          "required": true
        },
        "title": {
          "type": "String",
          "required": true
        },
        "department": {
          "type": "String",
          "required": true
        },
        "primaryCurator": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "Location",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "code": {
          "type": "String",
          "required": true
        },
        "name": {
          "type": "String",
          "required": true
        },
        "type": {
          "type": "String",
          "required": true
        },
        "isSecure": {
          "type": "Boolean",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "MuseumObject",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "accessionNumber": {
          "type": "String",
          "required": true
        },
        "objectTitle": {
          "type": "String",
          "required": true
        },
        "objectType": {
          "type": "String",
          "required": true
        },
        "collection": {
          "type": "Pointer",
          "required": true,
          "targetClass": "Collection"
        },
        "currentLocation": {
          "type": "Pointer",
          "required": true,
          "targetClass": "Location"
        },
        "status": {
          "type": "String",
          "required": true
        },
        "conditionSummary": {
          "type": "String",
          "required": false
        },
        "provenanceNote": {
          "type": "String",
          "required": false
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "LoanAgreement",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "loanNumber": {
          "type": "String",
          "required": true
        },
        "museumObject": {
          "type": "Pointer",
          "required": true,
          "targetClass": "MuseumObject"
        },
        "loanType": {
          "type": "String",
          "required": true
        },
        "borrowingInstitution": {
          "type": "String",
          "required": true
        },
        "startDate": {
          "type": "Date",
          "required": true
        },
        "dueDate": {
          "type": "Date",
          "required": true
        },
        "signedBy": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "agreementStatus": {
          "type": "String",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "DeaccessionLog",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "deaccessionNumber": {
          "type": "String",
          "required": true
        },
        "museumObject": {
          "type": "Pointer",
          "required": true,
          "targetClass": "MuseumObject"
        },
        "decisionDate": {
          "type": "Date",
          "required": true
        },
        "reason": {
          "type": "String",
          "required": true
        },
        "approvedBy": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "finalDisposition": {
          "type": "String",
          "required": true
        },
        "recordStatus": {
          "type": "String",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    },
    {
      "className": "ActivityLog",
      "fields": {
        "objectId": {
          "type": "String",
          "required": false
        },
        "actor": {
          "type": "Pointer",
          "required": true,
          "targetClass": "User"
        },
        "museumObject": {
          "type": "Pointer",
          "required": true,
          "targetClass": "MuseumObject"
        },
        "actionType": {
          "type": "String",
          "required": true
        },
        "notes": {
          "type": "String",
          "required": false
        },
        "actionAt": {
          "type": "Date",
          "required": true
        },
        "createdAt": {
          "type": "Date",
          "required": false
        },
        "updatedAt": {
          "type": "Date",
          "required": false
        }
      }
    }
  ]
}

Construir com o Agente de IA

Use o Agente de IA Back4app para gerar um aplicativo real de registrador de museu a partir deste modelo, incluindo frontend, backend, autenticação e fluxos de objeto, empréstimo e desativação.

Agente de IA Back4app
Pronto para construir
Crie um backend de App Registrador de Museu no Back4app com este exato esquema e comportamento.

Esquema:
1. Usuário (usar o built-in do Back4app): nome de usuário, e-mail, senha, função, nomeCompleto; objectId, createdAt, updatedAt (sistema).
2. Coleção: númeroDeAcesso (String, obrigatório), título (String, obrigatório), departamento (String, obrigatório), curadorPrimário (Ponteiro para Usuário, obrigatório); objectId, createdAt, updatedAt (sistema).
3. Localização: código (String, obrigatório), nome (String, obrigatório), tipo (String, obrigatório), éSeguro (Booleano, obrigatório); objectId, createdAt, updatedAt (sistema).
4. ObjetoDoMuseu: númeroDeAcesso (String, obrigatório), títuloDoObjeto (String, obrigatório), tipoDeObjeto (String, obrigatório), coleção (Ponteiro para Coleção, obrigatório), localizaçãoAtual (Ponteiro para Localização, obrigatório), status (String, obrigatório), resumoDoEstado (String, opcional), notaDeProveniência (String, opcional); objectId, createdAt, updatedAt (sistema).
5. AcordoDeEmpréstimo: númeroDoEmpréstimo (String, obrigatório), objetoDoMuseu (Ponteiro para ObjetoDoMuseu, obrigatório), tipoDeEmpréstimo (String, obrigatório), instituiçãoDeEmpréstimo (String, obrigatório), dataDeInício (Data, obrigatório), dataDeVencimento (Data, obrigatório), assinadoPor (Ponteiro para Usuário, obrigatório), statusDoAcordo (String, obrigatório); objectId, createdAt, updatedAt (sistema).
6. LogDeDesacesso: númeroDeDesacesso (String, obrigatório), objetoDoMuseu (Ponteiro para ObjetoDoMuseu, obrigatório), dataDaDecisão (Data, obrigatório), motivo (String, obrigatório), aprovadoPor (Ponteiro para Usuário, obrigatório), disposiçãoFinal (String, obrigatório), statusDoRegistro (String, obrigatório); objectId, createdAt, updatedAt (sistema).
7. LogDeAtividades: ator (Ponteiro para Usuário, obrigatório), objetoDoMuseu (Ponteiro para ObjetoDoMuseu, obrigatório), tipoDeAção (String, obrigatório), notas (String, opcional), açãoEm (Data, obrigatório); objectId, createdAt, updatedAt (sistema).

Segurança:
- As funções de registrador, curador e gestor de coleções podem criar e editar registros de ObjetoDoMuseu, Localização, AcordoDeEmpréstimo e LogDeDesacesso de acordo com suas responsabilidades.
- Limitar o acesso de gravação a registros de coleção e objeto para pessoal autorizado.
- Manter entradas de empréstimo e desacesso auditáveis; preservar o histórico do LogDeAtividades.

Autenticação:
- Inscrição, login, logout.

Comportamento:
- Rastrear locais de objetos, gerenciar acordos de empréstimo e registrar logs de desacesso.
- Mostrar coleções por departamento e objetos por localizaçãoAtual e status.
- Salvar notas de atividade quando um ObjetoDoMuseu se move, um empréstimo é assinado ou um desacesso é aprovado.

Entregar:
- App Back4app com esquema, CLPs, ACLs, e uma interface para registradores, curadores, gestores de coleções e conservadores gerenciarem o movimento de objetos, documentação de empréstimo e fluxos de trabalho de desacesso.

Pressione o botão abaixo para abrir o Agente com este prompt de modelo pré-preenchido.

Este é o prompt base sem um sufixo de tecnologia. Você pode adaptar a pilha de frontend gerada depois.

Implantar em minutos50 prompts gratuitos / mêsSem necessidade de cartão de crédito

Sandbox da API

Experimente os endpoints REST e GraphQL contra o esquema do registrador de museu. As respostas usam dados fictícios e não requerem uma conta Back4app.

Carregando sandbox…

Usa o mesmo esquema que este template.

Escolha Sua Tecnologia

Expanda cada cartão para ver como integrar Collection, Location e MuseumObject com sua pilha escolhida.

Backend de Registrador de Museu Flutter

Backend de Registrador de Museu React

Backend de Registrador de Museu React Nativo

Backend de Registrador de Museu Next.js

Backend de Registrador de Museu JavaScript

Backend de Registrador de Museu Android

Backend de Registrador de Museu iOS

Backend de Registrador de Museu Vue

Backend de Registrador de Museu Angular

Backend de Registrador de Museu GraphQL

Backend de Registrador de Museu REST API

Backend de Registrador de Museu PHP

Backend de Registrador de Museu .NET

O que você ganha com cada tecnologia

Cada pilha usa o mesmo esquema de backend do registrador de museus e contratos de API.

Estrutura de dados unificada para museus

Gerencie registros de MuseumObject, entradas de Location, arquivos de LoanAgreement e notas de DeaccessionLog com um único esquema.

Rastreamento de localização de objetos para equipes de coleções

Mantenha currentLocation e histórico de atividades legíveis para registradores e curadores.

Fluxos de trabalho de acordos de empréstimo para museus

Armazenar borrowingInstitution, dueDate, agreementStatus e signedBy em um fluxo estruturado.

Documentação de deaccession para museus

Registrar recordStatus, decisionDate e reason for review e audit.

REST/GraphQL APIs para aplicativos de museus

Conecte ferramentas web, móveis e internas usando APIs flexíveis.

Arquitetura extensível para operações de coleções

Adicione campos ou classes conforme o accessioning e as exposições evoluem.

Comparação de Pilhas de Registrador de Museu

Compare a velocidade de configuração, o estilo do SDK e o suporte de IA entre todas as tecnologias suportadas.

FrameworkTempo de ConfiguraçãoBenefício do Registrador de MuseuTipo de SDKSuporte de IA
Cerca de 5 minCódigo base único para registrar ferramentas móveis e da web.SDK TipadoCompleto
Menos de 5 minutosPainel da web rápido para rastreamento de objetos.SDK tipadoCompleto
~3–7 minAplicativo móvel multidisciplinar para a equipe de coleções.SDK tipadoCompleto
Configuração rápida (5 min)Portal de registro renderizado no servidor para a equipe.SDK tipadoCompleto
~3–5 minIntegração web leve para ferramentas de registro.SDK TypedCompleto
Cerca de 5 minAplicativo nativo Android para rastreamento de galeria e armazenamento.SDK TypedCompleto
Menos de 5 minutosAplicativo nativo iOS para equipe do museu.SDK TypedCompleto
~3–7 minReact interface web para operações de coleções.SDK TipadoCompleto
Configuração rápida (5 min)Aplicativo web empresarial para fluxos de trabalho de registro.SDK TipadoCompleto
Menos de 2 minAPI flexível GraphQL para visualizações de objetos e empréstimos.GraphQL APICompleto
Configuração rápida (2 min)Integração REST API para sistemas de registro.REST APICompleto
~3 minBackend PHP do lado do servidor para ferramentas de museus.REST APICompleto
~3–7 minBackend .NET para gerenciamento de coleções.SDK TipadoCompleto

O tempo de configuração reflete a duração esperada desde a inicialização do projeto até a primeira consulta MuseumObject ou LoanAgreement usando este esquema de template.

Perguntas do Registrador do Museu

Perguntas comuns sobre como construir um backend de registrador de museu com este modelo.

Como as práticas de registradores de museus mantêm a qualidade de entrada alta à medida que o volume cresce?
Como as equipes de registradores de museus devem modelar clientes, assuntos e transferências internas sem ambiguidade?
Podemos integrar assinatura eletrônica ou armazenamento de documentos sem fragmentar o registro do registrador do museu?
Como faço para executar consultas para objetos de museu e localizações com Flutter?
Como gerencio o acesso do registrador do museu com Next.js Server Actions?
O React Native pode armazenar acordos de empréstimo offline?
Como evito edições de desincorporação não autorizadas?
Qual é a melhor maneira de mostrar números de acesso no Android?
Como funciona o fluxo de movimento de objetos de ponta a ponta?
Quais classes impulsionam este modelo de registro de museu?

Confiado por desenvolvedores em todo o mundo

Junte-se a equipes que lançam produtos de registro de museus mais rapidamente com templates Back4app

G2 Users Love Us Badge

Pronto para construir seu aplicativo de registro de museus?

Comece seu projeto de registrador de museu em minutos. Não é necessário cartão de crédito.

Escolha Tecnologia