{"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\/fr\/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>Une solution compl\u00e8te de v\u00e9los en libre-service couvrant l'application utilisateur, la serrure intelligente et le back-office de gestion, avec une stack technique compl\u00e8te, test\u00e9e r\u00e9sistante \u00e0 89,7 requ\u00eates\/seconde<\/strong><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Origine du projet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour participer \u00e0 la finale du Concours national d'alphab\u00e9tisation informationnelle pour les jeunes 2025, nous avons r\u00e9alis\u00e9 les fonctions de base de verrouillage\/d\u00e9verrouillage selon les exigences du sujet donn\u00e9, mais pour nous rapprocher davantage de la vie r\u00e9elle et en faire un produit complet et mature, nous avons d\u00e9velopp\u00e9 davantage de branches et de fonctionnalit\u00e9s innovantes, incluant mais sans s'y limiter :<strong>Localisation GPS, d\u00e9tection d'accident et alerte, signalement de panne de v\u00e9hicule, gestion en cluster des donn\u00e9es des v\u00e9hicules, grand \u00e9cran de gestion back-office, gestion des donn\u00e9es par utilisateur, enregistrement et affichage des donn\u00e9es de trajet<\/strong>Couvrant<strong>l'application c\u00f4t\u00e9 utilisateur, la serrure intelligente embarqu\u00e9e, le syst\u00e8me de gestion back-office ainsi que le service API<\/strong>\u3002<br>Cet article analysera en profondeur l'architecture technique et les points forts de la mise en \u0153uvre de ce syst\u00e8me.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9partition des t\u00e2ches de l'\u00e9quipe<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Moi (XHL)<\/td><td>Exploitation et maintenance du serveur, mise en place front-end et back-end, application, toute la partie logicielle, etc.<\/td><td><a href=\"https:\/\/www.ycxhl.top\/fr\/\">Site web personnel<\/a><\/td><\/tr><tr><td>The Sandy<\/td><td>Conception 3D et impression de la structure de la serrure, construction de la structure mat\u00e9rielle, assistance au d\u00e9veloppement du programme ESP32, etc.<\/td><td><a href=\"https:\/\/decades.top\">Site web personnel<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">I. Architecture globale : conception en couches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Architecture en trois couches du projet :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Couche<\/th><th>Stack technique<\/th><th>Fonction<\/th><\/tr><\/thead><tbody><tr><td>Client<\/td><td>Vue + Android + SDK Amap<\/td><td>Affichage de la carte, d\u00e9verrouillage par scan, enregistrement de trajet, centre utilisateur<\/td><\/tr><tr><td>C\u00f4t\u00e9 v\u00e9lo<\/td><td>MicroPython + ESP32 + GPS\/MPU6050<\/td><td>Remont\u00e9e de position, d\u00e9tection d'attitude, ex\u00e9cution du d\u00e9verrouillage<\/td><\/tr><tr><td>Service API<\/td><td>Python Flask<\/td><td>Traitement de la logique m\u00e9tier, interface de donn\u00e9es<\/td><\/tr><tr><td>Couche de donn\u00e9es<\/td><td>MySQL + pool de connexions<\/td><td>Stockage de donn\u00e9es<\/td><\/tr><tr><td>Infrastructure<\/td><td>Docker + Nginx + Debian<\/td><td>D\u00e9ploiement conteneuris\u00e9, \u00e9quilibrage de charge<\/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. Points forts du serveur : haute performance et haute disponibilit\u00e9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1 Conception du pool de connexions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le serveur est d\u00e9velopp\u00e9 sur la base de Python Flask, et pour la base de donn\u00e9es j'ai encapsul\u00e9 moi-m\u00eame <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>Donn\u00e9es mesur\u00e9es<\/strong>: le syst\u00e8me peut supporter environ <strong>89 fois\/seconde<\/strong> de requ\u00eates de donn\u00e9es, et le serveur n'a jamais plant\u00e9 lors des tests d'attaque r\u00e9seau.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2 Syst\u00e8me de journalisation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Toutes les requ\u00eates API sont enregistr\u00e9es dans la base de donn\u00e9es via la <code>fonction server_log()<\/code> , les types de journaux sont divis\u00e9s en :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>UTILISATEUR<\/strong>: op\u00e9rations de connexion, d'inscription, de requ\u00eate des utilisateurs, etc.<\/li>\n\n\n\n<li><strong>V\u00c9LO<\/strong>: d\u00e9verrouillage du v\u00e9lo, verrouillage, mise \u00e0 jour de la position<\/li>\n\n\n\n<li><strong>ACCI<\/strong>: Alarme d'accident, alarme antivol<\/li>\n\n\n\n<li><strong>MAIN<\/strong>: Demande de r\u00e9paration, r\u00e9paration termin\u00e9e<\/li>\n\n\n\n<li><strong>PANEL<\/strong>: Acc\u00e8s aux donn\u00e9es backend<br>Cela facilite non seulement la tra\u00e7abilit\u00e9 des probl\u00e8mes, mais fournit \u00e9galement une base pour l'analyse de donn\u00e9es et les d\u00e9cisions op\u00e9rationnelles.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3 Int\u00e9gration des alertes DingTalk<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Les alarmes d'accident et les alarmes antivol sont pouss\u00e9es en temps r\u00e9el via le robot 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. Serrure intelligente de v\u00e9lo : combinaison du mat\u00e9riel et des algorithmes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1 It\u00e9ration de la structure m\u00e9canique<\/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\">La conception de mod\u00e9lisation et l'impression 3D ont \u00e9t\u00e9 r\u00e9alis\u00e9es par The Sandy (<a href=\"https:\/\/114514.com.cn\/\">Site web personnel<\/a>\uff09<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Le bo\u00eetier a connu cinq g\u00e9n\u00e9rations d'it\u00e9ration :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Version<\/th><th>Mat\u00e9riau<\/th><th>Points d'am\u00e9lioration<\/th><\/tr><\/thead><tbody><tr><td>Premi\u00e8re g\u00e9n\u00e9ration<\/td><td>PLA<\/td><td>Validation de la faisabilit\u00e9 de la structure de base<\/td><\/tr><tr><td>Deuxi\u00e8me g\u00e9n\u00e9ration<\/td><td>PLA<\/td><td>Optimisation de la solution de lubrifiant<\/td><\/tr><tr><td>Troisi\u00e8me g\u00e9n\u00e9ration<\/td><td>PLA<\/td><td>Optimisation de la solution de fixation<\/td><\/tr><tr><td>Quatri\u00e8me g\u00e9n\u00e9ration<\/td><td>PETG-CF<\/td><td>Am\u00e9lioration consid\u00e9rable de la r\u00e9sistance<\/td><\/tr><tr><td>Quatri\u00e8me+ g\u00e9n\u00e9ration<\/td><td>PETG-CF + fen\u00eatre PETG<\/td><td>R\u00e9solution du probl\u00e8me de blocage du signal 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>D\u00e9tails techniques<\/strong>: Le PETG renforc\u00e9 de fibre de carbone bloque le signal GPS, c'est pourquoi la zone de l'antenne utilise sp\u00e9cialement une conception \u00e0 fen\u00eatre en PETG.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">2 D\u00e9tection d'attitude et alarme d'accident<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Utilisation du capteur six axes MPU6050 pour d\u00e9tecter en temps r\u00e9el l'attitude du v\u00e9hicule. Lorsqu'un impact anormal est d\u00e9tect\u00e9 (comme une chute), le syst\u00e8me :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Affiche une notification via l'\u00e9cran OLED, donnant \u00e0 l'utilisateur <strong>10 secondes pour annuler<\/strong>(pour \u00e9viter les fausses alertes)<\/li>\n\n\n\n<li>Apr\u00e8s confirmation, appelle <code>\/bike\/accident<\/code> l'interface<\/li>\n\n\n\n<li>Le serveur consulte les contacts d'urgence pr\u00e9d\u00e9finis par l'utilisateur<\/li>\n\n\n\n<li>Le robot DingTalk pousse automatiquement la position de l'accident et les informations de l'utilisateur<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">3 Gestion de l'alimentation et recharge photovolta\u00efque<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Panneau solaire \u2192 IC de charge \u2192 Batterie lithium 7,4V<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Recharge photovolta\u00efque<\/strong>: Panneau solaire 6V 3W pour une recharge continue<\/li>\n\n\n\n<li><strong>Strat\u00e9gie de faible consommation<\/strong>: Nouvelle tentative automatique lorsque le GPS n'a pas de donn\u00e9es, apr\u00e8s trois d\u00e9clenchements anormaux du interrupteur \u00e0 lames souples, un rapport de panne est envoy\u00e9<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">IV. Syst\u00e8me de gestion backend : visualisation des donn\u00e9es<\/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\">Le backend utilise <strong>Vue3 + ECharts + API de cartographie Amap<\/strong> \u6784\u5efa\uff0c\u529f\u80fd\u5305\u62ec\uff1a<\/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>l'interface<\/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>l'interface<\/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=\"\/fr\/about.html\/\">contacter<\/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\/fr\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":3,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":119,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/posts\/21\/revisions\/119"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/media\/64"}],"wp:attachment":[{"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ycxhl.top\/fr\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}