1. 项目概述:智能家居系统的技术架构解析
这套基于Java SpringBoot+Vue3+MyBatis的智能家居系统源码,采用了典型的前后端分离架构。后端使用SpringBoot 2.7.x框架搭建RESTful API服务,前端采用Vue3组合式API开发管理界面,通过MyBatis-Plus实现与MySQL 8.0的数据交互。系统包含设备管理、场景联动、能耗分析等核心模块,适合作为企业级物联网平台的基础框架或毕业设计的高级案例。
提示:项目默认使用JDK17+SpringBoot2.7+Vue3.2的组合,这是2023年较新的技术栈选择
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心技术栈深度剖析
2.1 SpringBoot后端设计要点
后端工程采用多模块Maven结构:
code复制smart-home
├── admin-core // 核心配置
├── admin-system // 系统模块
├── admin-device // 设备管理
└── admin-scene // 场景联动
关键配置类说明:
java复制@EnableTransactionManagement // 启用注解事务
@MapperScan("com.smarthome.**.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
事务控制采用声明式注解:
java复制@Transactional(rollbackFor = Exception.class)
public void updateDeviceStatus(Device device) {
deviceMapper.updateById(device);
// 记录状态变更日志
logService.saveDeviceLog(device);
}
2.2 Vue3前端工程化实践
前端项目使用Vite4构建,主要依赖:
json复制"dependencies": {
"vue": "^3.2.47",
"pinia": "^2.0.33",
"element-plus": "^2.3.3",
"echarts": "^5.4.2"
}
状态管理采用Pinia替代Vuex:
javascript复制// stores/device.js
export const useDeviceStore = defineStore('device', {
state: () => ({
deviceList: []
}),
actions: {
async fetchDevices() {
this.deviceList = await api.get('/devices')
}
}
})
2.3 MyBatis-Plus高级应用
实体类配置示例:
java复制@Data
@TableName("iot_device")
public class Device {
@TableId(type = IdType.AUTO)
private Long id;
@TableField("device_name")
private String name;
@TableField(exist = false)
private List<DeviceParam> params;
}
动态SQL构建:
xml复制<select id="selectDeviceList" resultType="Device">
SELECT * FROM iot_device
<where>
<if test="type != null">
AND device_type = #{type}
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
ORDER BY create_time DESC
</select>
3. 数据库设计与优化
3.1 MySQL表结构设计
核心表关系图:
code复制用户表(user) → 设备表(device) ← 设备类型表(device_type)
↓
场景表(scene) ← 场景设备关联表(scene_device)
设备表建表语句:
sql复制CREATE TABLE `iot_device` (
`id` bigint NOT NULL AUTO_INCREMENT,
`device_name` varchar(64) NOT NULL,
`device_code` varchar(32) NOT NULL COMMENT '设备唯一标识',
`device_type` int NOT NULL,
`status` tinyint DEFAULT '0' COMMENT '0离线 1在线',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_code` (`device_code`),
KEY `idx_type` (`device_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 性能优化方案
- 查询优化:
java复制// 使用MyBatis-Plus的LambdaQueryWrapper
deviceMapper.selectList(
Wrappers.<Device>lambdaQuery()
.select(Device::getId, Device::getName)
.eq(Device::getStatus, 1)
.orderByDesc(Device::getCreateTime)
);
- 二级缓存配置:
yaml复制mybatis-plus:
configuration:
cache-enabled: true
local-cache-scope: statement
4. 典型业务场景实现
4.1 设备状态实时更新
WebSocket配置类:
java复制@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
前端订阅代码:
javascript复制const socket = new SockJS('/ws');
const stompClient = Stomp.over(socket);
stompClient.connect({}, () => {
stompClient.subscribe('/topic/deviceStatus', (message) => {
const device = JSON.parse(message.body);
// 更新设备状态
});
});
4.2 场景联动规则引擎
规则配置实体:
java复制public class SceneRule {
private Long id;
private String ruleName;
private String triggerCondition; // JSON格式条件
private String executeActions; // JSON格式动作
private Boolean enabled;
}
规则处理逻辑:
java复制public void checkRules(Device device) {
List<SceneRule> rules = ruleMapper.selectEnableRules();
rules.forEach(rule -> {
if (checkCondition(rule, device)) {
executeActions(rule);
}
});
}
private boolean checkCondition(SceneRule rule, Device device) {
// 使用Groovy引擎解析条件表达式
return groovyScriptEngine.evaluate(
parseCondition(rule.getTriggerCondition()),
binding);
}
5. 部署与运维指南
5.1 生产环境部署
Docker Compose配置示例:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
5.2 常见问题排查
- 设备状态不同步问题:
- 检查WebSocket连接状态
- 验证STOMP心跳配置
- 查看Nginx的WebSocket代理配置
- MyBatis缓存问题:
yaml复制# 开发环境关闭二级缓存
mybatis-plus:
configuration:
cache-enabled: false
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- Vue3响应式失效场景:
javascript复制// 使用shallowRef优化大数组性能
const deviceList = shallowRef([])
// 强制更新视图
const updateView = () => {
deviceList.value = [...deviceList.value]
}
6. 扩展开发建议
- 物联网协议集成:
java复制// MQTT协议接入示例
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(mqttConnectOptions());
return factory;
}
@Bean
public IntegrationFlow mqttInbound() {
return IntegrationFlows.from(
new MqttPahoMessageDrivenChannelAdapter(
"serverClient",
mqttClientFactory(),
"device/status"))
.handle(message -> {
// 处理设备消息
})
.get();
}
- 大数据分析扩展:
- 集成Flink实时计算设备数据
- 使用RedisTimeSeries存储时序数据
- 通过Grafana展示能耗分析看板
- 安全增强方案:
java复制// Spring Security配置
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
)
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
return http.build();
}
}
重要提示:实际开发中建议采用专业的物联网平台协议如MQTT/CoAP,本示例中的WebSocket方案仅适用于教学演示场景。生产环境需要考虑设备认证、消息加密等安全机制。
