En este post escribiré los detalles del código fuente para mi sistema gratuito para restaurantes. Te enseñaré a compilarlo y te enseñaré algunos de sus detalles para tenerlo en tu plataforma favorita.

El programa está hecho con Vue, Buefy, Golang, SQLite3. Utiliza JWT para la autentificación, Gorilla para crear la API REST y NSIS para el instalador.

Recuerda que, como está hecho con Go, C y Node, puede compilar en cualquier plataforma que soporte Go y C. Así que puedes compilar en Linux, Android, Mac, Windows, Raspberry Pi, servidores de internet y cualquier otra que soporte estos lenguajes.

Instalando herramientas

Vas a necesitar Node, Golang y C. Puedes usar cualquier editor. Yo utilizo VSCode pero incluso con Vim funciona (yo he programado con él en Termux). Aquí te dejo unos tutoriales:

Instala NPM: https://parzibyte.me/blog/2018/09/27/instalar-npm-node-js-windows/

Instala Go: https://parzibyte.me/blog/2017/12/07/instalar-configurar-go-golang-en-windows-10/

Instala el compilador de C: https://parzibyte.me/blog/2021/08/23/instalar-gcc-msys2-compilador-c-cpp/

Debes agregar cada carpeta contenedora del ejecutable a la PATH. Algunos lo hacen automáticamente y en los que no, yo indico cómo hacerlo en el post.

Para comprobar que has hecho todo correctamente abre un símbolo del sistema y ejecuta los comandos que se ven a continuación (node -v, gcc -v y go version). Debe aparecer una salida parecida a lo siguiente:

C:\Users\parzibyte>node -v
v14.20.1

C:\Users\parzibyte>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-10.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-lto --enable-libgomp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev5, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-boot-ldflags='-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc' 'LDFLAGS_FOR_TARGET=-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high' --enable-linker-plugin-flags='LDFLAGS=-static-libstdc++\ -static-libgcc\ -pipe\ -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high\ -Wl,--stack,12582912'
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.3.0 (Rev5, Built by MSYS2 project)

C:\Users\parzibyte>go version
go version go1.17 windows/amd64

Si aparece que no se reconoce como un comando externo o interno, por favor revisa que lo hayas instalado correctamente y agregado a la PATH. No continúes si estas herramientas no funcionan.

Para el caso de Linux, Raspberry y Android solo busca las equivalencias para instalar el sistema. Igualmente escribiré tutoriales para ello en el futuro.

Contenido del código fuente (estructura)

Cuando descargues el código fuente tendrás una carpeta con el siguiente contenido:

