# smart_device_plaform
**Repository Path**: june-woo/smart_device_plaform
## Basic Information
- **Project Name**: smart_device_plaform
- **Description**: 智能设备平台希望没有BUG!!!
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-03-14
- **Last Updated**: 2022-03-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 智障设备平台
## 一、项目架构
> 基于maven,SSM框架的单体web应用
## 二、相关模块
### 2.1用户功能
#### 2.1.1注册功能(添加用户)
1. 记录用户的数据,账号(唯一)、密码(非明文 MD5和加盐处理)、注册时间、登录时间、最后一个登录时间、登录ip、上次登录ip、 用户状态(默认正常,包含正常和封禁两种状态)
2. 用户手机号(非空)、邮箱(非空)、更新时间、性别(非空)、等。。。
3. 反范式允许部分冗余数据
#### 2.1.2登录功能
1. 根据传入的账户查找,如果没有就直接抛出账户不存在,查找到账户信息的话,就根据存在数据库的盐生成密码并于数据库的密码比较
2. 如果二者一致则登录成功
3. 如果不一致说明密码错误,登录失败
4. 把登录的账户信息,加入到session
> 把登录失败或者登录成功的信息。加入到数据库中的sys_logininfor表中保存起来。
> 把登录成功的数据加入到数据库中的sys_user_online表中。
- 后续添加了封号的功能,所有登录时要验证账户的状态,如果账户的status是0就是处于封号状态禁止其登录
#### 2.1.3更新用户信息和封号
1. 列太多了,不想写,那就来个//TODO吧
2. 只有管理员才可以进行封号操作,封号就是把status设置为0,并且登录时的验证要判断status的值
### 2.2分类功能
> 每个设备都有分类便于管理和命令操作。控制命令可以保存到数据库的分类表里面。
#### 2.2.1添加分类
1. 添加分类,用户处于登录状态,添加之后发布事件更新缓存
2. 根据id查询分类,需要走缓存数据
3. 查询所有分类,加分页和根据条件查询
#### 2.2.2更新分类
> 动态SQL的if里日期时间数组不能''空字符串判断
> 判空操作需要重写,除Cid之外只要有一个不为空即可
#### 2.2.3删除分类
1. 不是真正的删除数据而是逻辑上的删除,将status改为0即代表删除了数据
2. 删除之后查询分类(缓存中)也要根据status相应改变规则
#### 2.2.4查询分类
查询分类程序启动时查询到缓存中
### 2.3场景功能
#### 2.3.1添加场景
1. service判空和登录验证
2. 规定一个用户不能有重名的场景名称
3. 在添加场景之前,要根据用户和场景名称查询,如果结果为null或者status为0(被删除)则添加进去或者将status改为1(生效)
#### 2.3.2查询场景
1. 只能查看登录用户查看本人的场景
2. 缓存问题,用户大的时候缓存的场景数据太多了,可以将其放在短期的缓存 ,增量缓存中
#### 2.3.3更新场景
1. 场景需要更新的就是场景的名字罢了。。。罢了罢了。。。别的没有什么可以更改的东西
2. 要登陆状态,并且只能更改自己创建的场景
#### 2.3.4删除场景
- 登录状态
- 要删除的场景存在
- 是该用户创建的场景
- 逻辑删除,将status更改为0即可,查询缓存时要判断`status`的值
### 2.4设备功能
#### 2.4.1添加设备
1. id、名字、分类的id、绑定的用户id、场景id、绑定时间
2. 场景id:没场景默认-1,所有用户都可以设置这个场景,有场景要判断这个场景是不是该用户的
3. 分类id:要判断是否有该分类
#### 2.4.2查看设备
// TODO
#### 2.4.3连接设备
使用`websocket`设备和服务器之间,保持通讯,来保证服务器可以给设备发送命令
1. 设备连接成功之后,更新设备的在线状态、连接时间、当前ip、地区
2. 设备断开连接之后,更新设备在线状态、断开时间
3. 心跳检查: 设备断电或其他不正常关闭数据库信息依然可以更改状态,就是类似于轮询,发送简单的数据包给服务器;
- ①服务端记录下收到消息的时间
- ②当前时间与记录的时间比较,超过一定的时间判定设备离线
- ③设置定时任务每过多长时间执行②(发布事件)
### 2.5页面
#### 2.5.1 菜单
1. 左侧总菜单的展示
2. 分类菜单数据的展示
3. 设备菜单的展示
#### 命令控制
#### 开关、颜色传感器控制
1. 客户端发送http请求包含了设备id和command命令
2. 根据deviceId和command数据库查询到控制设备的命令
3. 经过websocket将命令数据传输到设备,然后设备端收到数据进行设置好的命令操作
#### 温湿度传感器
1. 温湿度传感器传过来的数据写入到数据库中保存下来
2. 某个时间段内的平均温度高于或低于我们设定的阈值,进行相应的操作[要使用到Multimap,键是设备id,值是一组时间内的温度数据是一个List集合]
3. 读取温湿度,展示给页面
### 操作日志
1. 使用AOP在请求到达之前之后或者抛出异常之后进行数据处理,然后插入到数据库
2. 模块标题和业务类型要通过 `自定义注解` 将数据传递
3. joinPoint可以获取`method`和`oper_param`,`title` `business_type`可以通过自定义的注解传递过来,其他参数通过request对象获取
4. Advice拦截的是Controller,但是Advice是Spring创建的,spring创建时Controller还没有创建.所以Advice我们要交给SpringMVC创建
### 权限 //TODO
- 粗粒度过滤(扩展性很差):将每个用户能访问,和不能访问的地址记录下来
- 分组:将权限分组引出角色
- 用户-->角色、角色-->权限
- 基于角色的权限控制系统 `RBAC` -->权限框架`security` `shiro`
## 三、现存问题
1. 接口的动态控制,用户传一些我们系统生成的数据如登录时间,最后一次登录时间等数据,我们没有将其过滤
2. 动态的停用接口 e.g.某个接口存在问题我们需要停用该接口,目前是没有办法将其动态的停用的.
## 四、致己
路漫漫其修远兮,吾将上下而求索。不积小流无以成江河,不积硅步无以至千里
路虽孤独却不黑暗,望日后所见佳人可表其心,无所忧惧。
远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。
秾纤得衷,修短合度。肩若削成,腰如约素。延颈秀项,皓质呈露。
芳泽无加,铅华弗御。云髻峨峨,修眉联娟。丹唇外朗,皓齿内鲜。
明眸善睐,靥辅承权。瑰姿艳逸,仪静体闲。柔情绰态,媚于语言。
翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。
髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。
待仲夏、待晚风、待伊人