BIM 户型模型展示微信小程序

🏗️ BIM 户型模型展示微信小程序

基于微信小程序平台的 BIM(建筑信息模型)3D 可视化查看应用,采用前后端分离架构,支持多级区域筛选、3D 模型交互展示、用户认证管理等功能。

技术栈
小程序
部署状态

📋 目录

🎯 项目概述

华科智家 BIM 户型模型展示系统是一个专业的建筑信息模型可视化平台,为用户提供沉浸式的 3D 户型查看体验。系统支持聊城市区域内多个房地产项目的户型模型展示,用户可以通过微信小程序进行在线浏览、交互和收藏。

核心价值

  • 🏠 真实还原:基于 BIM 技术的高精度 3D 户型模型
  • 📱 便捷访问:微信小程序,即用即走
  • 🎮 交互体验:支持 360° 旋转、缩放、房间切换
  • 🔐 安全可靠:完整的用户认证和权限管理
  • 📊 数据管理:完善的后台管理系统

🏗️ 系统架构

graph TB A[用户微信小程序] --> B[uni-app前端] B --> C[H5 3D模型展示] B --> D[Express后端API] E[管理员后台] --> D D --> F[MySQL数据库] D --> G[模型文件存储] subgraph "前端技术栈" B --> H[Vue3 + Pinia] C --> I[Three.js + WebGL] E --> J[Vue3 + Element Plus] end subgraph "后端技术栈" D --> K[Node.js + Express] D --> L[JWT认证] D --> M[文件上传/下载] end subgraph "部署环境" D --> N[PM2进程管理] N --> O[Windows Server + IIS] F --> P[MySQL 8.0] end

💻 技术栈

前端技术栈

微信小程序端 (frontend/)

技术 版本 用途 说明
uni-app 最新版 跨平台开发框架 微信小程序主框架
Vue 3 3.5.13 渐进式 JavaScript 框架 SSR 应用,支持 uni-app x
Pinia 3.0.2 状态管理 自定义持久化插件
Three.js 0.175.0 3D 图形库 WebGL 3D 模型渲染
Vite 6.2.2 构建工具 uni-app 官方 Vite 插件
Webpack 5.x 模块打包 vue.config.js 配置优化
UTS 最新版 TypeScript 方言 uni-app x 原生开发语言

管理后台端 (admin-frontend/)

技术 版本 用途 说明
Vue 3 3.5.13 渐进式 JavaScript 框架 Composition API
Vue Router 4.5.1 路由管理 SPA 单页应用路由
Element Plus 2.9.11 UI 组件库 管理后台 UI 组件
Vite 6.3.5 构建工具 现代化前端构建工具
Axios 1.9.0 HTTP 客户端 API 请求库

后端技术栈

技术 版本 用途 说明
Node.js 14+ JavaScript 运行时 服务端运行环境
Express 4.21.2 Web 框架 RESTful API 服务
MySQL 8.0.42 关系型数据库 数据持久化存储
mysql2 3.14.0 数据库驱动 原生 SQL 查询,连接池管理
JWT 9.0.2 身份认证 无状态用户认证
bcrypt 5.1.1 密码加密 用户密码安全存储
Winston 3.17.0 日志系统 多传输方式日志(文件+DB)
winston-mysql 1.1.1 MySQL 日志传输 日志写入数据库
阿里云 SMS SDK 1.1.6 短信服务 验证码发送服务
express-validator 7.2.1 请求验证 API 参数验证
express-rate-limit 7.5.0 接口限流 防止恶意请求
helmet 8.1.0 安全中间件 HTTP 安全头设置
multer 1.4.5 文件上传 多媒体文件上传处理
PM2 - 进程管理 生产环境进程守护

3D 渲染技术

技术 用途 特性
HKGLTF-ES6 自研 3D 引擎 基于 Three.js 的定制化 3D 模型查看器
DRACO 压缩 模型压缩 几何体压缩,减少传输大小
WebGL 硬件加速 GPU 加速的 3D 图形渲染
材质系统 真实感渲染 支持 PBR 材质和光照系统

✨ 功能特性

🔐 用户认证系统

  • 微信小程序授权登录
  • 手机号快捷登录
  • 短信验证码认证
  • JWT Token + Refresh Token 双令牌机制
  • 用户角色权限管理(用户/管理员)