└───sistema_restaurante-master
    │   .env
    │   .env.production
    │   .gitignore
    │   babel.config.js
    │   crear_instalador.py
    │   empaquetar.py
    │   instalador.nsi
    │   package-lock.json
    │   package.json
    │   README.md
    │   vue.config.js
    │
    ├───api
    │       bd.go
    │       checksum_archivos.go
    │       constantes.go
    │       constantes_desarrollo.go
    │       constantes_produccion.go
    │       consulta.sql
    │       contraseñas.go
    │       controlador_ajustes_generales.go
    │       controlador_ajustes_idioma.go
    │       controlador_categorias_de_platillos.go
    │       controlador_escritorio.go
    │       controlador_mesas.go
    │       controlador_metodos_pago.go
    │       controlador_ordenes.go
    │       controlador_pagos.go
    │       controlador_permisos.go
    │       controlador_platillos.go
    │       controlador_registro_movimientos.go
    │       controlador_usuarios.go
    │       errores.go
    │       go.mod
    │       go.sum
    │       jwt.go
    │       licencias.go
    │       main.go
    │       makefile
    │       middlewares.go
    │       restaurante.db
    │       restaurante.exe
    │       rutas.go
    │       rutas_ajustes_generales.go
    │       rutas_ajustes_idioma.go
    │       rutas_autenticacion.go
    │       rutas_categorias_de_platillos.go
    │       rutas_detener_servidor.go
    │       rutas_escritorio.go
    │       rutas_interfaz_web.go
    │       rutas_licencia.go
    │       rutas_mesas.go
    │       rutas_metodos_pago.go
    │       rutas_movimientos.go
    │       rutas_ordenes.go
    │       rutas_pagos.go
    │       rutas_permisos.go
    │       rutas_platillos.go
    │       rutas_usuarios.go
    │       utiles.go
    │       verificacion_archivos.go
    │
    ├───detener
    │       .gitignore
    │       detener.go
    │       go.mod
    │
    ├───public
    │       favicon.ico
    │       index.html
    │
    └───src
        │   App.vue
        │   filtros.js
        │   main.js
        │   traducciones.js
        │
        ├───assets
        │       logo.png
        │       parzibyte.png
        │
        ├───components
        │   │   AcercaDe.vue
        │   │
        │   ├───Ajustes
        │   │       DatosRestaurante.vue
        │   │       Idioma.vue
        │   │       InstruccionesPluginImpresoraTermica.vue
        │   │
        │   ├───CategoriasDePlatillos
        │   │       EditarCategoriaDePlatillo.vue
        │   │       NuevaCategoriaDePlatillo.vue
        │   │       VerCategoriasDePlatillos.vue
        │   │
        │   ├───Creditos
        │   │       PieTickets.vue
        │   │
        │   ├───Escritorio
        │   │       DiasYHorasMasConcurridas.vue
        │   │       Escritorio.vue
        │   │       GraficaMetodosDePagoPorAño.vue
        │   │       GraficaRecaudadoPorAño.vue
        │   │       GraficaRecaudadoPorMes.vue
        │   │       MejoresMeserosPorMes.vue
        │   │       PlatillosMasVendidos.vue
        │   │       TarjetaCocina.vue
        │   │       TarjetaRecaudadoHoy.vue
        │   │
        │   ├───Mesas
        │   │       EditarMesa.vue
        │   │       NuevaMesa.vue
        │   │       VerMesas.vue
        │   │
        │   ├───MetodosDePago
        │   │       EditarMetodoDePago.vue
        │   │       MetodosDePago.vue
        │   │
        │   ├───Ordenes
        │   │       CobrarOrden.vue
        │   │       Cocina.vue
        │   │       DialogoParaSolicitarCantidadYComentariosDePlatillo.vue
        │   │       EditarOrden.vue
        │   │       ImprimirReporteOrdenes.vue
        │   │       ListaDePlatillosDeOrden.vue
        │   │       ListaDePlatillosParaOrden.vue
        │   │       MenuParaOrden.vue
        │   │       NuevaOrden.vue
        │   │       VerOrdenes.vue
        │   │
        │   ├───Platillos
        │   │       EditarPlatillo.vue
        │   │       FotoDePlatillo.vue
        │   │       FotosDePlatillo.vue
        │   │       ImprimirMenu.vue
        │   │       NuevoPlatillo.vue
        │   │       TiempoDePreparacionDePlatillo.vue
        │   │       VerPlatillos.vue
        │   │
        │   ├───Tickets
        │   │       TicketOrden.vue
        │   │
        │   └───Usuarios
        │           CambiarContraseñaUsuario.vue
        │           Login.vue
        │           NuevoUsuario.vue
        │           PermisosDeUsuario.vue
        │           Usuarios.vue
        │           VerMovimientos.vue
        │
        ├───router
        │       index.js
        │
        └───services
                AjustesGeneralesService.js
                AjustesIdiomaService.js
                CategoriasDePlatillosService.js
                ConectorImpresoraTermica.js
                ConstantesService.js
                DialogosService.js
                EscritorioService.js
                FechasService.js
                GraficasService.js
                HttpService.js
                ImpresionService.js
                LicenciaService.js
                MesasService.js
                MetodosDePagoService.js
                MovimientosService.js
                OrdenesService.js
                PagosService.js
                PermisosService.js
                PlatillosService.js
                UsuariosService.js

Básicamente se divide en 3 cosas: el lado del cliente, servidor y scripts que empaquetan o crean el instalador.

El lado del cliente es todo lo que está en la carpeta principal (excluyendo los generadores de instaladores o similares) y el lado del servidor está en la carpeta api.

Ejecutando en modo de desarrollo

Nota: si usas Windows, no uses PowerShell; utiliza CMD.

Cuando se hacen pruebas y modificaciones se necesita ejecutar en modo desarrollo. Debemos compilar el lado del cliente y del servidor pero en modo desarrollo.

Lado del cliente

Comenzamos instalando las dependencias del lado del cliente con npm install. Esto solo se debe hacer una vez, y nos servirá para modo desarrollo y producción. Recuerda que estamos del lado del cliente.

Instalar dependencias de sistema para restaurantes con npm install

Lo siguiente es iniciar el servidor de desarrollo (se detiene con CTRL + C). Para ello se ejecuta npm run serve:

Servidor de desarrollo – Software restaurante

Ya puedes visitar la ruta que se indica en la terminal. Te va a dar errores porque la API no está en funcionamiento, pero volveremos ahí más tarde.

Lado del servidor

