Registrador de museos
Construir con Agente AI
Backend de Registro de Museo

Plantilla de Backend de Aplicación de Registro de Museo
Control de Ubicación de Objetos de Museo y Flujos de Trabajo de Registradores

Un backend de registrador de museo listo para producción en Back4app con seguimiento de Objetos de Museo, propiedad de Colección, actualizaciones de ubicación, flujos de trabajo de Acuerdos de Préstamo, historial de Registros de Desaccesión y auditoría de Registros de Actividad. Incluye diagrama ER, diccionario de datos, esquema JSON, área de pruebas de API y un prompt de Agente de IA para una configuración rápida.

Registrar conclusiones

Esta plantilla te proporciona un backend de registrador de museo para registros de MuseumObject, actualizaciones de ubicación, flujos de trabajo de LoanAgreement, entradas de DeaccessionLog e historial de ActivityLog para que los equipos de colecciones puedan trabajar a partir de una única fuente de verdad compartida.

  1. Control de ubicación de MuseumObjectModela cada MuseumObject con currentLocation, status, collection, conditionSummary y provenanceNote para que los registradores puedan seguir un acceso de la galería al almacenamiento.
  2. Flujo de trabajo de LoanAgreementRastrea préstamos salientes y entrantes con el estado de LoanAgreement, loanNumber, borrowingInstitution, startDate, dueDate y firmado por el personal.
  3. Responsabilidad de DeaccessionLogRegistra decisiones de deaccesión, pasos de aprobación y notas de finalDisposition en entradas de DeaccessionLog asociadas a cada MuseumObject.
  4. Permisos amigables para registradoresUtiliza reglas ACL y CLP para que los registradores, curadores, gerentes de colecciones y conservadores solo toquen las clases a las que están asignados.
  5. API única para operaciones de coleccionesSirve herramientas web, móviles y de administración a través de una capa REST y GraphQL para MuseumObject, Location, Collection, LoanAgreement, DeaccessionLog y ActivityLog.

¿Qué es la plantilla de la aplicación del registrador del museo?

Los plazos en el registrador del museo rara vez son opcionales; una capa de registro estructurada convierte las fechas en alertas en lugar de sorpresas. El impulso depende de un estado preciso. Con Collection, Location, MuseumObject, LoanAgreement y DeaccessionLog en Back4app, los equipos del registrador del museo pueden hacer cumplir la separación de funciones mientras colaboran en el mismo registro de caso. El esquema cubre Usuario (nombre de usuario, correo electrónico, contraseña, rol, nombre completo), Colección (número de acceso, título, departamento, curador principal), Ubicación (código, nombre, tipo, es seguro), MuseumObject (número de acceso, título del objeto, tipo de objeto, colección, ubicación actual, estado), LoanAgreement (número de préstamo, objeto del museo, tipo de préstamo, institución prestataria, fecha de inicio, fecha de vencimiento, firmado por, estado del acuerdo), DeaccessionLog (número de des-acceso, objeto del museo, fecha de decisión, razón, aprobado por, disposición final, estado del registro), y ActivityLog (actor, objeto del museo, tipo de acción, acción en) con flujos de trabajo de autorización y mantenimiento de registros integrados. Conecta tu frontend preferido y envía más rápido.

Mejor para:

Sistemas de registradores de museoHerramientas de seguimiento de coleccionesFlujos de trabajo de acuerdos de préstamoSistemas de registro de desgravaciónAplicaciones de ubicación de exposiciones y almacenamientoEquipos eligiendo BaaS para operaciones museísticas

Cómo está organizado este backend de Registrador de Museo

Las semanas pico exponen la deuda del registrador del museo: los atajos que parecían bien en enero se convierten en la razón por la que pierdes compromisos de febrero.

Utiliza Collection, Location y MuseumObject como la lista de verificación para el alcance del MVP: si no está modelado, se convertirá en una solución alternativa basada en hojas de cálculo.

Características del Registrador de Museo

Cada tarjeta de tecnología en este hub utiliza el mismo esquema de backend de registrador de museo con Usuario, Colección, Ubicación, ObjetoMuseo, AcuerdoDePréstamo, RegistroDeAccesión y RegistroDeActividad.

Gestión de MuseumObject

MuseumObject almacena accessionNumber, objectTitle, objectType, status, collection y currentLocation.

Seguimiento de ubicación

La ubicación captura código, nombre, tipo y esSecure.

Flujo de trabajo de Acuerdo de Préstamo

