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.
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.
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
.
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.
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.
Lo siguiente es iniciar el servidor de desarrollo (se detiene con CTRL + C). Para ello se ejecuta npm run serve
:
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.
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:
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.
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.
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).
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.
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
.
Ahora solo resta distribuir la carpeta dist
junto con restaurante_prod.exe
. Ambos deben estar en el mismo lugar.
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"
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.
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
.
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.
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:
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Buenas tardes, no tienes algún curso para hacer un sistema completo en GO. Gracias por tu respuesta.
Buenas tardes. Por el momento no, pero si lo hago en un futuro lo anunciaré en este mismo blog