{"id":21,"date":"2025-08-20T17:37:42","date_gmt":"2025-08-20T09:37:42","guid":{"rendered":"https:\/\/www.ycxhl.top\/?p=21"},"modified":"2026-08-27T17:22:59","modified_gmt":"2026-08-27T09:22:59","slug":"17","status":"publish","type":"post","link":"https:\/\/www.ycxhl.top\/es\/archives\/17\/","title":{"rendered":"[\u9879\u76ee] \u4e00\u5957\u5b8c\u6574\u7684\u667a\u80fd\u5171\u4eab\u5355\u8f66\u7cfb\u7edf"},"content":{"rendered":"<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Una soluci\u00f3n completa de bicicletas compartidas que abarca la APP de usuario, el candado inteligente de bicicleta y el panel de administraci\u00f3n, con un stack tecnol\u00f3gico integral y una resistencia probada de 89,7 solicitudes\/segundo<\/strong><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Origen del proyecto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para participar en la final del Concurso Nacional de Alfabetizaci\u00f3n Inform\u00e1tica para J\u00f3venes 2025, completamos las funciones b\u00e1sicas de apertura y cierre de candado seg\u00fan los requisitos del enunciado dado, pero para acercarnos m\u00e1s a la vida real y convertirlo en un producto completo y maduro, desarrollamos m\u00e1s ramas y funciones innovadoras, incluyendo pero no limitado a:<strong>Posicionamiento GPS, detecci\u00f3n de accidentes y alerta, reporte de fallas de bicicletas, gesti\u00f3n de cl\u00faster de datos de bicicletas, pantalla grande de gesti\u00f3n del panel de administraci\u00f3n, gesti\u00f3n de datos por usuario, registro y visualizaci\u00f3n de datos de viaje<\/strong>Abarcando<strong>APP de usuario, candado inteligente embebido, sistema de gesti\u00f3n del panel de administraci\u00f3n y servicio API<\/strong>\u3002<br>Este art\u00edculo analizar\u00e1 en profundidad la arquitectura t\u00e9cnica y los aspectos destacados de la implementaci\u00f3n de este sistema.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Divisi\u00f3n de tareas del equipo<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Yo (XHL)<\/td><td>Operaci\u00f3n y mantenimiento del servidor, construcci\u00f3n del frontend y backend, APP, toda la parte de software, etc.<\/td><td><a href=\"https:\/\/www.ycxhl.top\/es\/\">Sitio web personal<\/a><\/td><\/tr><tr><td>El Sandy<\/td><td>Dise\u00f1o estructural 3D e impresi\u00f3n del candado de bicicleta, construcci\u00f3n de la estructura de hardware, asistencia en el desarrollo del programa ESP32, etc.<\/td><td><a href=\"https:\/\/decades.top\">Sitio web personal<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">I. Arquitectura general: dise\u00f1o por capas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Arquitectura de tres capas del proyecto:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Capa<\/th><th>Stack tecnol\u00f3gico<\/th><th>Funci\u00f3n<\/th><\/tr><\/thead><tbody><tr><td>Cliente<\/td><td>Vue + Android + SDK de Amap<\/td><td>Visualizaci\u00f3n de mapas, desbloqueo por escaneo, registro de viajes, centro de usuario<\/td><\/tr><tr><td>Lado de la bicicleta<\/td><td>MicroPython + ESP32 + GPS\/MPU6050<\/td><td>Reporte de posicionamiento, detecci\u00f3n de actitud, ejecuci\u00f3n de desbloqueo<\/td><\/tr><tr><td>Servicio API<\/td><td>Python Flask<\/td><td>Procesamiento de l\u00f3gica de negocio, interfaz de datos<\/td><\/tr><tr><td>Capa de datos<\/td><td>MySQL + grupo de conexiones<\/td><td>Almacenamiento de datos<\/td><\/tr><tr><td>Infraestructura<\/td><td>Docker + Nginx + Debian<\/td><td>Despliegue en contenedores, balanceo de carga<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-1-768x1024.webp\" alt=\"\" class=\"wp-image-64\" srcset=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-1-768x1024.webp 768w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-1-225x300.webp 225w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-1-1152x1536.webp 1152w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-1.webp 1279w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">II. Aspectos destacados del servidor: alto rendimiento y alta disponibilidad<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1 Dise\u00f1o del grupo de conexiones<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El servidor est\u00e1 desarrollado con Python Flask, y en cuanto a la base de datos, yo mismo encapsul\u00e9 <code>SQL<\/code> \u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from dbutils.pooled_db import PooledDB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Datos medidos<\/strong>: el sistema puede soportar aproximadamente <strong>89 solicitudes\/segundo<\/strong> de solicitudes de datos, y el servidor nunca se ha ca\u00eddo en las pruebas de ataques de red.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2 Sistema de registros<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Todas las solicitudes API se registran en la base de datos a trav\u00e9s de la <code>server_log()<\/code> funci\u00f3n, y los tipos de registro se dividen en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>USUARIO<\/strong>: operaciones de inicio de sesi\u00f3n, registro, consulta de usuarios, etc.<\/li>\n\n\n\n<li><strong>BICI<\/strong>: desbloqueo de bicicleta, bloqueo, actualizaci\u00f3n de posici\u00f3n<\/li>\n\n\n\n<li><strong>ACCI<\/strong>\uff1aAlarma de accidente, alarma antirrobo<\/li>\n\n\n\n<li><strong>PRINCIPAL<\/strong>\uff1aSolicitud de reparaci\u00f3n, reparaci\u00f3n completada<\/li>\n\n\n\n<li><strong>PANEL<\/strong>\uff1aAcceso a datos del backend<br>Esto no solo facilita el rastreo de problemas, sino que tambi\u00e9n proporciona una base para el an\u00e1lisis de datos y la toma de decisiones operativas.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3 Integraci\u00f3n de alertas de DingTalk<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Las alarmas de accidente y las alarmas antirrobo se env\u00edan en tiempo real a trav\u00e9s del robot de DingTalk:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"1024\" data-id=\"65\" src=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2-473x1024.webp\" alt=\"\" class=\"wp-image-65\" srcset=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2-473x1024.webp 473w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2-138x300.webp 138w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2-768x1664.webp 768w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2-709x1536.webp 709w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2-945x2048.webp 945w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-2.webp 1080w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"1024\" data-id=\"66\" src=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3-473x1024.webp\" alt=\"\" class=\"wp-image-66\" srcset=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3-473x1024.webp 473w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3-138x300.webp 138w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3-768x1664.webp 768w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3-709x1536.webp 709w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3-945x2048.webp 945w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-3.webp 1080w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"1024\" data-id=\"67\" src=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4-473x1024.webp\" alt=\"\" class=\"wp-image-67\" srcset=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4-473x1024.webp 473w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4-138x300.webp 138w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4-768x1664.webp 768w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4-709x1536.webp 709w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4-945x2048.webp 945w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-4.webp 1080w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><\/figure>\n<\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">III. Cerradura inteligente para bicicletas: la combinaci\u00f3n de hardware y algoritmos<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1 Iteraci\u00f3n de la estructura mec\u00e1nica<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">El modelado de dise\u00f1o y la impresi\u00f3n 3D fueron realizados por The Sandy (<a href=\"https:\/\/114514.com.cn\/\">Sitio web personal<\/a>\uff09<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">La carcasa ha pasado por cinco generaciones de iteraciones:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Versi\u00f3n<\/th><th>Material<\/th><th>Puntos de mejora<\/th><\/tr><\/thead><tbody><tr><td>Primera generaci\u00f3n<\/td><td>PLA<\/td><td>Verificar la viabilidad de la estructura b\u00e1sica<\/td><\/tr><tr><td>Segunda generaci\u00f3n<\/td><td>PLA<\/td><td>Optimizar la soluci\u00f3n de lubricante<\/td><\/tr><tr><td>Tercera generaci\u00f3n<\/td><td>PLA<\/td><td>Optimizaci\u00f3n del esquema de fijaci\u00f3n<\/td><\/tr><tr><td>Cuarta generaci\u00f3n<\/td><td>PETG-CF<\/td><td>Gran mejora en la resistencia<\/td><\/tr><tr><td>Cuarta+ generaci\u00f3n<\/td><td>PETG-CF + ventana de PETG<\/td><td>Resolver el problema de bloqueo de se\u00f1al GPS<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Detalles t\u00e9cnicos<\/strong>\uff1aEl PETG reforzado con fibra de carbono bloquea la se\u00f1al GPS, por lo que el \u00e1rea de la antena utiliza un dise\u00f1o de ventana de PETG espec\u00edficamente.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">2 Detecci\u00f3n de actitud y alarma de accidente<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se utiliza un sensor de seis ejes MPU6050 para detectar en tiempo real la actitud del veh\u00edculo. Cuando se detecta un impacto anormal (como una ca\u00edda), el sistema:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Muestra una notificaci\u00f3n en la pantalla OLED, dando al usuario <strong>10 segundos para cancelar<\/strong>(para prevenir falsas alarmas)<\/li>\n\n\n\n<li>Tras la confirmaci\u00f3n, llama a <code>\/bike\/accident<\/code> interfaz<\/li>\n\n\n\n<li>El servidor consulta el contacto de emergencia predefinido por el usuario<\/li>\n\n\n\n<li>El robot de DingTalk env\u00eda autom\u00e1ticamente la ubicaci\u00f3n del accidente y la informaci\u00f3n del usuario<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">3 Gesti\u00f3n de energ\u00eda y carga fotovoltaica<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Panel solar \u2192 IC de carga \u2192 bater\u00eda de litio de 7.4V<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Carga fotovoltaica<\/strong>\uff1aPanel solar de 6V 3W para suministro continuo de energ\u00eda<\/li>\n\n\n\n<li><strong>Estrategia de bajo consumo<\/strong>\uff1aReintento autom\u00e1tico del GPS cuando no hay datos, el interruptor reed se activa anormalmente tres veces y luego reporta la falla<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">IV. Sistema de gesti\u00f3n backend: visualizaci\u00f3n de datos<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"555\" src=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-5-1024x555.webp\" alt=\"\" class=\"wp-image-68\" srcset=\"https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-5-1024x555.webp 1024w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-5-300x163.webp 300w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-5-768x416.webp 768w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-5-1536x832.webp 1536w, https:\/\/www.ycxhl.top\/wp-content\/uploads\/2026\/08\/\u667a\u80fd\u5171\u4eab\u5355\u8f66-5.webp 1918w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El backend utiliza <strong>Vue3 + ECharts + API de mapas de Amap<\/strong> para su construcci\u00f3n, las funciones incluyen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4eea\u8868\u76d8<\/strong>\uff1a\u5355\u8f66\u603b\u6570\u3001\u7528\u6237\u603b\u6570\u3001\u8bf7\u6c42\u603b\u91cf\u5b9e\u65f6\u5237\u65b0<\/li>\n\n\n\n<li><strong>\u5355\u8f66\u4f4d\u7f6e\u8ffd\u8e2a<\/strong>\uff1a\u5730\u56fe\u4e0a\u5b9e\u65f6\u663e\u793a\u6240\u6709\u8f66\u8f86\u5206\u5e03<\/li>\n\n\n\n<li><strong>\u7528\u6237\u7ba1\u7406<\/strong>\uff1a\u67e5\u770b\u6240\u6709\u7528\u6237\u4fe1\u606f\u53ca\u64cd\u4f5c\u8bb0\u5f55<\/li>\n\n\n\n<li><strong>\u9a91\u884c\u8bb0\u5f55<\/strong>\uff1a\u8ba2\u5355\u8be6\u60c5\u3001\u8f68\u8ff9\u56de\u653e<\/li>\n\n\n\n<li><strong>\u7ef4\u4fee\u7ba1\u7406<\/strong>\uff1a\u62a5\u4fee\/\u4fee\u590d\u72b6\u6001\u6d41\u8f6c<\/li>\n\n\n\n<li><strong>\u65e5\u5fd7\u5ba1\u8ba1<\/strong>\uff1a\u670d\u52a1\u7aef\u65e5\u5fd7\u3001\u5355\u8f66\u65e5\u5fd7\u3001\u7528\u6237\u65e5\u5fd7\u5168\u91cf\u67e5\u8be2<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e94\u3001API \u63a5\u53e3\u8bbe\u8ba1\u89c4\u8303<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5ba2\u6237\u7aef\u63a5\u53e3\u793a\u4f8b<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>interfaz<\/th><th>\u8def\u5f84<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u7528\u6237\u767b\u5f55<\/td><td>POST \/client\/login<\/td><td>\u8fd4\u56de\u6635\u79f0\u548c\u72b6\u6001<\/td><\/tr><tr><td>\u9644\u8fd1\u5355\u8f66<\/td><td>POST \/client\/nearby<\/td><td>\u7ecf\u7eac\u5ea6\u8303\u56f4\u67e5\u8be2<\/td><\/tr><tr><td>\u89e3\u9501\u5355\u8f66<\/td><td>POST \/client\/unlock<\/td><td>\u521b\u5efa\u9a91\u884c\u8bb0\u5f55<\/td><\/tr><tr><td>\u83b7\u53d6\u8bb0\u5f55<\/td><td>POST \/client\/getrecord<\/td><td>\u5386\u53f2\u8ba2\u5355<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u5355\u8f66\u8bbe\u5907\u63a5\u53e3<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>interfaz<\/th><th>\u8def\u5f84<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u72b6\u6001\u68c0\u67e5<\/td><td>POST \/bike\/check<\/td><td>\u8fd4\u56de lock\/unlock<\/td><\/tr><tr><td>\u4f4d\u7f6e\u66f4\u65b0<\/td><td>POST \/bike\/update<\/td><td>\u5b9e\u65f6\u4e0a\u62a5\u8f68\u8ff9<\/td><\/tr><tr><td>\u4e8b\u6545\u62a5\u8b66<\/td><td>POST \/bike\/accident<\/td><td>\u89e6\u53d1\u9489\u9489\u63a8\u9001<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b89\u5168\u8bbe\u8ba1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u540e\u53f0\u63a5\u53e3\u7edf\u4e00\u9a8c\u8bc1 Token\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\"token\": \"AABBCC\"}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u516d\u3001\u90e8\u7f72\u4e0e\u8fd0\u7ef4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9879\u76ee\u91c7\u7528 <strong>Docker \u5bb9\u5668\u5316<\/strong>\u90e8\u7f72\uff0c\u8fd0\u884c\u5728\u4e91\u670d\u52a1\u5668\u4e0a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OpenResty<\/strong>\uff1a\u7aef\u53e3\u8f6c\u53d1\u3001\u8d1f\u8f7d\u5747\u8861<\/li>\n\n\n\n<li><strong>MySQL \u5bb9\u5668<\/strong>\uff1a\u6570\u636e\u6301\u4e45\u5316<\/li>\n\n\n\n<li><strong>Python Flask \u5bb9\u5668<\/strong>\uff1aAPI \u670d\u52a1<\/li>\n\n\n\n<li><strong>Docker Compose<\/strong>\uff1a\u4e00\u952e\u7f16\u6392\u542f\u52a8<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e03\u3001\u9879\u76ee\u4eae\u70b9\u603b\u7ed3<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6280\u672f\u6808\u5b8c\u6574\u95ed\u73af<\/strong>\uff1a\u4ece\u786c\u4ef6\uff08ESP32\/MPU6050\/GPS\uff09\u5230 APP\uff08Vue\/Android\uff09\uff0c\u4ece\u670d\u52a1\u7aef\uff08Flask\uff09\u5230\u6570\u636e\u5e93\uff08MySQL\uff09\uff0c\u518d\u5230\u5927\u5c4f\uff08Vue3\/ECharts\uff09\uff0c\u8986\u76d6\u5168\u94fe\u8def<\/li>\n\n\n\n<li><strong>\u5de5\u7a0b\u5316\u5b9e\u8df5\u5230\u4f4d<\/strong>\uff1a\u8fde\u63a5\u6c60\u3001\u65e5\u5fd7\u5206\u7c7b\u3001Docker \u90e8\u7f72\uff0c\u5177\u5907\u751f\u4ea7\u73af\u5883\u53ef\u7528\u6027<\/li>\n\n\n\n<li><strong>\u5b89\u5168\u4e0e\u5e94\u6025\u673a\u5236<\/strong>\uff1a\u4e8b\u6545\u62a5\u8b66 + 10 \u79d2\u53d6\u6d88\u673a\u5236\u3001\u9632\u76d7\u62a5\u8b66\u3001\u9489\u9489\u5b9e\u65f6\u63a8\u9001<\/li>\n\n\n\n<li><strong>\u6027\u80fd\u8868\u73b0\u4f18\u5f02<\/strong>\uff1a\u5b9e\u6d4b 89.7 \u6b21\/\u79d2\u5e76\u53d1\u8bf7\u6c42\uff0c\u653b\u51fb\u6d4b\u8bd5\u670d\u52a1\u7aef\u7a33\u5b9a\u4e0d\u5d29\u6e83<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>\u6b22\u8fce\u6280\u672f\u4ea4\u6d41\u3002\u5982\u9700\u5b8c\u6574\u6e90\u4ee3\u7801\u4e0e\u786c\u4ef6\u6587\u4ef6\uff0c\u8bf7<a href=\"\/es\/about.html\/\">contactarme<\/a><\/em><\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>\u4e00\u5957\u8986\u76d6\u7528\u6237APP\u3001\u667a\u80fd\u8f66\u9501\u3001\u7ba1\u7406\u540e\u53f0\u7684\u5b8c\u6574\u5171\u4eab\u5355\u8f66\u89e3\u51b3\u65b9\u6848\uff0c\u6280\u672f\u6808\u5168\u9762\uff0c\u5b9e\u6d4b\u6297\u538b 89.7 \u6b21\/\u79d2 \u9879\u76ee\u7f18\u8d77 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":64,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projects"],"_links":{"self":[{"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":3,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":119,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/posts\/21\/revisions\/119"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/media\/64"}],"wp:attachment":[{"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ycxhl.top\/es\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}