🏠 户型选择系统

graph LR A[微信小程序启动] --> B[用户认证] B --> C[户型选择] C --> D[区县选择] D --> E[街道选择] E --> F[小区选择] F --> G[楼栋选择] G --> H[户型绑定] H --> I[3D模型展示] subgraph "认证方式" B --> J[微信授权登录] B --> K[短信验证码] B --> L[密码登录] end subgraph "3D展示功能" I --> M[模型加载] I --> N[视角控制] I --> O[房间标签] I --> P[系统管线] I --> Q[材质切换] end
  • 四级筛选:区县 → 街道 → 小区 → 楼栋
  • 智能搜索:支持关键词快速定位
  • 收藏功能:用户可收藏心仪户型
  • 绑定管理:用户户型绑定和变更申请

🎮 3D 模型交互

  • 高质量渲染:基于 Three.js 的 WebGL 渲染
  • 多种控制:旋转、缩放、平移、飞行
  • 房间导航:房间列表、房间标签、快速跳转
  • 视角预设:鸟瞰视角、平面视角、房间视角
  • 材质系统:电气系统、供暖系统可视化
  • 亮度调节:用户可调节场景亮度

📊 管理后台

  • 用户管理:用户信息查看、角色分配
  • 模型管理:3D 模型上传、编辑、删除
  • 绑定审核:用户换绑申请审核
  • 日志监控:系统操作日志记录

📁 项目结构

A-WXXCX/
├── 📱 frontend/                    # uni-app 微信小程序
│   ├── src/
│   │   ├── pages/                  # 页面组件
│   │   │   ├── launch.vue          # 启动页面
│   │   │   ├── login.vue           # 登录页面
│   │   │   ├── xuanzehuxing.vue    # 户型选择页面
│   │   │   ├── zhuce.vue           # 注册页面
│   │   │   └── wode.vue            # 个人中心
│   │   ├── subpackages/model/      # 3D 模型分包
│   │   │   ├── pages/
│   │   │   │   └── huxingmoxing.vue # 3D 模型展示页面
│   │   │   └── static/HKGLTF-ES6/  # 3D 渲染引擎
│   │   │       ├── js/src/         # 核心渲染逻辑
│   │   │       ├── libs/           # 第三方库(DRACO等)
│   │   │       └── loaders/        # 模型加载器
│   │   ├── api/                    # API 接口封装
│   │   ├── store/                  # Pinia 状态管理
│   │   ├── components/             # 公共组件
│   │   ├── utils/                  # 工具函数
│   │   ├── main.js                 # JavaScript 入口文件
│   │   ├── main.uts                # UTS 入口文件 (uni-app x)
│   │   ├── App.vue                 # Vue 应用根组件
│   │   ├── App.uvue                # UVue 根组件 (uni-app x)
│   │   └── vite.config.js          # Vite 配置文件
│   ├── manifest.json               # 小程序配置
│   ├── pages.json                  # 页面路由配置
│   ├── vue.config.js               # Webpack 构建配置
│   ├── clean-unused-files.js       # 文件清理脚本
│   └── 分包优化指南.md             # 分包优化文档
│
├── 🖥️ backend/                     # Node.js 后端服务
│   ├── src/
│   │   ├── controllers/            # 控制器层(HTTP 请求处理)
│   │   │   ├── authController.js   # 用户认证控制器
│   │   │   ├── modelController.js  # 3D 模型控制器
│   │   │   ├── districtController.js # 区域数据控制器
│   │   │   ├── communityController.js # 小区数据控制器
│   │   │   ├── adminController.js  # 管理员功能控制器
│   │   │   ├── uploadController.js # 文件上传控制器
│   │   │   └── userBindingController.js # 用户绑定控制器
│   │   ├── middleware/              # Express 中间件
│   │   │   ├── authMiddleware.js   # JWT 认证中间件
│   │   │   ├── adminMiddleware.js  # 管理员权限中间件
│   │   │   └── errorHandler.js     # 全局错误处理中间件
│   │   ├── routes/                 # 路由定义
│   │   │   ├── api.js              # 公共 API 路由
│   │   │   └── admin.js            # 管理员路由
│   │   ├── services/               # 业务逻辑服务层
│   │   │   ├── adminService.js     # 管理员业务服务
│   │   │   ├── bindingService.js   # 绑定业务服务
│   │   │   ├── smsService.js       # 短信服务(阿里云)
│   │   │   └── dbService.js        # 数据库查询服务
│   │   ├── models/                 # 数据模型层
│   │   │   └── model.js            # 模型数据操作
│   │   ├── utils/                  # 工具函数
│   │   │   ├── logger.js           # Winston 日志配置
│   │   │   ├── dbPool.js           # 数据库连接池
│   │   │   └── httpError.js        # HTTP 错误处理
│   │   ├── config/                 # 配置文件
│   │   │   └── database.js         # 数据库连接配置
│   │   └── index.js                # Express 应用入口
│   ├── database/
│   │   └── db.js                   # 数据库连接与查询封装
│   ├── scripts/
│   │   └── sync-model-library.js  # 模型库自动同步脚本
│   ├── models/
│   │   ├── Model-library/          # 3D 模型文件存储目录
│   │   └── server.js               # 独立模型服务器(测试用)
│   ├── logs/                       # 日志文件目录
│   ├── hash_password.js            # 密码哈希工具脚本
│   ├── package.json                # 项目依赖配置
│   └── ecosystem.config.js         # PM2 进程管理配置
│
├── 🔧 admin-frontend/              # Vue3 + Vite 管理后台
│   ├── src/
│   │   ├── views/                  # 页面视图
│   │   │   ├── Login.vue           # 管理员登录
│   │   │   ├── ModelManage.vue     # 模型管理
│   │   │   ├── DesignDoc.vue       # 设计文档
│   │   │   └── BindingChangeReview.vue # 绑定审核
│   │   ├── components/             # 管理组件
│   │   ├── router/                 # Vue Router 路由
│   │   ├── services/               # API 服务层
│   │   ├── stores/                 # 状态管理(可选)
│   │   ├── utils/                  # 工具函数
│   │   ├── assets/                 # 静态资源
│   │   ├── main.js                 # 应用入口
│   │   ├── App.vue                 # 根组件
│   │   └── style.css               # 全局样式
│   ├── public/                     # 公共静态文件
│   ├── dist/                       # 构建输出目录
│   ├── vite.config.js              # Vite 配置
│   └── index.html                  # HTML 入口
│
├── 📊 111.sql                      # 数据库结构文件
├── 🚀 deploy.bat                   # 自动部署脚本
└── 📖 README.md                    # 项目说明文档