El Acuerdo de Préstamo vincula objetoMuseum, númeroDePréstamo, tipoDePréstamo, instituciónDePréstamo, fechaDeVencimiento y estadoDelAcuerdo.

Seguimiento de RegistroDeAccesión

El RegistroDeAccesión registra númeroDeDeaccesión, fechaDeDecisión, motivo, disposiciónFinal y estadoDelRegistro.

¿Por qué construir la parte posterior de su aplicación de registrador de museo con Back4app?

Back4app proporciona a registradores, curadores y gerentes de colecciones las clases que necesitan para que el equipo pueda centrarse en los números de acceso, currentLocation y el historial de movimientos en lugar de la infraestructura.

  • MuseumObject y Location permanecen conectados: Los punteros de MuseumObject y Location facilitan la consulta de currentLocation, estado y propiedad de la colección.
  • Los registros de LoanAgreement son auditables: LoanAgreement almacena loanNumber, loanType, borrowingInstitution, startDate, dueDate, agreementStatus y signedBy para objetos salientes y entrantes.
  • Las entradas de DeaccessionLog están estructuradas desde el primer día: DeaccessionLog captura deaccessionNumber, decisionDate, reason, approvedBy, finalDisposition y recordStatus para cada caso de eliminación de objeto.

Construya la parte posterior del registrador una vez, luego reutilice el mismo esquema en cada flujo de trabajo de colecciones y cliente.

Beneficios del Registrador

Un backend de museo que ayuda a los equipos de colecciones a mantener en orden los movimientos, préstamos y deaccesiones.

Búsqueda de objetos más rápida

Comience con MuseumObject y Location en lugar de crear manualmente tablas de seguimiento de acceso y estantes.

Administración de préstamos más limpia

Utilice campos de LoanAgreement como agreementStatus, dueDate, borrowingInstitution y signedBy para mantener visibles los préstamos salientes y entrantes.

Historial de deaccesiones rastreable

Almacene las decisiones de deaccesión en DeaccessionLog con decisionDate, reason, finalDisposition y approvedBy para revisión posterior.

Límites de permiso para roles de personal

Aplique reglas de ACL y CLP para que los registradores puedan editar registros de MuseumObject mientras que el personal más amplio solo lee las ubicaciones de objetos aprobadas.

Operaciones de colección buscables

Consultas sobre MuseumObject, Location, LoanAgreement, DeaccessionLog y entradas de ActivityLog sin restablecer el esquema cada temporada.

Estructura asistida por IA

Genera un backend de registrador de museo e integraciones iniciales a partir de un aviso estructurado.

¿Listo para lanzar tu aplicación de registrador de museo?

Deja que el Agente de IA de Back4app estructure tu backend de registrador y genere flujos de trabajo de MuseumObject, LoanAgreement, DeaccessionLog y ActivityLog a partir de un solo aviso.

Gratis para comenzar — 50 avisos de Agente de IA/mes, no se requiere tarjeta de crédito

Stack tecnológico para museos

Todo incluido en esta plantilla de backend del registrador de museos.

Interfaz de usuario
13+ tecnologías
Backend
Back4app
Base de datos
MongoDB
Autenticación
Autenticación y sesiones integradas
API
REST y GraphQL
Tiempo real
Live Queries

Diagrama ER del museo

Modelo de relación de entidades para el esquema del backend del registrador del museo.

Ver fuente del 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 flujo de integración

Flujo de ejecución típico para autenticación, búsqueda de MuseumObject, actualizaciones de ubicación, creación de LoanAgreement, registros de DeaccessionLog y actualizaciones de ActivityLog.

Ver fuente del 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

Guía de campo del museo

Referencia completa a nivel de campo para cada clase en el esquema de registro del museo.

CampoTipoDescripciónRequerido
objectIdStringAuto-generated unique identifierAutomático
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 timestampAutomático
updatedAtDateAuto-generated last-update timestampAutomático

8 campos en User

Registrar Seguridad y Permisos

Cómo la estrategia de ACL y CLP protege los registros de MuseumObject, la documentación de préstamos y las notas de de-acceso.

Acceso de registrador basado en roles

Los registradores pueden crear y editar entradas de MuseumObject, Location, LoanAgreement y DeaccessionLog; el personal restante tiene acceso de solo lectura donde sea apropiado.

Control de préstamos y de-acceso

Restringir el acceso de escritura a LoanAgreement y DeaccessionLog para que las aprobaciones permanezcan con el personal autorizado de colecciones.

