{"id":7068,"date":"2025-07-16T10:30:19","date_gmt":"2025-07-16T02:30:19","guid":{"rendered":"https:\/\/www.xinyixx.com\/?p=7068"},"modified":"2025-07-16T10:43:12","modified_gmt":"2025-07-16T02:43:12","slug":"bim","status":"publish","type":"post","link":"https:\/\/www.xinyixx.com\/index.php\/2025\/07\/16\/bim\/","title":{"rendered":"\u3010\u8f6c\u3011BIM \u6237\u578b\u6a21\u578b\u5c55\u793a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\ud83d\udccb \u76ee\u5f55<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#%E9%A1%B9%E7%9B%AE%E6%A6%82%E8%BF%B0\">\u9879\u76ee\u6982\u8ff0<\/a><\/li>\n\n\n\n<li><a href=\"#%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84\">\u7cfb\u7edf\u67b6\u6784<\/a><\/li>\n\n\n\n<li><a href=\"#%E6%8A%80%E6%9C%AF%E6%A0%88\">\u6280\u672f\u6808<\/a><\/li>\n\n\n\n<li><a href=\"#%E5%8A%9F%E8%83%BD%E7%89%B9%E6%80%A7\">\u529f\u80fd\u7279\u6027<\/a><\/li>\n\n\n\n<li><a href=\"#%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84\">\u9879\u76ee\u7ed3\u6784<\/a><\/li>\n\n\n\n<li><a href=\"#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1\">\u6570\u636e\u5e93\u8bbe\u8ba1<\/a><\/li>\n\n\n\n<li><a href=\"#api%E6%8E%A5%E5%8F%A3\">API \u63a5\u53e3<\/a><\/li>\n\n\n\n<li><a href=\"#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\">\u5feb\u901f\u5f00\u59cb<\/a><\/li>\n\n\n\n<li><a href=\"#%E9%83%A8%E7%BD%B2%E8%AF%B4%E6%98%8E\">\u90e8\u7f72\u8bf4\u660e<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf \u9879\u76ee\u6982\u8ff0<\/h2>\n\n\n\n<p><strong>\u534e\u79d1\u667a\u5bb6 BIM \u6237\u578b\u6a21\u578b\u5c55\u793a\u7cfb\u7edf<\/strong>\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u5efa\u7b51\u4fe1\u606f\u6a21\u578b\u53ef\u89c6\u5316\u5e73\u53f0\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u6c89\u6d78\u5f0f\u7684 3D \u6237\u578b\u67e5\u770b\u4f53\u9a8c\u3002\u7cfb\u7edf\u652f\u6301\u804a\u57ce\u5e02\u533a\u57df\u5185\u591a\u4e2a\u623f\u5730\u4ea7\u9879\u76ee\u7684\u6237\u578b\u6a21\u578b\u5c55\u793a\uff0c\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u8fdb\u884c\u5728\u7ebf\u6d4f\u89c8\u3001\u4ea4\u4e92\u548c\u6536\u85cf\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6838\u5fc3\u4ef7\u503c<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83c\udfe0 <strong>\u771f\u5b9e\u8fd8\u539f<\/strong>\uff1a\u57fa\u4e8e BIM \u6280\u672f\u7684\u9ad8\u7cbe\u5ea6 3D \u6237\u578b\u6a21\u578b<\/li>\n\n\n\n<li>\ud83d\udcf1 <strong>\u4fbf\u6377\u8bbf\u95ee<\/strong>\uff1a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\uff0c\u5373\u7528\u5373\u8d70<\/li>\n\n\n\n<li>\ud83c\udfae <strong>\u4ea4\u4e92\u4f53\u9a8c<\/strong>\uff1a\u652f\u6301 360\u00b0 \u65cb\u8f6c\u3001\u7f29\u653e\u3001\u623f\u95f4\u5207\u6362<\/li>\n\n\n\n<li>\ud83d\udd10 <strong>\u5b89\u5168\u53ef\u9760<\/strong>\uff1a\u5b8c\u6574\u7684\u7528\u6237\u8ba4\u8bc1\u548c\u6743\u9650\u7ba1\u7406<\/li>\n\n\n\n<li>\ud83d\udcca <strong>\u6570\u636e\u7ba1\u7406<\/strong>\uff1a\u5b8c\u5584\u7684\u540e\u53f0\u7ba1\u7406\u7cfb\u7edf<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfd7\ufe0f \u7cfb\u7edf\u67b6\u6784<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">\u90e8\u7f72\u73af\u5883\u540e\u7aef\u6280\u672f\u6808\u524d\u7aef\u6280\u672f\u6808PM2\u8fdb\u7a0b\u7ba1\u7406Windows Server + IISMySQL 8.0MySQL\u6570\u636e\u5e93Node.js + ExpressExpress\u540e\u7aefAPIJWT\u8ba4\u8bc1\u6587\u4ef6\u4e0a\u4f20\/\u4e0b\u8f7dVue3 + Piniauni-app\u524d\u7aefThree.js + WebGLH5 3D\u6a21\u578b\u5c55\u793aVue3 + Element Plus\u7ba1\u7406\u5458\u540e\u53f0\u7528\u6237\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u6a21\u578b\u6587\u4ef6\u5b58\u50a8<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcbb \u6280\u672f\u6808<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u524d\u7aef\u6280\u672f\u6808<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7aef (<code>frontend\/<\/code>)<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6280\u672f<\/th><th>\u7248\u672c<\/th><th>\u7528\u9014<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><strong>uni-app<\/strong><\/td><td>\u6700\u65b0\u7248<\/td><td>\u8de8\u5e73\u53f0\u5f00\u53d1\u6846\u67b6<\/td><td>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u4e3b\u6846\u67b6<\/td><\/tr><tr><td><strong>Vue 3<\/strong><\/td><td>3.5.13<\/td><td>\u6e10\u8fdb\u5f0f JavaScript \u6846\u67b6<\/td><td>SSR \u5e94\u7528\uff0c\u652f\u6301 uni-app x<\/td><\/tr><tr><td><strong>Pinia<\/strong><\/td><td>3.0.2<\/td><td>\u72b6\u6001\u7ba1\u7406<\/td><td>\u81ea\u5b9a\u4e49\u6301\u4e45\u5316\u63d2\u4ef6<\/td><\/tr><tr><td><strong>Three.js<\/strong><\/td><td>0.175.0<\/td><td>3D \u56fe\u5f62\u5e93<\/td><td>WebGL 3D \u6a21\u578b\u6e32\u67d3<\/td><\/tr><tr><td><strong>Vite<\/strong><\/td><td>6.2.2<\/td><td>\u6784\u5efa\u5de5\u5177<\/td><td>uni-app \u5b98\u65b9 Vite \u63d2\u4ef6<\/td><\/tr><tr><td><strong>Webpack<\/strong><\/td><td>5.x<\/td><td>\u6a21\u5757\u6253\u5305<\/td><td>vue.config.js \u914d\u7f6e\u4f18\u5316<\/td><\/tr><tr><td><strong>UTS<\/strong><\/td><td>\u6700\u65b0\u7248<\/td><td>TypeScript \u65b9\u8a00<\/td><td>uni-app x \u539f\u751f\u5f00\u53d1\u8bed\u8a00<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u7ba1\u7406\u540e\u53f0\u7aef (<code>admin-frontend\/<\/code>)<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6280\u672f<\/th><th>\u7248\u672c<\/th><th>\u7528\u9014<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><strong>Vue 3<\/strong><\/td><td>3.5.13<\/td><td>\u6e10\u8fdb\u5f0f JavaScript \u6846\u67b6<\/td><td>Composition API<\/td><\/tr><tr><td><strong>Vue Router<\/strong><\/td><td>4.5.1<\/td><td>\u8def\u7531\u7ba1\u7406<\/td><td>SPA \u5355\u9875\u5e94\u7528\u8def\u7531<\/td><\/tr><tr><td><strong>Element Plus<\/strong><\/td><td>2.9.11<\/td><td>UI \u7ec4\u4ef6\u5e93<\/td><td>\u7ba1\u7406\u540e\u53f0 UI \u7ec4\u4ef6<\/td><\/tr><tr><td><strong>Vite<\/strong><\/td><td>6.3.5<\/td><td>\u6784\u5efa\u5de5\u5177<\/td><td>\u73b0\u4ee3\u5316\u524d\u7aef\u6784\u5efa\u5de5\u5177<\/td><\/tr><tr><td><strong>Axios<\/strong><\/td><td>1.9.0<\/td><td>HTTP \u5ba2\u6237\u7aef<\/td><td>API \u8bf7\u6c42\u5e93<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u540e\u7aef\u6280\u672f\u6808<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6280\u672f<\/th><th>\u7248\u672c<\/th><th>\u7528\u9014<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><strong>Node.js<\/strong><\/td><td>14+<\/td><td>JavaScript \u8fd0\u884c\u65f6<\/td><td>\u670d\u52a1\u7aef\u8fd0\u884c\u73af\u5883<\/td><\/tr><tr><td><strong>Express<\/strong><\/td><td>4.21.2<\/td><td>Web \u6846\u67b6<\/td><td>RESTful API \u670d\u52a1<\/td><\/tr><tr><td><strong>MySQL<\/strong><\/td><td>8.0.42<\/td><td>\u5173\u7cfb\u578b\u6570\u636e\u5e93<\/td><td>\u6570\u636e\u6301\u4e45\u5316\u5b58\u50a8<\/td><\/tr><tr><td><strong>mysql2<\/strong><\/td><td>3.14.0<\/td><td>\u6570\u636e\u5e93\u9a71\u52a8<\/td><td>\u539f\u751f SQL \u67e5\u8be2\uff0c\u8fde\u63a5\u6c60\u7ba1\u7406<\/td><\/tr><tr><td><strong>JWT<\/strong><\/td><td>9.0.2<\/td><td>\u8eab\u4efd\u8ba4\u8bc1<\/td><td>\u65e0\u72b6\u6001\u7528\u6237\u8ba4\u8bc1<\/td><\/tr><tr><td><strong>bcrypt<\/strong><\/td><td>5.1.1<\/td><td>\u5bc6\u7801\u52a0\u5bc6<\/td><td>\u7528\u6237\u5bc6\u7801\u5b89\u5168\u5b58\u50a8<\/td><\/tr><tr><td><strong>Winston<\/strong><\/td><td>3.17.0<\/td><td>\u65e5\u5fd7\u7cfb\u7edf<\/td><td>\u591a\u4f20\u8f93\u65b9\u5f0f\u65e5\u5fd7\uff08\u6587\u4ef6+DB\uff09<\/td><\/tr><tr><td><strong>winston-mysql<\/strong><\/td><td>1.1.1<\/td><td>MySQL \u65e5\u5fd7\u4f20\u8f93<\/td><td>\u65e5\u5fd7\u5199\u5165\u6570\u636e\u5e93<\/td><\/tr><tr><td><strong>\u963f\u91cc\u4e91 SMS SDK<\/strong><\/td><td>1.1.6<\/td><td>\u77ed\u4fe1\u670d\u52a1<\/td><td>\u9a8c\u8bc1\u7801\u53d1\u9001\u670d\u52a1<\/td><\/tr><tr><td><strong>express-validator<\/strong><\/td><td>7.2.1<\/td><td>\u8bf7\u6c42\u9a8c\u8bc1<\/td><td>API \u53c2\u6570\u9a8c\u8bc1<\/td><\/tr><tr><td><strong>express-rate-limit<\/strong><\/td><td>7.5.0<\/td><td>\u63a5\u53e3\u9650\u6d41<\/td><td>\u9632\u6b62\u6076\u610f\u8bf7\u6c42<\/td><\/tr><tr><td><strong>helmet<\/strong><\/td><td>8.1.0<\/td><td>\u5b89\u5168\u4e2d\u95f4\u4ef6<\/td><td>HTTP \u5b89\u5168\u5934\u8bbe\u7f6e<\/td><\/tr><tr><td><strong>multer<\/strong><\/td><td>1.4.5<\/td><td>\u6587\u4ef6\u4e0a\u4f20<\/td><td>\u591a\u5a92\u4f53\u6587\u4ef6\u4e0a\u4f20\u5904\u7406<\/td><\/tr><tr><td><strong>PM2<\/strong><\/td><td>&#8211;<\/td><td>\u8fdb\u7a0b\u7ba1\u7406<\/td><td>\u751f\u4ea7\u73af\u5883\u8fdb\u7a0b\u5b88\u62a4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3D \u6e32\u67d3\u6280\u672f<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6280\u672f<\/th><th>\u7528\u9014<\/th><th>\u7279\u6027<\/th><\/tr><\/thead><tbody><tr><td><strong>HKGLTF-ES6<\/strong><\/td><td>\u81ea\u7814 3D \u5f15\u64ce<\/td><td>\u57fa\u4e8e Three.js \u7684\u5b9a\u5236\u5316 3D \u6a21\u578b\u67e5\u770b\u5668<\/td><\/tr><tr><td><strong>DRACO \u538b\u7f29<\/strong><\/td><td>\u6a21\u578b\u538b\u7f29<\/td><td>\u51e0\u4f55\u4f53\u538b\u7f29\uff0c\u51cf\u5c11\u4f20\u8f93\u5927\u5c0f<\/td><\/tr><tr><td><strong>WebGL<\/strong><\/td><td>\u786c\u4ef6\u52a0\u901f<\/td><td>GPU \u52a0\u901f\u7684 3D \u56fe\u5f62\u6e32\u67d3<\/td><\/tr><tr><td><strong>\u6750\u8d28\u7cfb\u7edf<\/strong><\/td><td>\u771f\u5b9e\u611f\u6e32\u67d3<\/td><td>\u652f\u6301 PBR \u6750\u8d28\u548c\u5149\u7167\u7cfb\u7edf<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u2728 \u529f\u80fd\u7279\u6027<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd10 \u7528\u6237\u8ba4\u8bc1\u7cfb\u7edf<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u6388\u6743\u767b\u5f55<\/li>\n\n\n\n<li>\u624b\u673a\u53f7\u5feb\u6377\u767b\u5f55<\/li>\n\n\n\n<li>\u77ed\u4fe1\u9a8c\u8bc1\u7801\u8ba4\u8bc1<\/li>\n\n\n\n<li>JWT Token + Refresh Token \u53cc\u4ee4\u724c\u673a\u5236<\/li>\n\n\n\n<li>\u7528\u6237\u89d2\u8272\u6743\u9650\u7ba1\u7406\uff08\u7528\u6237\/\u7ba1\u7406\u5458\uff09<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfe0 \u6237\u578b\u9009\u62e9\u7cfb\u7edf<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">3D\u5c55\u793a\u529f\u80fd\u8ba4\u8bc1\u65b9\u5f0f\u6a21\u578b\u52a0\u8f7d3D\u6a21\u578b\u5c55\u793a\u89c6\u89d2\u63a7\u5236\u623f\u95f4\u6807\u7b7e\u7cfb\u7edf\u7ba1\u7ebf\u6750\u8d28\u5207\u6362\u5fae\u4fe1\u6388\u6743\u767b\u5f55\u7528\u6237\u8ba4\u8bc1\u77ed\u4fe1\u9a8c\u8bc1\u7801\u5bc6\u7801\u767b\u5f55\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u542f\u52a8\u6237\u578b\u9009\u62e9\u533a\u53bf\u9009\u62e9\u8857\u9053\u9009\u62e9\u5c0f\u533a\u9009\u62e9\u697c\u680b\u9009\u62e9\u6237\u578b\u7ed1\u5b9a<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u56db\u7ea7\u7b5b\u9009<\/strong>\uff1a\u533a\u53bf \u2192 \u8857\u9053 \u2192 \u5c0f\u533a \u2192 \u697c\u680b<\/li>\n\n\n\n<li><strong>\u667a\u80fd\u641c\u7d22<\/strong>\uff1a\u652f\u6301\u5173\u952e\u8bcd\u5feb\u901f\u5b9a\u4f4d<\/li>\n\n\n\n<li><strong>\u6536\u85cf\u529f\u80fd<\/strong>\uff1a\u7528\u6237\u53ef\u6536\u85cf\u5fc3\u4eea\u6237\u578b<\/li>\n\n\n\n<li><strong>\u7ed1\u5b9a\u7ba1\u7406<\/strong>\uff1a\u7528\u6237\u6237\u578b\u7ed1\u5b9a\u548c\u53d8\u66f4\u7533\u8bf7<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83c\udfae 3D \u6a21\u578b\u4ea4\u4e92<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9ad8\u8d28\u91cf\u6e32\u67d3<\/strong>\uff1a\u57fa\u4e8e Three.js \u7684 WebGL \u6e32\u67d3<\/li>\n\n\n\n<li><strong>\u591a\u79cd\u63a7\u5236<\/strong>\uff1a\u65cb\u8f6c\u3001\u7f29\u653e\u3001\u5e73\u79fb\u3001\u98de\u884c<\/li>\n\n\n\n<li><strong>\u623f\u95f4\u5bfc\u822a<\/strong>\uff1a\u623f\u95f4\u5217\u8868\u3001\u623f\u95f4\u6807\u7b7e\u3001\u5feb\u901f\u8df3\u8f6c<\/li>\n\n\n\n<li><strong>\u89c6\u89d2\u9884\u8bbe<\/strong>\uff1a\u9e1f\u77b0\u89c6\u89d2\u3001\u5e73\u9762\u89c6\u89d2\u3001\u623f\u95f4\u89c6\u89d2<\/li>\n\n\n\n<li><strong>\u6750\u8d28\u7cfb\u7edf<\/strong>\uff1a\u7535\u6c14\u7cfb\u7edf\u3001\u4f9b\u6696\u7cfb\u7edf\u53ef\u89c6\u5316<\/li>\n\n\n\n<li><strong>\u4eae\u5ea6\u8c03\u8282<\/strong>\uff1a\u7528\u6237\u53ef\u8c03\u8282\u573a\u666f\u4eae\u5ea6<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcca \u7ba1\u7406\u540e\u53f0<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u7528\u6237\u7ba1\u7406<\/strong>\uff1a\u7528\u6237\u4fe1\u606f\u67e5\u770b\u3001\u89d2\u8272\u5206\u914d<\/li>\n\n\n\n<li><strong>\u6a21\u578b\u7ba1\u7406<\/strong>\uff1a3D \u6a21\u578b\u4e0a\u4f20\u3001\u7f16\u8f91\u3001\u5220\u9664<\/li>\n\n\n\n<li><strong>\u7ed1\u5b9a\u5ba1\u6838<\/strong>\uff1a\u7528\u6237\u6362\u7ed1\u7533\u8bf7\u5ba1\u6838<\/li>\n\n\n\n<li><strong>\u65e5\u5fd7\u76d1\u63a7<\/strong>\uff1a\u7cfb\u7edf\u64cd\u4f5c\u65e5\u5fd7\u8bb0\u5f55<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc1 \u9879\u76ee\u7ed3\u6784<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;A-WXXCX\/<br>&nbsp;\u251c\u2500\u2500 \ud83d\udcf1 frontend\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # uni-app \u5fae\u4fe1\u5c0f\u7a0b\u5e8f<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 src\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 pages\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u9875\u9762\u7ec4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 launch.vue &nbsp; &nbsp; &nbsp; &nbsp;  # \u542f\u52a8\u9875\u9762<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 login.vue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u767b\u5f55\u9875\u9762<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 xuanzehuxing.vue &nbsp;  # \u6237\u578b\u9009\u62e9\u9875\u9762<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 zhuce.vue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u6ce8\u518c\u9875\u9762<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 wode.vue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u4e2a\u4eba\u4e2d\u5fc3<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 subpackages\/model\/ &nbsp; &nbsp;  # 3D \u6a21\u578b\u5206\u5305<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 pages\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 huxingmoxing.vue # 3D \u6a21\u578b\u5c55\u793a\u9875\u9762<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 static\/HKGLTF-ES6\/  # 3D \u6e32\u67d3\u5f15\u64ce<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; &nbsp; &nbsp; \u251c\u2500\u2500 js\/src\/ &nbsp; &nbsp; &nbsp; &nbsp; # \u6838\u5fc3\u6e32\u67d3\u903b\u8f91<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; &nbsp; &nbsp; \u251c\u2500\u2500 libs\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u7b2c\u4e09\u65b9\u5e93\uff08DRACO\u7b49\uff09<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; &nbsp; &nbsp; \u2514\u2500\u2500 loaders\/ &nbsp; &nbsp; &nbsp;  # \u6a21\u578b\u52a0\u8f7d\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 api\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # API \u63a5\u53e3\u5c01\u88c5<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 store\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # Pinia \u72b6\u6001\u7ba1\u7406<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 components\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u516c\u5171\u7ec4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 utils\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u5de5\u5177\u51fd\u6570<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 main.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # JavaScript \u5165\u53e3\u6587\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 main.uts &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # UTS \u5165\u53e3\u6587\u4ef6 (uni-app x)<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 App.vue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Vue \u5e94\u7528\u6839\u7ec4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 App.uvue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # UVue \u6839\u7ec4\u4ef6 (uni-app x)<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 vite.config.js &nbsp; &nbsp; &nbsp; &nbsp;  # Vite \u914d\u7f6e\u6587\u4ef6<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 manifest.json &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u5c0f\u7a0b\u5e8f\u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 pages.json &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u9875\u9762\u8def\u7531\u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 vue.config.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Webpack \u6784\u5efa\u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 clean-unused-files.js &nbsp; &nbsp; &nbsp; # \u6587\u4ef6\u6e05\u7406\u811a\u672c<br>&nbsp;\u2502 &nbsp; \u2514\u2500\u2500 \u5206\u5305\u4f18\u5316\u6307\u5357.md &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u5206\u5305\u4f18\u5316\u6587\u6863<br>&nbsp;\u2502<br>&nbsp;\u251c\u2500\u2500 \ud83d\udda5\ufe0f backend\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Node.js \u540e\u7aef\u670d\u52a1<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 src\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 controllers\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u63a7\u5236\u5668\u5c42\uff08HTTP \u8bf7\u6c42\u5904\u7406\uff09<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 authController.js &nbsp; # \u7528\u6237\u8ba4\u8bc1\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 modelController.js  # 3D \u6a21\u578b\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 districtController.js # \u533a\u57df\u6570\u636e\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 communityController.js # \u5c0f\u533a\u6570\u636e\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 adminController.js  # \u7ba1\u7406\u5458\u529f\u80fd\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 uploadController.js # \u6587\u4ef6\u4e0a\u4f20\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 userBindingController.js # \u7528\u6237\u7ed1\u5b9a\u63a7\u5236\u5668<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 middleware\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # Express \u4e2d\u95f4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 authMiddleware.js &nbsp; # JWT \u8ba4\u8bc1\u4e2d\u95f4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 adminMiddleware.js  # \u7ba1\u7406\u5458\u6743\u9650\u4e2d\u95f4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 errorHandler.js &nbsp; &nbsp; # \u5168\u5c40\u9519\u8bef\u5904\u7406\u4e2d\u95f4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 routes\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u8def\u7531\u5b9a\u4e49<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 api.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u516c\u5171 API \u8def\u7531<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 admin.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u7ba1\u7406\u5458\u8def\u7531<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 services\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u4e1a\u52a1\u903b\u8f91\u670d\u52a1\u5c42<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 adminService.js &nbsp; &nbsp; # \u7ba1\u7406\u5458\u4e1a\u52a1\u670d\u52a1<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 bindingService.js &nbsp; # \u7ed1\u5b9a\u4e1a\u52a1\u670d\u52a1<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 smsService.js &nbsp; &nbsp; &nbsp; # \u77ed\u4fe1\u670d\u52a1\uff08\u963f\u91cc\u4e91\uff09<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 dbService.js &nbsp; &nbsp; &nbsp;  # \u6570\u636e\u5e93\u67e5\u8be2\u670d\u52a1<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 models\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u6570\u636e\u6a21\u578b\u5c42<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 model.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u6a21\u578b\u6570\u636e\u64cd\u4f5c<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 utils\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u5de5\u5177\u51fd\u6570<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 logger.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Winston \u65e5\u5fd7\u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 dbPool.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u6570\u636e\u5e93\u8fde\u63a5\u6c60<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 httpError.js &nbsp; &nbsp; &nbsp;  # HTTP \u9519\u8bef\u5904\u7406<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 config\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u914d\u7f6e\u6587\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 database.js &nbsp; &nbsp; &nbsp; &nbsp; # \u6570\u636e\u5e93\u8fde\u63a5\u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 index.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # Express \u5e94\u7528\u5165\u53e3<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 database\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 db.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u6570\u636e\u5e93\u8fde\u63a5\u4e0e\u67e5\u8be2\u5c01\u88c5<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 scripts\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 sync-model-library.js  # \u6a21\u578b\u5e93\u81ea\u52a8\u540c\u6b65\u811a\u672c<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 models\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 Model-library\/ &nbsp; &nbsp; &nbsp; &nbsp;  # 3D \u6a21\u578b\u6587\u4ef6\u5b58\u50a8\u76ee\u5f55<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 server.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u72ec\u7acb\u6a21\u578b\u670d\u52a1\u5668\uff08\u6d4b\u8bd5\u7528\uff09<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 logs\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u65e5\u5fd7\u6587\u4ef6\u76ee\u5f55<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 hash_password.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u5bc6\u7801\u54c8\u5e0c\u5de5\u5177\u811a\u672c<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 package.json &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u9879\u76ee\u4f9d\u8d56\u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u2514\u2500\u2500 ecosystem.config.js &nbsp; &nbsp; &nbsp; &nbsp; # PM2 \u8fdb\u7a0b\u7ba1\u7406\u914d\u7f6e<br>&nbsp;\u2502<br>&nbsp;\u251c\u2500\u2500 \ud83d\udd27 admin-frontend\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # Vue3 + Vite \u7ba1\u7406\u540e\u53f0<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 src\/<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 views\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u9875\u9762\u89c6\u56fe<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 Login.vue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u7ba1\u7406\u5458\u767b\u5f55<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 ModelManage.vue &nbsp; &nbsp; # \u6a21\u578b\u7ba1\u7406<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 DesignDoc.vue &nbsp; &nbsp; &nbsp; # \u8bbe\u8ba1\u6587\u6863<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 BindingChangeReview.vue # \u7ed1\u5b9a\u5ba1\u6838<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 components\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u7ba1\u7406\u7ec4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 router\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Vue Router \u8def\u7531<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 services\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # API \u670d\u52a1\u5c42<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 stores\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u72b6\u6001\u7ba1\u7406\uff08\u53ef\u9009\uff09<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 utils\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u5de5\u5177\u51fd\u6570<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 assets\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u9759\u6001\u8d44\u6e90<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 main.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u5e94\u7528\u5165\u53e3<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u251c\u2500\u2500 App.vue &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u6839\u7ec4\u4ef6<br>&nbsp;\u2502 &nbsp; \u2502 &nbsp; \u2514\u2500\u2500 style.css &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u5168\u5c40\u6837\u5f0f<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 public\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u516c\u5171\u9759\u6001\u6587\u4ef6<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 dist\/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u6784\u5efa\u8f93\u51fa\u76ee\u5f55<br>&nbsp;\u2502 &nbsp; \u251c\u2500\u2500 vite.config.js &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # Vite \u914d\u7f6e<br>&nbsp;\u2502 &nbsp; \u2514\u2500\u2500 index.html &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # HTML \u5165\u53e3<br>&nbsp;\u2502<br>&nbsp;\u251c\u2500\u2500 \ud83d\udcca 111.sql &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u6570\u636e\u5e93\u7ed3\u6784\u6587\u4ef6<br>&nbsp;\u251c\u2500\u2500 \ud83d\ude80 deploy.bat &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # \u81ea\u52a8\u90e8\u7f72\u811a\u672c<br>&nbsp;\u2514\u2500\u2500 \ud83d\udcd6 README.md &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  # \u9879\u76ee\u8bf4\u660e\u6587\u6863<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\uddc4\ufe0f \u6570\u636e\u5e93\u8bbe\u8ba1<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">usersuser_huxing_bindingsrefresh_tokensfavoritesadmin_logsbinding_change_requestsmodelsmodel_propertiesmodel_roomsmodel_viewpointsdistrictsstreetscommunitiesbuildings\u7ed1\u5b9a\u62e5\u6709\u6536\u85cf\u8bb0\u5f55\u7533\u8bf7\u88ab\u7ed1\u5b9a\u5c5e\u6027\u623f\u95f4\u89c6\u70b9\u88ab\u6536\u85cf\u5305\u542b\u5305\u542b\u5305\u542b\u5173\u8054\u5305\u542b\u5305\u542b\u5173\u8054\u5305\u542b\u5173\u8054\u5173\u8054<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b8c\u6574\u6570\u636e\u8868\u7ed3\u6784\uff0816 \u5f20\u8868\uff09<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6838\u5fc3\u4e1a\u52a1\u8868<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8868\u540d<\/th><th>\u7528\u9014<\/th><th>\u4e3b\u8981\u5b57\u6bb5<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><code>users<\/code><\/td><td>\u7528\u6237\u4fe1\u606f<\/td><td>id, phone, openid, name, avatar, role<\/td><td>\u652f\u6301\u5fae\u4fe1\u7528\u6237\u548c\u7ba1\u7406\u5458<\/td><\/tr><tr><td><code>models<\/code><\/td><td>3D \u6a21\u578b\u4fe1\u606f<\/td><td>id, name, file_path, area, description<\/td><td>\u6a21\u578b\u5143\u6570\u636e\u548c\u6587\u4ef6\u8def\u5f84<\/td><\/tr><tr><td><code>districts<\/code><\/td><td>\u533a\u53bf\u4fe1\u606f<\/td><td>id, name, type<\/td><td>\u884c\u653f\u533a\u5212-\u533a\u53bf\u7ea7<\/td><\/tr><tr><td><code>streets<\/code><\/td><td>\u8857\u9053\u4fe1\u606f<\/td><td>id, district_id, name<\/td><td>\u884c\u653f\u533a\u5212-\u8857\u9053\u7ea7<\/td><\/tr><tr><td><code>communities<\/code><\/td><td>\u5c0f\u533a\u4fe1\u606f<\/td><td>id, district_id, street_id, name<\/td><td>\u623f\u5730\u4ea7\u9879\u76ee-\u5c0f\u533a\u7ea7<\/td><\/tr><tr><td><code>buildings<\/code><\/td><td>\u697c\u680b\u4fe1\u606f<\/td><td>id, community_id, name<\/td><td>\u623f\u5730\u4ea7\u9879\u76ee-\u697c\u680b\u7ea7<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u7528\u6237\u4e1a\u52a1\u8868<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8868\u540d<\/th><th>\u7528\u9014<\/th><th>\u4e3b\u8981\u5b57\u6bb5<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><code>user_huxing_bindings<\/code><\/td><td>\u7528\u6237\u6237\u578b\u7ed1\u5b9a<\/td><td>user_id, model_id, status<\/td><td>\u7528\u6237\u4e0e\u6237\u578b\u7684\u7ed1\u5b9a\u5173\u7cfb<\/td><\/tr><tr><td><code>binding_change_requests<\/code><\/td><td>\u6362\u7ed1\u7533\u8bf7<\/td><td>user_id, old_huxing_id, new_huxing_id<\/td><td>\u7528\u6237\u6362\u7ed1\u7533\u8bf7\u5ba1\u6838<\/td><\/tr><tr><td><code>favorites<\/code><\/td><td>\u7528\u6237\u6536\u85cf<\/td><td>user_id, model_id<\/td><td>\u7528\u6237\u6536\u85cf\u7684\u6237\u578b\u6a21\u578b<\/td><\/tr><tr><td><code>refresh_tokens<\/code><\/td><td>\u5237\u65b0\u4ee4\u724c<\/td><td>user_id, token, expires_at<\/td><td>JWT \u5237\u65b0\u4ee4\u724c\u7ba1\u7406<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u6a21\u578b\u6269\u5c55\u8868<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8868\u540d<\/th><th>\u7528\u9014<\/th><th>\u4e3b\u8981\u5b57\u6bb5<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><code>model_properties<\/code><\/td><td>\u6a21\u578b\u5c5e\u6027<\/td><td>model_id, property_name, property_value<\/td><td>\u6a21\u578b\u7684\u81ea\u5b9a\u4e49\u5c5e\u6027<\/td><\/tr><tr><td><code>model_rooms<\/code><\/td><td>\u6a21\u578b\u623f\u95f4\u4fe1\u606f<\/td><td>model_id, name, area, position_x\/y\/z<\/td><td>\u623f\u95f4\u7a7a\u95f4\u4fe1\u606f\u548c\u4f4d\u7f6e<\/td><\/tr><tr><td><code>model_viewpoints<\/code><\/td><td>\u6a21\u578b\u89c6\u70b9<\/td><td>model_id, name, position_x\/y\/z, target_x\/y\/z<\/td><td>\u9884\u8bbe\u76f8\u673a\u89c6\u70b9<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u7cfb\u7edf\u7ba1\u7406\u8868<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8868\u540d<\/th><th>\u7528\u9014<\/th><th>\u4e3b\u8981\u5b57\u6bb5<\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td><code>admin_logs<\/code><\/td><td>\u7ba1\u7406\u5458\u65e5\u5fd7<\/td><td>admin_id, action_type, target_resource<\/td><td>\u7ba1\u7406\u5458\u64cd\u4f5c\u5ba1\u8ba1\u65e5\u5fd7<\/td><\/tr><tr><td><code>system_logs<\/code><\/td><td>\u7cfb\u7edf\u65e5\u5fd7<\/td><td>level, message, meta, timestamp<\/td><td>Winston \u65e5\u5fd7\u5b58\u50a8<\/td><\/tr><tr><td><code>sms_codes<\/code><\/td><td>\u77ed\u4fe1\u9a8c\u8bc1\u7801<\/td><td>phone, code, expires_at<\/td><td>\u77ed\u4fe1\u9a8c\u8bc1\u7801\u4e34\u65f6\u5b58\u50a8<\/td><\/tr><tr><td><code>verification_codes<\/code><\/td><td>\u901a\u7528\u9a8c\u8bc1\u7801<\/td><td>phone, code, purpose, is_used<\/td><td>\u901a\u7528\u9a8c\u8bc1\u7801\u7ba1\u7406<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0c API \u63a5\u53e3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u8ba4\u8bc1\u63a5\u53e3<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6cd5<\/th><th>\u8def\u5f84<\/th><th>\u8bf4\u660e<\/th><th>\u53c2\u6570<\/th><\/tr><\/thead><tbody><tr><td><code>POST<\/code><\/td><td><code>\/api\/auth\/sms\/send<\/code><\/td><td>\u53d1\u9001\u77ed\u4fe1\u9a8c\u8bc1\u7801<\/td><td>phone<\/td><\/tr><tr><td><code>POST<\/code><\/td><td><code>\/api\/auth\/register<\/code><\/td><td>\u7528\u6237\u6ce8\u518c<\/td><td>phone, code, password<\/td><\/tr><tr><td><code>POST<\/code><\/td><td><code>\/api\/auth\/login<\/code><\/td><td>\u7528\u6237\u767b\u5f55<\/td><td>loginType, phone, password\/code<\/td><\/tr><tr><td><code>POST<\/code><\/td><td><code>\/api\/auth\/wechat<\/code><\/td><td>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u767b\u5f55<\/td><td>code<\/td><\/tr><tr><td><code>POST<\/code><\/td><td><code>\/api\/auth\/refresh<\/code><\/td><td>\u5237\u65b0 Token<\/td><td>refreshToken<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/auth\/profile<\/code><\/td><td>\u83b7\u53d6\u7528\u6237\u4fe1\u606f<\/td><td>&#8211;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u533a\u57df\u63a5\u53e3<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6cd5<\/th><th>\u8def\u5f84<\/th><th>\u8bf4\u660e<\/th><th>\u53c2\u6570<\/th><\/tr><\/thead><tbody><tr><td><code>GET<\/code><\/td><td><code>\/api\/districts<\/code><\/td><td>\u83b7\u53d6\u6240\u6709\u533a\u53bf<\/td><td>&#8211;<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/streets<\/code><\/td><td>\u83b7\u53d6\u8857\u9053\u5217\u8868<\/td><td>district<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/communities<\/code><\/td><td>\u83b7\u53d6\u5c0f\u533a\u5217\u8868<\/td><td>district, street<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/buildings<\/code><\/td><td>\u83b7\u53d6\u697c\u680b\u5217\u8868<\/td><td>communityId<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u6a21\u578b\u63a5\u53e3<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6cd5<\/th><th>\u8def\u5f84<\/th><th>\u8bf4\u660e<\/th><th>\u53c2\u6570<\/th><\/tr><\/thead><tbody><tr><td><code>GET<\/code><\/td><td><code>\/api\/model<\/code><\/td><td>\u83b7\u53d6\u6a21\u578b\u4fe1\u606f<\/td><td>district, street, communityId, buildingId<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/model\/:id<\/code><\/td><td>\u83b7\u53d6\u6a21\u578b\u8be6\u60c5<\/td><td>id<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/model-file\/:id<\/code><\/td><td>\u83b7\u53d6\u6a21\u578b\u6587\u4ef6\u6d41<\/td><td>id<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/huxing<\/code><\/td><td>\u83b7\u53d6\u6237\u578b\u5217\u8868<\/td><td>buildingId<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u7ed1\u5b9a\u63a5\u53e3<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6cd5<\/th><th>\u8def\u5f84<\/th><th>\u8bf4\u660e<\/th><th>\u53c2\u6570<\/th><\/tr><\/thead><tbody><tr><td><code>POST<\/code><\/td><td><code>\/api\/user\/binding<\/code><\/td><td>\u7ed1\u5b9a\u6237\u578b<\/td><td>modelId<\/td><\/tr><tr><td><code>GET<\/code><\/td><td><code>\/api\/user\/binding\/status<\/code><\/td><td>\u83b7\u53d6\u7ed1\u5b9a\u72b6\u6001<\/td><td>&#8211;<\/td><\/tr><tr><td><code>DELETE<\/code><\/td><td><code>\/api\/user\/binding<\/code><\/td><td>\u89e3\u7ed1\u6237\u578b<\/td><td>&#8211;<\/td><\/tr><tr><td><code>POST<\/code><\/td><td><code>\/api\/user\/binding-change<\/code><\/td><td>\u7533\u8bf7\u6362\u7ed1<\/td><td>newModelId<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 \u5feb\u901f\u5f00\u59cb<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u73af\u5883\u8981\u6c42<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Node.js<\/strong> 14+<\/li>\n\n\n\n<li><strong>MySQL<\/strong> 8.0+<\/li>\n\n\n\n<li><strong>HBuilderX<\/strong> \u6700\u65b0\u7248<\/li>\n\n\n\n<li><strong>\u5fae\u4fe1\u5f00\u53d1\u8005\u5de5\u5177<\/strong><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u514b\u9686\u9879\u76ee<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;git clone https:\/\/gitee.com\/your-repo\/bim-miniprogram.git<br>&nbsp;cd bim-miniprogram<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u914d\u7f6e\u6570\u636e\u5e93<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;# \u5bfc\u5165\u6570\u636e\u5e93\u7ed3\u6784<br>&nbsp;mysql -u root -p &lt; 111.sql<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u540e\u7aef\u73af\u5883\u914d\u7f6e<\/h3>\n\n\n\n<p>\u5728 <code>backend<\/code> \u76ee\u5f55\u4e0b\u521b\u5efa <code>.env<\/code> \u6587\u4ef6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;# \u670d\u52a1\u5668\u914d\u7f6e<br>&nbsp;PORT=11409<br>&nbsp;\u200b<br>&nbsp;# \u6570\u636e\u5e93\u914d\u7f6e<br>&nbsp;DB_HOST=localhost<br>&nbsp;DB_PORT=3306<br>&nbsp;DB_USER=root<br>&nbsp;DB_PASSWORD=your_password<br>&nbsp;DB_NAME=model-library<br>&nbsp;\u200b<br>&nbsp;# JWT \u914d\u7f6e<br>&nbsp;JWT_SECRET_CURRENT=your_jwt_secret_key<br>&nbsp;REFRESH_TOKEN_SECRET=your_refresh_token_secret<br>&nbsp;JWT_EXPIRES_IN=1h<br>&nbsp;REFRESH_EXPIRES_IN=7d<br>&nbsp;\u200b<br>&nbsp;# \u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u914d\u7f6e<br>&nbsp;WECHAT_APPID=your_wechat_miniprogram_appid<br>&nbsp;WECHAT_SECRET=your_wechat_miniprogram_secret<br>&nbsp;\u200b<br>&nbsp;# \u963f\u91cc\u4e91\u77ed\u4fe1\u670d\u52a1\u914d\u7f6e\uff08\u53ef\u9009\uff09<br>&nbsp;ALI_SMS_ACCESS_KEY_ID=your_ali_access_key_id<br>&nbsp;ALI_SMS_ACCESS_KEY_SECRET=your_ali_access_key_secret<br>&nbsp;ALI_SMS_SIGN_NAME=your_sms_sign_name<br>&nbsp;ALI_SMS_TEMPLATE_CODE=your_sms_template_code<\/pre>\n\n\n\n<p><strong>\u914d\u7f6e\u8bf4\u660e\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u672a\u914d\u7f6e\u963f\u91cc\u4e91\u77ed\u4fe1\u670d\u52a1\uff0c\u9a8c\u8bc1\u7801\u5c06\u53ea\u5728\u63a7\u5236\u53f0\u8f93\u51fa\uff08\u5f00\u53d1\u6a21\u5f0f\uff09<\/li>\n\n\n\n<li>\u6570\u636e\u5e93\u540d\u79f0\u5fc5\u987b\u4e3a <code>model-library<\/code>\uff08\u4e0e SQL \u6587\u4ef6\u5bf9\u5e94\uff09<\/li>\n\n\n\n<li>JWT \u5bc6\u94a5\u5efa\u8bae\u4f7f\u7528 32 \u4f4d\u4ee5\u4e0a\u7684\u968f\u673a\u5b57\u7b26\u4e32<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4. \u542f\u52a8\u540e\u7aef\u670d\u52a1<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;cd backend<br>&nbsp;npm install<br>&nbsp;npm run dev &nbsp;# \u5f00\u53d1\u6a21\u5f0f<br>&nbsp;# \u6216<br>&nbsp;npm run start &nbsp;# \u751f\u4ea7\u6a21\u5f0f<\/pre>\n\n\n\n<p><strong>\u53ef\u9009\uff1a\u6a21\u578b\u5e93\u540c\u6b65<\/strong><\/p>\n\n\n\n<p>\u5982\u679c\u9700\u8981\u5c06\u6587\u4ef6\u7cfb\u7edf\u7684\u6a21\u578b\u6570\u636e\u540c\u6b65\u5230\u6570\u636e\u5e93\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;# \u8fd0\u884c\u6a21\u578b\u5e93\u540c\u6b65\u811a\u672c<br>&nbsp;node scripts\/sync-model-library.js<\/pre>\n\n\n\n<p><strong>\u53ef\u9009\uff1a\u7ba1\u7406\u5458\u8d26\u6237\u8bbe\u7f6e<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;# \u751f\u6210\u7ba1\u7406\u5458\u5bc6\u7801\u54c8\u5e0c\uff08\u9ed8\u8ba4\u5bc6\u7801 BIM1409\uff09<br>&nbsp;node hash_password.js<br>&nbsp;# \u5c06\u8f93\u51fa\u7684\u54c8\u5e0c\u503c\u624b\u52a8\u63d2\u5165\u6570\u636e\u5e93 users \u8868<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. \u914d\u7f6e\u5fae\u4fe1\u5c0f\u7a0b\u5e8f<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u65b9\u5f0f\u4e00\uff1aHBuilderX\uff08\u63a8\u8350\uff09<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728 HBuilderX \u4e2d\u6253\u5f00 <code>frontend<\/code> \u76ee\u5f55<\/li>\n\n\n\n<li>\u4fee\u6539 <code>src\/manifest.json<\/code> \u4e2d\u7684\u5fae\u4fe1\u5c0f\u7a0b\u5e8f AppID<\/li>\n\n\n\n<li>\u70b9\u51fb&#8221;\u8fd0\u884c&#8221; -> &#8220;\u8fd0\u884c\u5230\u5c0f\u7a0b\u5e8f\u6a21\u62df\u5668&#8221; -> &#8220;\u5fae\u4fe1\u5f00\u53d1\u8005\u5de5\u5177&#8221;<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">\u65b9\u5f0f\u4e8c\uff1a\u547d\u4ee4\u884c<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;cd frontend<br>&nbsp;npm install<br>&nbsp;# uni-app \u6784\u5efa\u547d\u4ee4<br>&nbsp;npm run dev:mp-weixin &nbsp;# \u5f00\u53d1\u73af\u5883<br>&nbsp;npm run build:mp-weixin # \u751f\u4ea7\u73af\u5883<\/pre>\n\n\n\n<p><strong>\u91cd\u8981\u8bf4\u660e\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>frontend<\/code> \u4f7f\u7528 <strong>uni-app<\/strong> \u6846\u67b6\uff0c\u652f\u6301 Vue3 + UTS<\/li>\n\n\n\n<li>\u652f\u6301\u53cc\u6784\u5efa\u7cfb\u7edf\uff1aVite\uff08\u4e3b\u8981\uff09+ Webpack\uff08\u517c\u5bb9\uff09<\/li>\n\n\n\n<li>\u5305\u542b\u81ea\u5b9a\u4e49 Pinia \u6301\u4e45\u5316\u63d2\u4ef6<\/li>\n\n\n\n<li>\u652f\u6301 uni-app x \u539f\u751f\u5f00\u53d1<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6. \u542f\u52a8\u7ba1\u7406\u540e\u53f0<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;cd admin-frontend<br>&nbsp;npm install<br>&nbsp;npm run dev<\/pre>\n\n\n\n<p>\u8bbf\u95ee <code>http:\/\/localhost:5173<\/code> \u8fdb\u5165\u7ba1\u7406\u540e\u53f0<\/p>\n\n\n\n<p><strong>\u7ba1\u7406\u540e\u53f0\u7279\u6027\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7eaf Vue3 + Vite SPA \u5e94\u7528<\/li>\n\n\n\n<li>Element Plus UI \u7ec4\u4ef6\u5e93<\/li>\n\n\n\n<li>Vue Router 4 \u8def\u7531\u7ba1\u7406<\/li>\n\n\n\n<li>\u5f00\u53d1\u670d\u52a1\u5668\u4ee3\u7406\u540e\u7aef API<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf10 \u90e8\u7f72\u8bf4\u660e<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u751f\u4ea7\u73af\u5883\u8981\u6c42<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u670d\u52a1\u5668<\/strong>\uff1aWindows Server 2012R2+<\/li>\n\n\n\n<li><strong>Web \u670d\u52a1\u5668<\/strong>\uff1aIIS + PM2<\/li>\n\n\n\n<li><strong>\u57df\u540d<\/strong>\uff1ahk-ad.cn\uff08\u5df2\u914d\u7f6e NAT \u6620\u5c04\uff09<\/li>\n\n\n\n<li><strong>\u6570\u636e\u5e93<\/strong>\uff1aMySQL 8.0<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u90e8\u7f72\u6b65\u9aa4<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4ee3\u7801\u90e8\u7f72<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;# \u4f7f\u7528\u81ea\u52a8\u90e8\u7f72\u811a\u672c<br>&nbsp;deploy.bat<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>PM2 \u8fdb\u7a0b\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;cd backend<br>&nbsp;pm2 start ecosystem.config.js<br>&nbsp;pm2 save<br>&nbsp;pm2 startup<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>IIS \u914d\u7f6e<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u5230 Node.js \u670d\u52a1<\/li>\n\n\n\n<li>\u542f\u7528 HTTPS \u8bc1\u4e66<\/li>\n\n\n\n<li>\u914d\u7f6e\u9759\u6001\u6587\u4ef6\u670d\u52a1<\/li>\n<\/ul>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u5c0f\u7a0b\u5e8f\u53d1\u5e03<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728 HBuilderX \u4e2d\u6784\u5efa\u5c0f\u7a0b\u5e8f<\/li>\n\n\n\n<li>\u4e0a\u4f20\u5230\u5fae\u4fe1\u5f00\u53d1\u8005\u5de5\u5177<\/li>\n\n\n\n<li>\u63d0\u4ea4\u5ba1\u6838\u5e76\u53d1\u5e03<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u76d1\u63a7\u4e0e\u7ef4\u62a4<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u65e5\u5fd7\u6587\u4ef6<\/strong>\uff1a<code>backend\/logs\/<\/code><\/li>\n\n\n\n<li><strong>PM2 \u76d1\u63a7<\/strong>\uff1a<code>pm2 monit<\/code><\/li>\n\n\n\n<li><strong>\u5065\u5eb7\u68c0\u67e5<\/strong>\uff1a<code>GET \/health<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc8 \u6027\u80fd\u4f18\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u524d\u7aef\u4f18\u5316<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7aef<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5206\u5305\u52a0\u8f7d<\/strong>\uff1a3D \u6a21\u578b\u76f8\u5173\u4ee3\u7801\u5206\u5305\u5904\u7406\uff0c\u51cf\u5c11\u4e3b\u5305\u5927\u5c0f<\/li>\n\n\n\n<li><strong>\u53cc\u6784\u5efa\u652f\u6301<\/strong>\uff1aVite + Webpack \u53cc\u6784\u5efa\u7cfb\u7edf\uff0c\u786e\u4fdd\u517c\u5bb9\u6027<\/li>\n\n\n\n<li><strong>\u8d44\u6e90\u538b\u7f29<\/strong>\uff1aDRACO \u51e0\u4f55\u4f53\u538b\u7f29\uff0cTerser \u4ee3\u7801\u538b\u7f29<\/li>\n\n\n\n<li><strong>\u61d2\u52a0\u8f7d<\/strong>\uff1a\u6309\u9700\u52a0\u8f7d\u6a21\u578b\u6587\u4ef6\uff0c\u4f18\u5316\u9996\u5c4f\u65f6\u95f4<\/li>\n\n\n\n<li><strong>UTS \u4f18\u5316<\/strong>\uff1auni-app x \u539f\u751f\u6027\u80fd\u4f18\u5316<\/li>\n\n\n\n<li><strong>\u81ea\u5b9a\u4e49\u63d2\u4ef6<\/strong>\uff1aPinia \u6301\u4e45\u5316\u63d2\u4ef6\uff0c\u51cf\u5c11\u7b2c\u4e09\u65b9\u4f9d\u8d56<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u7ba1\u7406\u540e\u53f0\u7aef<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Vite \u6784\u5efa<\/strong>\uff1a\u5feb\u901f\u7684\u70ed\u91cd\u8f7d\u548c\u6784\u5efa\u901f\u5ea6<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u5206\u5272<\/strong>\uff1a\u52a8\u6001 import \u5b9e\u73b0\u8def\u7531\u7ea7\u522b\u7684\u4ee3\u7801\u5206\u5272<\/li>\n\n\n\n<li><strong>Tree Shaking<\/strong>\uff1a\u5220\u9664\u672a\u4f7f\u7528\u7684\u4ee3\u7801<\/li>\n\n\n\n<li><strong>\u9759\u6001\u8d44\u6e90\u4f18\u5316<\/strong>\uff1a\u56fe\u7247\u538b\u7f29\u548c\u683c\u5f0f\u4f18\u5316<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u540e\u7aef\u4f18\u5316<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6570\u636e\u5e93\u8fde\u63a5\u6c60<\/strong>\uff1amysql2 \u8fde\u63a5\u6c60\uff0c\u652f\u6301\u5e76\u53d1\u67e5\u8be2\u4f18\u5316<\/li>\n\n\n\n<li><strong>\u6a21\u578b\u6587\u4ef6\u670d\u52a1<\/strong>\uff1a\u9759\u6001\u6587\u4ef6\u7f13\u5b58\uff0c\u652f\u6301\u5927\u6587\u4ef6\u6d41\u5f0f\u4f20\u8f93<\/li>\n\n\n\n<li><strong>\u63a5\u53e3\u9650\u6d41<\/strong>\uff1aexpress-rate-limit \u9632\u62a4\uff0c\u6309 IP \u548c\u529f\u80fd\u5206\u7ea7\u9650\u6d41<\/li>\n\n\n\n<li><strong>\u591a\u5c42\u65e5\u5fd7\u7cfb\u7edf<\/strong>\uff1aWinston \u6587\u4ef6+\u6570\u636e\u5e93\u53cc\u5199\uff0c\u5206\u7ea7\u8bb0\u5f55<\/li>\n\n\n\n<li><strong>\u81ea\u52a8\u5316\u811a\u672c<\/strong>\uff1a\u6a21\u578b\u5e93\u6587\u4ef6\u7cfb\u7edf\u4e0e\u6570\u636e\u5e93\u81ea\u52a8\u540c\u6b65<\/li>\n\n\n\n<li><strong>\u5b89\u5168\u4e2d\u95f4\u4ef6<\/strong>\uff1aHelmet \u5b89\u5168\u5934\uff0cCORS \u8de8\u57df\u914d\u7f6e<\/li>\n\n\n\n<li><strong>\u9519\u8bef\u5904\u7406<\/strong>\uff1a\u7edf\u4e00\u9519\u8bef\u5904\u7406\u4e2d\u95f4\u4ef6\uff0c\u7ed3\u6784\u5316\u9519\u8bef\u54cd\u5e94<\/li>\n\n\n\n<li><strong>\u6587\u4ef6\u4e0a\u4f20<\/strong>\uff1aMulter \u591a\u5a92\u4f53\u6587\u4ef6\u5904\u7406\uff0c\u652f\u6301\u5934\u50cf\u4e0a\u4f20<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3D \u6e32\u67d3\u4f18\u5316<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>LOD \u6280\u672f<\/strong>\uff1a\u591a\u7ec6\u8282\u5c42\u6b21\u6a21\u578b<\/li>\n\n\n\n<li><strong>\u89c6\u9525\u4f53\u88c1\u526a<\/strong>\uff1a\u53ea\u6e32\u67d3\u53ef\u89c1\u90e8\u5206<\/li>\n\n\n\n<li><strong>\u6750\u8d28\u5408\u5e76<\/strong>\uff1a\u51cf\u5c11 DrawCall<\/li>\n\n\n\n<li><strong>\u7eb9\u7406\u538b\u7f29<\/strong>\uff1a\u51cf\u5c11\u663e\u5b58\u5360\u7528<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udd1d \u5f00\u53d1\u89c4\u8303<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ee3\u7801\u89c4\u8303<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u524d\u7aef<\/strong>\uff1aESLint + Prettier<\/li>\n\n\n\n<li><strong>\u540e\u7aef<\/strong>\uff1a\u7edf\u4e00\u9519\u8bef\u5904\u7406\u548c\u54cd\u5e94\u683c\u5f0f<\/li>\n\n\n\n<li><strong>\u6570\u636e\u5e93<\/strong>\uff1a\u7edf\u4e00\u547d\u540d\u89c4\u8303\u548c\u5916\u952e\u7ea6\u675f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Git \u5de5\u4f5c\u6d41<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4e3b\u5206\u652f<\/strong>\uff1a<code>master<\/code>\uff08\u751f\u4ea7\u73af\u5883\uff09<\/li>\n\n\n\n<li><strong>\u5f00\u53d1\u5206\u652f<\/strong>\uff1a<code>develop<\/code>\uff08\u6d4b\u8bd5\u73af\u5883\uff09<\/li>\n\n\n\n<li><strong>\u529f\u80fd\u5206\u652f<\/strong>\uff1a<code>feature\/xxx<\/code><\/li>\n\n\n\n<li><strong>\u4fee\u590d\u5206\u652f<\/strong>\uff1a<code>bugfix\/xxx<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u90e8\u7f72\u6d41\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u529f\u80fd\u5f00\u53d1 \u2192 <code>feature<\/code> \u5206\u652f<\/li>\n\n\n\n<li>\u5408\u5e76\u5230 <code>develop<\/code> \u2192 \u6d4b\u8bd5\u73af\u5883\u9a8c\u8bc1<\/li>\n\n\n\n<li>\u5408\u5e76\u5230 <code>master<\/code> \u2192 \u751f\u4ea7\u73af\u5883\u90e8\u7f72<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc4 \u8bb8\u53ef\u8bc1<\/h2>\n\n\n\n<p>\u672c\u9879\u76ee\u4e3a\u79c1\u6709\u9879\u76ee\uff0c\u7248\u6743\u5f52\u534e\u79d1\u667a\u5bb6\u6240\u6709\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udccb \u76ee\u5f55 \ud83c\udfaf \u9879\u76ee\u6982\u8ff0 \u534e\u79d1\u667a\u5bb6 BIM \u6237\u578b\u6a21\u578b\u5c55\u793a\u7cfb\u7edf\u662f\u4e00\u4e2a\u4e13\u4e1a\u7684\u5efa\u7b51\u4fe1\u606f\u6a21\u578b\u53ef\u89c6\u5316\u5e73\u53f0\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u6c89\u6d78\u5f0f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[6,10],"tags":[511],"class_list":["post-7068","post","type-post","status-publish","format-standard","hentry","category-build","category-coding","tag-bim","entry"],"_links":{"self":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/7068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/comments?post=7068"}],"version-history":[{"count":2,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/7068\/revisions"}],"predecessor-version":[{"id":7070,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/posts\/7068\/revisions\/7070"}],"wp:attachment":[{"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/media?parent=7068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/categories?post=7068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xinyixx.com\/index.php\/wp-json\/wp\/v2\/tags?post=7068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}