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.
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.
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:
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.
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.
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:
- Yo te envío el código fuente tal y como está. He probado que funciona.
- 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.
- 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.
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