Integridad del historial del objeto

Utiliza Cloud Code para validar las actualizaciones de currentLocation y agregar ActivityLog antes de guardar los cambios de movimiento.

Esquema JSON

Definición de esquema JSON en bruto lista para copiar en Back4app o usar como referencia de implementación.

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 con el Agente de IA

Utiliza el Agente de IA de Back4app para generar una aplicación real de registrador de museo a partir de esta plantilla, incluyendo frontend, backend, autenticación y flujos de objeto, préstamo y desafectación.

Agente de IA de Back4app
Listo para construir
Cree un backend para la aplicación de registro de museo en Back4app con este esquema y comportamiento exactos.

Esquema:
1. Usuario (usar Back4app incorporado): nombre de usuario, correo electrónico, contraseña, rol, nombre completo; objectId, createdAt, updatedAt (sistema).
2. Colección: número de acceso (String, requerido), título (String, requerido), departamento (String, requerido), curador principal (Puntero a Usuario, requerido); objectId, createdAt, updatedAt (sistema).
3. Ubicación: código (String, requerido), nombre (String, requerido), tipo (String, requerido), esSeguro (Booleano, requerido); objectId, createdAt, updatedAt (sistema).
4. ObjetoMuseo: número de acceso (String, requerido), títuloObjeto (String, requerido), tipoObjeto (String, requerido), colección (Puntero a Colección, requerido), ubicaciónActual (Puntero a Ubicación, requerido), estado (String, requerido), resumenCondición (String, opcional), notaProveniencia (String, opcional); objectId, createdAt, updatedAt (sistema).
5. AcuerdoPréstamo: númeroPréstamo (String, requerido), objetoMuseo (Puntero a ObjetoMuseo, requerido), tipoPréstamo (String, requerido), instituciónPrestamista (String, requerido), fechaInicio (Fecha, requerido), fechaVencimiento (Fecha, requerido), firmadoPor (Puntero a Usuario, requerido), estadoAcuerdo (String, requerido); objectId, createdAt, updatedAt (sistema).
6. RegistroDeAccesión: númeroAccesión (String, requerido), objetoMuseo (Puntero a ObjetoMuseo, requerido), fechaDecisión (Fecha, requerido), razón (String, requerido), aprobadoPor (Puntero a Usuario, requerido), disposiciónFinal (String, requerido), estadoRegistro (String, requerido); objectId, createdAt, updatedAt (sistema).
7. RegistroDeActividad: actor (Puntero a Usuario, requerido), objetoMuseo (Puntero a ObjetoMuseo, requerido), tipoAcción (String, requerido), notas (String, opcional), acciónEn (Fecha, requerido); objectId, createdAt, updatedAt (sistema).

Seguridad:
- Roles de registrar, curador y gerente de colecciones pueden crear y editar registros de ObjetoMuseo, Ubicación, AcuerdoPréstamo y RegistroDeAccesión de acuerdo a su responsabilidad.
- Limitar el acceso de escritura a los registros de colección y objeto al personal autorizado.
- Mantener las entradas de préstamo y acceso auditables; preservar el historial de RegistroDeActividad.

Autenticación:
- Registrarse, iniciar sesión, cerrar sesión.

Comportamiento:
- Rastrear ubicaciones de objetos, gestionar acuerdos de préstamo y registrar accesiones.
- Mostrar colecciones por departamento y objetos por ubicaciónActual y estado.
- Guardar notas de actividad cuando un ObjetoMuseo se mueve, se firma un préstamo o se aprueba una accesión.

Entregar:
- Aplicación Back4app con esquema, CLPs, ACLs y una interfaz para registradores, curadores, gerentes de colecciones y conservadores para gestionar el movimiento de objetos, la documentación de préstamos y los flujos de trabajo de acceso.

Presiona el botón de abajo para abrir el Agente con este aviso de plantilla pre-completado.

Este es el aviso base sin un sufijo tecnológico. Puede adaptar la pila de frontend generada después.

Desplegar en minutos50 avisos gratis / mesNo se requiere tarjeta de crédito

API Sandbox

Pruebe REST y los puntos finales de GraphQL contra el esquema de registro de museo. Las respuestas utilizan datos simulados y no requieren una cuenta de Back4app.

Cargando sandbox…

Utiliza el mismo esquema que esta plantilla.

Elige tu tecnología

Expande cada tarjeta para ver cómo integrar Collection, Location y MuseumObject con tu pila elegida.

Flutter Registrador de museo Backend

React Registrador de museo Backend