Abre otra terminal y navega a api.

Primero ejecuta go mod tidy para que se descarguen las dependencias. Esto solo se debe hacer una vez, ya sea en modo producción o desarrollo.

Luego compila con: go build -tags desarrollo y espera a que se compile. Asegúrate de que compiló correctamente, si marca errores, corrígelos).

Ahora ejecuta sistema_restaurante.exe (o su equivalente si estás en otra plataforma).

Se debe ver así al menos en Windows:

Iniciar API (servidor web) de Sistema para restaurantes

Fíjate en que el firewall pide permisos; debes dárselos. También revisa la terminal, el programa en Golang fue ejecutado y ha avisado que el primer usuario fue creado además de explicar que ya está escuchando en localhost:5000.

Revisando compilación

Ahora sí abre o refresca la ruta que te dio el comando npm run serve y ya deberías poder iniciar sesión. Si quieres puedes abrir la consola de depuración, ver los detalles de la red y confirmar que la petición se ha hecho a donde el servidor está escuchando.

Iniciar sesión en modo desarrollo – Revisar ruta de la API

Ya puedes modificar el código a tu antojo. En el lado del cliente los cambios se aplicarán inmediatamente tan pronto guardes.

En el lado del servidor debes detener el servidor, volver a compilar y volver a ejecutar (si quieres puedes usar el makefile ejecutando make prod pero eso queda fuera de este tutorial).

Compilando para producción

Una vez que hayas terminado de hacer cambios en el sistema ya puedes compilar para producción. En ese modo los archivos del cliente se optimizan. Para ello detén la API y el cliente.

Luego ejecuta npm run build en el cliente, espera a que acabe de compilar y tendrás la webapp en la carpeta dist. No la pierdas de vista.

Sumas de verificación

Para evitar la modificación de los archivos en el lado del cliente, el servidor verifica las sumas de verificación. Esas sumas de verificación están en checksum_archivos.go en un mapa que se ve así:

package main

/*
   Este código es autogenerado por el script de Python. No se recomienda tocarlo,
   pero si quieres puedes hacerlo. Solo es un mapa en donde la clave es la ubicación relativa
   del archivo, y el valor es el SHA512 de ese archivo

   Generado el: 2023-04-18_20-04-58
*/
var ubicacionesConHash = map[string]string{
 "./dist/css/app.76fe967c.css":                             "8358273e99f54af0a00c7464dc118d80654f9a4d616c365a915c8ca07adcbfd69481ea669fdf05799ff08adb456ba4cf1ce2db71b754528cde229922a096e2c4",
 "./dist/css/chunk-vendors.67635247.css":                   "0d42800781d68ccd6beb9632bd6dc754c8f7077564eeaa0dc26da1761b4bfb7757704b306a1e055837ca3d1d8efa02b27a93973afe68386c89359b8848f97ca9",
 "./dist/favicon.ico":                                      "f933cd352eaba92f509b3863353ddfefadfada26a4152ecdc4727d450bbf35e7b10fb3038fe8db340d5c63d74e608c1560ec84d0f6ffc8ccd940c9e0d7533544",
 "./dist/fonts/materialdesignicons-webfont.398ecd62.ttf":   "e7174d403c889ac1c640e59cc7d43def2e7b6e7d9733b1b17b478598224444bcd18ce893651d506a109470142d4d3279a7c849e6270217dc6773a14178949473",
 "./dist/fonts/materialdesignicons-webfont.63b125ec.woff2": "522f3125df0fa5a545c0d473aa44627ae67d2ee42d6339d983b506432a47cb57bce9236e7334374db7c82824da08c7dca274621e97f84ec0e3e90c5359a1ea9f",
 "./dist/fonts/materialdesignicons-webfont.76fb4d28.eot":   "6e436c4f2b7f6c1fea43d8352b383ba02257b22c7ba0847195b5b800d039c44e3ad7e92602772e7008ae617d16ec06c2f9500de44acae8ee23132ff067b481e5",
 "./dist/fonts/materialdesignicons-webfont.def9a54f.woff":  "c19658c5757d2932ff74f2f3d8089b0c860cf89c70292ba5d8866d6a9c312d1e5f2b26b6b2ec8da6f06b9391c0f309cd0c8ee966d9c180d222406e2d47b53845",
 "./dist/img/parzibyte.f9c28eb0.png":                       "4de6de04adab6a60a3c9ac6e546f20fb660ba87f8c22e4b4fc2298f54eb91729137f30d038a4c115b9dcf1a48e60fc90955bf640e69dd54076ff8113c325823e",
 "./dist/index.html":                                       "91f8b338247a3a79665361c698508495d1dc078cfbb628783393434df47b7dd05aba70b66067214bff1b7f5a4956d5014db1ce68e979cb8d1029fb42f38dba26",
 "./dist/js/app.2349d58f.js":                               "dbf531884a3d2aa1033b4a275c79a432dc46e31e800d4393b1a47e25fb09b6199abac448b188839bcc48563ac2fb3ff4e72097cc47129e1e31b8e292e61532c3",
 "./dist/js/chunk-vendors.ad8aa829.js":                     "9433edba4cd545d14ae57cee7a602d9cc5ba357beb90a6ac735e8917c93cc2105b0e4cacb853c90e203059f98f9f21079638180727be5bef6af8001b2bee8baf",
}