🗄️ 数据库设计

erDiagram users ||--o{ user_huxing_bindings : "绑定" users ||--o{ refresh_tokens : "拥有" users ||--o{ favorites : "收藏" users ||--o{ admin_logs : "记录" users ||--o{ binding_change_requests : "申请" models ||--o{ user_huxing_bindings : "被绑定" models ||--o{ model_properties : "属性" models ||--o{ model_rooms : "房间" models ||--o{ model_viewpoints : "视点" models ||--o{ favorites : "被收藏" districts ||--o{ streets : "包含" districts ||--o{ communities : "包含" districts ||--o{ buildings : "包含" districts ||--o{ models : "关联" streets ||--o{ communities : "包含" streets ||--o{ buildings : "包含" streets ||--o{ models : "关联" communities ||--o{ buildings : "包含" communities ||--o{ models : "关联" buildings ||--o{ models : "关联" users { int id PK string phone UK string openid string name string avatar string password_hash enum role datetime created_at datetime updated_at } models { int id PK string name int district_id FK int street_id FK int community_id FK int building_id FK string file_path string thumbnail_path text description double area datetime created_at datetime updated_at } districts { int id PK string name string type } streets { int id PK int district_id FK string name } communities { int id PK int district_id FK int street_id FK string name } buildings { int id PK int district_id FK int street_id FK int community_id FK string name }

完整数据表结构(16 张表)

核心业务表

表名 用途 主要字段 说明
users 用户信息 id, phone, openid, name, avatar, role 支持微信用户和管理员
models 3D 模型信息 id, name, file_path, area, description 模型元数据和文件路径
districts 区县信息 id, name, type 行政区划-区县级
streets 街道信息 id, district_id, name 行政区划-街道级
communities 小区信息 id, district_id, street_id, name 房地产项目-小区级
buildings 楼栋信息 id, community_id, name 房地产项目-楼栋级

用户业务表

表名 用途 主要字段 说明
user_huxing_bindings 用户户型绑定 user_id, model_id, status 用户与户型的绑定关系
binding_change_requests 换绑申请 user_id, old_huxing_id, new_huxing_id 用户换绑申请审核
favorites 用户收藏 user_id, model_id 用户收藏的户型模型
refresh_tokens 刷新令牌 user_id, token, expires_at JWT 刷新令牌管理

模型扩展表

表名 用途 主要字段 说明
model_properties 模型属性 model_id, property_name, property_value 模型的自定义属性
model_rooms 模型房间信息 model_id, name, area, position_x/y/z 房间空间信息和位置
model_viewpoints 模型视点 model_id, name, position_x/y/z, target_x/y/z 预设相机视点

系统管理表

表名 用途 主要字段 说明
admin_logs 管理员日志 admin_id, action_type, target_resource 管理员操作审计日志
system_logs 系统日志 level, message, meta, timestamp Winston 日志存储
sms_codes 短信验证码 phone, code, expires_at 短信验证码临时存储
verification_codes 通用验证码 phone, code, purpose, is_used 通用验证码管理

🔌 API 接口

认证接口

方法 路径 说明 参数
POST /api/auth/sms/send 发送短信验证码 phone
POST /api/auth/register 用户注册 phone, code, password
POST /api/auth/login 用户登录 loginType, phone, password/code
POST /api/auth/wechat 微信小程序登录 code
POST /api/auth/refresh 刷新 Token refreshToken
GET /api/auth/profile 获取用户信息 -

区域接口

方法 路径 说明 参数
GET /api/districts 获取所有区县 -
GET /api/streets 获取街道列表 district
GET /api/communities 获取小区列表 district, street
GET /api/buildings 获取楼栋列表 communityId

模型接口

方法 路径 说明 参数
GET /api/model 获取模型信息 district, street, communityId, buildingId
GET /api/model/:id 获取模型详情 id
GET /api/model-file/:id 获取模型文件流 id
GET /api/huxing 获取户型列表 buildingId

用户绑定接口

方法 路径 说明 参数
POST /api/user/binding 绑定户型 modelId
GET /api/user/binding/status 获取绑定状态 -
DELETE /api/user/binding 解绑户型 -
POST /api/user/binding-change 申请换绑 newModelId

🚀 快速开始

环境要求

  • Node.js 14+
  • MySQL 8.0+
  • HBuilderX 最新版
  • 微信开发者工具

1. 克隆项目

git clone https://gitee.com/your-repo/bim-miniprogram.git
cd bim-miniprogram

2. 配置数据库

# 导入数据库结构
mysql -u root -p < 111.sql

3. 后端环境配置

backend 目录下创建 .env 文件:

# 服务器配置
PORT=11409

# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=model-library

# JWT 配置
JWT_SECRET_CURRENT=your_jwt_secret_key
REFRESH_TOKEN_SECRET=your_refresh_token_secret
JWT_EXPIRES_IN=1h
REFRESH_EXPIRES_IN=7d

# 微信小程序配置
WECHAT_APPID=your_wechat_miniprogram_appid
WECHAT_SECRET=your_wechat_miniprogram_secret

# 阿里云短信服务配置(可选)
ALI_SMS_ACCESS_KEY_ID=your_ali_access_key_id
ALI_SMS_ACCESS_KEY_SECRET=your_ali_access_key_secret
ALI_SMS_SIGN_NAME=your_sms_sign_name
ALI_SMS_TEMPLATE_CODE=your_sms_template_code

配置说明:

  • 如果未配置阿里云短信服务,验证码将只在控制台输出(开发模式)
  • 数据库名称必须为 model-library(与 SQL 文件对应)
  • JWT 密钥建议使用 32 位以上的随机字符串

4. 启动后端服务

cd backend
npm install
npm run dev  # 开发模式
# 或
npm run start  # 生产模式

可选:模型库同步

如果需要将文件系统的模型数据同步到数据库:

# 运行模型库同步脚本
node scripts/sync-model-library.js

可选:管理员账户设置

# 生成管理员密码哈希(默认密码 BIM1409)
node hash_password.js
# 将输出的哈希值手动插入数据库 users 表

5. 配置微信小程序

方式一:HBuilderX(推荐)

  1. 在 HBuilderX 中打开 frontend 目录
  2. 修改 src/manifest.json 中的微信小程序 AppID
  3. 点击"运行" -> "运行到小程序模拟器" -> "微信开发者工具"

方式二:命令行

cd frontend
npm install
# uni-app 构建命令
npm run dev:mp-weixin  # 开发环境
npm run build:mp-weixin # 生产环境

重要说明:

  • frontend 使用 uni-app 框架,支持 Vue3 + UTS
  • 支持双构建系统:Vite(主要)+ Webpack(兼容)
  • 包含自定义 Pinia 持久化插件
  • 支持 uni-app x 原生开发

6. 启动管理后台

cd admin-frontend
npm install
npm run dev

访问 http://localhost:5173 进入管理后台

管理后台特性:

  • 纯 Vue3 + Vite SPA 应用
  • Element Plus UI 组件库
  • Vue Router 4 路由管理
  • 开发服务器代理后端 API

🌐 部署说明

生产环境要求

  • 服务器:Windows Server 2012R2+
  • Web 服务器:IIS + PM2
  • 域名:hk-ad.cn(已配置 NAT 映射)
  • 数据库:MySQL 8.0

部署步骤

  1. 代码部署
# 使用自动部署脚本
deploy.bat
  1. PM2 进程管理
cd backend
pm2 start ecosystem.config.js
pm2 save
pm2 startup
  1. IIS 配置
  • 配置反向代理到 Node.js 服务
  • 启用 HTTPS 证书
  • 配置静态文件服务
  1. 小程序发布
  • 在 HBuilderX 中构建小程序
  • 上传到微信开发者工具
  • 提交审核并发布

监控与维护

  • 日志文件backend/logs/
  • PM2 监控pm2 monit
  • 健康检查GET /health

📈 性能优化

前端优化

微信小程序端

  • 分包加载:3D 模型相关代码分包处理,减少主包大小
  • 双构建支持:Vite + Webpack 双构建系统,确保兼容性
  • 资源压缩:DRACO 几何体压缩,Terser 代码压缩
  • 懒加载:按需加载模型文件,优化首屏时间
  • UTS 优化:uni-app x 原生性能优化
  • 自定义插件:Pinia 持久化插件,减少第三方依赖

管理后台端

  • Vite 构建:快速的热重载和构建速度
  • 代码分割:动态 import 实现路由级别的代码分割
  • Tree Shaking:删除未使用的代码
  • 静态资源优化:图片压缩和格式优化

后端优化

  • 数据库连接池:mysql2 连接池,支持并发查询优化
  • 模型文件服务:静态文件缓存,支持大文件流式传输
  • 接口限流:express-rate-limit 防护,按 IP 和功能分级限流
  • 多层日志系统:Winston 文件+数据库双写,分级记录
  • 自动化脚本:模型库文件系统与数据库自动同步
  • 安全中间件:Helmet 安全头,CORS 跨域配置
  • 错误处理:统一错误处理中间件,结构化错误响应
  • 文件上传:Multer 多媒体文件处理,支持头像上传

3D 渲染优化

  • LOD 技术:多细节层次模型
  • 视锥体裁剪:只渲染可见部分
  • 材质合并:减少 DrawCall
  • 纹理压缩:减少显存占用

🤝 开发规范

代码规范

  • 前端:ESLint + Prettier
  • 后端:统一错误处理和响应格式
  • 数据库:统一命名规范和外键约束

Git 工作流

  • 主分支master(生产环境)
  • 开发分支develop(测试环境)
  • 功能分支feature/xxx
  • 修复分支bugfix/xxx

部署流程

  1. 功能开发 → feature 分支
  2. 合并到 develop → 测试环境验证
  3. 合并到 master → 生产环境部署

📄 许可证

本项目为私有项目,版权归华科智家所有。

👥 开发团队

  • 项目负责人:HK-BIM-GXB
  • 后端开发:Node.js + Express 技术栈
  • 前端开发:uni-app + Vue3 技术栈
  • 3D 开发:Three.js + WebGL 技术栈

📧 如有问题,请联系项目维护团队。

posted @ 2025-07-10 09:54  crockery  阅读(30)  评论(0)    收藏  举报