React Nativo Registrador de museo Backend

Next.js Registrador de museo Backend

JavaScript Registrador de museo Backend

Android Registrador de museo Backend

iOS Registrador de museo Backend

Vue Registrador de museo Backend

Angular Registrador de museo Backend

GraphQL Registrador de museo Backend

REST API Registrador de museo Backend

PHP Registrador de museo Backend

.NET Registrador de museo Backend

Lo que obtienes con cada tecnología

Cada pila utiliza el mismo esquema de backend del registrador de museo y contratos de API.

Estructura de datos unificada del museo

Gestiona registros de MuseumObject, entradas de Location, archivos de LoanAgreement y notas de DeaccessionLog con un solo esquema.

Seguimiento de ubicación de objetos para equipos de colecciones

Mantén currentLocation y el historial de actividad legibles para registradores y curadores.

Flujos de trabajo de acuerdos de préstamo para museos

Almacenar borrowingInstitution, dueDate, agreementStatus y signedBy en un flujo estructurado.

Documentación de desincorporación para museos

Registrar recordStatus, decisionDate y razón de revisión y auditoría.

REST/GraphQL APIs para aplicaciones de museos

Conectar herramientas web, móviles e internas utilizando APIs flexibles.

Arquitectura extensible para operaciones de colecciones

Agregar campos o clases a medida que la incorporación y las exposiciones evolucionan.

Comparación de la Pilas de Registrador del Museo

Compara la velocidad de configuración, el estilo del SDK y el soporte de IA entre todas las tecnologías soportadas.

MarcoTiempo de configuraciónBeneficio del registrador de museosTipo de SDKSoporte de IA
Aproximadamente 5 minCódigo base único para registrar herramientas móviles y web.SDK tipadoCompleto
Menos de 5 minutosPanel web rápido para seguimiento de objetos.SDK tipadoCompleto
~3–7 minApp móvil multiplataforma para el personal de colecciones.SDK tipadoCompleto
Configuración rápida (5 min)Portal de registro renderizado en el servidor para el personal.SDK tipadoCompleto
~3–5 minIntegración web ligera para herramientas de registro.SDK tipadoCompleto
Acerca de 5 minAplicación nativa de Android para seguimiento de galería y almacenamiento.SDK tipadoCompleto
Menos de 5 minutosAplicación nativa de iOS para el personal del museo.SDK tipadoCompleto
~3–7 minInterfaz web React para operaciones de colecciones.SDK tipadoCompleto
Configuración rápida (5 min)Aplicación web empresarial para flujos de trabajo de registro.SDK tipadoCompleto
Menos de 2 minAPI GraphQL flexible para vistas de objetos y préstamos.API GraphQLCompleto
Configuración rápida (2 min)Integración de REST API para sistemas de registro.REST APICompleto
~3 minBackend de PHP del lado del servidor para herramientas de museo.REST APICompleto
~3–7 minBackend de .NET para gestión de colecciones.SDK tipadoCompleto

El tiempo de configuración refleja la duración esperada desde el inicio del proyecto hasta la primera consulta de MuseumObject o LoanAgreement utilizando este esquema de plantilla.

Preguntas del Registrador del Museo

Preguntas comunes sobre cómo construir un backend de registrador de museo con esta plantilla.

¿Cómo mantienen las prácticas de registradores de museos una alta calidad de ingreso a medida que crece el volumen?
¿Cómo deben modelar los equipos de registradores de museos a los clientes, asuntos y traspasos internos sin ambigüedad?
¿Podemos integrar firma electrónica o almacenamiento de documentos sin fragmentar el registro del registrador del museo?
¿Cómo realizo consultas para objetos de museo y ubicaciones con Flutter?
¿Cómo gestiono el acceso del registrador del museo con Next.js Server Actions?
¿Puede React almacenar en caché los acuerdos de préstamo sin conexión?
¿Cómo puedo evitar ediciones de desincorporación no autorizadas?
¿Cuál es la mejor manera de mostrar los números de acceso en Android?
¿Cómo funciona el flujo de movimiento de objetos de extremo a extremo?
¿Qué clases alimentan esta plantilla de registro de museo?

Confiado por desarrolladores en todo el mundo

Únete a equipos que envían productos de registro de museo más rápido con plantillas de Back4app

G2 Users Love Us Badge

¿Listo para construir tu aplicación de registro de museo?

Comienza tu proyecto de registrador de museo en minutos. No se requiere tarjeta de crédito.

Elige tecnología