Una vez que has generado la carpeta dist, debes calcular el SHA 256 de cada archivo y colocarlos en el mapa. Si tú no quieres hacer esta verificación entonces deja ubicacionesConHash vacío o deshabilita la verificación en la línea 39 hasta la 41 dentro de main.go (si hay un problema con las sumas de verificación, el error estará en el log o en la terminal).

Ve al lado del servidor en la carpeta api y ejecuta go build -tags produccion -o restaurante_prod.exe. Espera a que compile y no pierdas de vista a restaurante_prod.exe.

Distribuyendo

Ahora solo resta distribuir la carpeta dist junto con restaurante_prod.exe. Ambos deben estar en el mismo lugar.

Compilar sistema restaurante para producción

Nota: si usas Windows puedes hacer que el ejecutable no tenga ventana, para ello agrega las banderas -ldflags "-H windowsgui" por ejemplo go build -o restaurante_prod.exe -tags produccion -ldflags "-H windowsgui"

Scripts de compilación

Junto al código vas a recibir crear_instalador.py y empaquetar.py. Debes invocarlos pasándole la arquitectura, por ejemplo:

python crear_instalador.py 64

Por el momento solo funcionan en Windows; recuerda que debes tener makensis en la PATH para crear el instalador. Por otro lado, empaquetar recibe igualmente la arquitectura y crea un zip del sistema, pero tú debes cambiar la PATH en caso de que quieras compilar para 32 bits.

Por ello es que estos scripts son un bonus en el código, ya que no te garantizo su funcionamiento pero si los sabes configurar podrás crear el instalador y/o empaquetar la app. Yo los uso y funcionan bien, pero no te los puedo garantizar, por eso son un simple extra.

Compilando en otras arquitecturas

Como lo dije al inicio, este código del sistema para restaurantes compila en donde sea que compile Go y C. La carpeta dist puede ser generada en otra arquitectura; lo que importa es el código del servidor.

Se necesita el compilador de C porque SQLite3 debe compilar la librería, y el compilador de Go porque todo el servidor está escrito en ese lenguaje.

Yo he compilado en Ubuntu, Android, Raspbian y Windows. También puedes hacerlo en internet. Ya solo recuerda que por ejemplo si no usas Windows no debes especificar -H windowsgui y el nombre de salida no necesita tener la extensión .exe.

Solución de errores

Si ocurre un error en la API, el mismo estará en la respuesta HTTP. Puedes revisar lo que devuelve la API, revisar el log (que tiene el formato de año-mes.log) y la terminal donde ejecutas el cliente y/o el servidor. Ahí aparecerán todos los errores, solo es cuestión de que los corrijas en caso de que existan.

Obviamente yo he probado y compila bien. Estos errores pueden aparecer cuando tú hagas modificaciones.

Descarga del código fuente

El programa compilado es totalmente gratuito y no tiene límites para nadie, en ninguna plataforma. Sin embargo, el código fuente no está disponible de manera gratuita.

Para descargar el código fuente el costo es de 3000 pesos mexicanos (MXN). En caso de que te interese, primero considera que:

  1. Yo te envío el código fuente tal y como está. He probado que funciona.
  2. Al obtener el código fuente no obtienes soporte. Solo obtienes esta guía y los posibles vídeos que publique en este post. Puedo darte ayuda si quieres, pero sería por un costo extra.
  3. Si cuentas con el código fuente, el mismo no recibirá actualizaciones. Tendrás la versión que existía en la fecha que me contactaste.

En caso de estar de acuerdo con lo mencionado arriba procede al pago como se indica en:

https://parzibyte.me/blog/pagos-venta-software/

No olvides escribir tu correo en el concepto como se indica en la página previamente enlazada. Yo te contactaré en un plazo de 36 horas una vez recibido el pago.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.