# smartplatform **Repository Path**: Hxiaoyang/smartplatform ## Basic Information - **Project Name**: smartplatform - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-29 - **Last Updated**: 2022-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #智能设备的管理平台 >本平台的主要作用是对一些互联网的设备进行管理 比如设备的添加 推送命令 心跳检查 设备绑定等到 >远程控制 ##一、主要功能 1 用户相关的功能 >没有细分化的区分普通用户和内部用户(客服 管理员) 我们使用的是一张表来代替所有表 >主要包括 管理员添加用户 普通用户的注册 登录 授权 更新 删除 2.区域相关的操作 >用户的信息中会包含一个地址,分为多级区域 需要对区域进行管理 >数据一般都是直接导入的 3.场景相关的操作 >只能平台都有场景 所谓的场景就是具体到什么地方 >用户绑定设备的时候需要指定场景 但是用户可以没有场景 4.设备相关的操作 >绑定设备 查看设备 收集设备的数据 比如传感器的数据 设备的心跳检查 服务器向设备推送命令 5.通知 >优惠 活动 或者是设备的异常需要通知客户 6.权限 >项目的很多地址不是所有人都是可以访问的 有些地址不能允许普通人访问 我们需要对不同的用户设置不同的权限 >来控制用户的访问 7.分类管理 >每个设备都有分类 不同的分类会有不同的处理方式 比如推送的命令可能会不一样 我们需要进行封装 8.请求控制 >动态控制接口的开发 所有的地址都是可控的 9.参数的动态控制 >请求传递的参数 我们可以关闭某个参数 关闭的参数即便是传递了也无效 想打开的时候只需从管理平台修改为允许 10.登录日志 >用户的每次登录 都需要记录数据 从什么ip地址过来的 什么时间 结果成功还是失败 成功后我们需要改变用户的在线状态 11.操作日志 >我们上项目的所有功能 每次被访问 我们都有记录日志 记录什么用户访问了什么功能 传递了什么参数 结果是什么 ##二、项目的基础定义 >我们的项目使用的技术是什么 中间有无约定? ###2.1 项目的基础架构 >我们项目使用的是SSM spring+springmvc+mybatis+spring security来做开发 数据库使用mysql 版本 5.1.7 >java环境 JDK8 tomcat8 定义环境目的:减少因为环境带来的不稳定因素 ###2.2接口的定义 >我们的接口请求参数如果可以使用json 则推荐使用json 接口的返回值做统一格式处理 也就是controller中所有的接口的返回类型是一样的 >所有的接口要添加统一的异常处理机制 不允许抛给用户 用户名在A接口是username 那么就代表所有的接口中都是username 状态码也是 1 代表成功 >比如id需要传递 没传递id 返回10001 那么所有没有传递id都应该返回10001 >同时状态码应该详细列到接口文档中 以共其他人查看 ###2.3 业务 >业务中尽量使用单一职责 尽量使用单表操作 尽量减少join操作 即便存在join操作 也不能超过两长表 如果三张表以上join操作 强烈拆分为单表查询 >业务中核心业务和非核心业务尽量剥离 通过AOP或者是event(事件)机制进行操作 同时为了减少非和新操作对核心操作的影响 我们的非核心操作尽量放入到子线程 ###三、功能分析 ####3.1 用户的功能 >用户的功能是记录一些我们的访问者数据的 访问者需要先进行注册 注册后可以使用我们的功能 我们的用户表主要保存就是这些人的 >我们需要什么信息 ? >主键自增 用户应该有用户名(唯一) 还有密码(密码不能存放明文 以免泄露后被撞库) ,密码的盐 名字 性别 头像 >邮箱(唯一) 电话号码(唯一) 注册时间 上次登录时间 上次登录ip 本次登录时间 本次登录ip 本次登录地区 >谁添加的 更新时间 谁更新的 用户状态 (正常 临时封禁 永久封禁 删除 ) 标记(普通用户 管理员 ) ##监听器 >监听什么东西触发的一种机制 就像生活中的监听 我们计划好我们要监听什么 提前设置好 然后被动等待事情发生 >比如我们的手机 手机一致在监听信号 如果收入到了电话拨入的信号 手机响 显示接听电话窗口 >servlet 中有八种常见监听器 第一个就是程序启动时的监听器 ###密码操作 >https:存在一个严重的问题 -->中间人攻击 #### 缓存 >我们发现角色相关的数据相对几乎不会发生变化 我们没有必要一致访问数据库 我们可以提前做成缓存 提前保存好 需要是直接从缓存获取 >缓存放在那里 ? 缓存什么时候加载(什么时候初始化) 在我们需要数据之前缓存就要记载完成 >最好的办法实在程序启动完成后就加载缓存 什么时候程序完成? 监听器 在程序启动时候收到通知 初始化缓存 >我们发现spring有一个监听器 在程序启动时初始化了对象 我们能不能利用它实现 ###登录 >接收参数 (经过业务处理的到结果) 返回结果 业务中通过用户传递的参数(参数是我们服务端定义的 客户端用户必须传递这个参数) >假设我们支持的账号密码登录 那么我们会要求用户传递用户和密码 我们要求通过username和password 传递 >那么controller中就接收username和password的值 传递到service 由业务相关操作绝对成功还是失败 ###分类的操作 >我们的设备会有很多种 所以需要分类 比如路由器 智能门锁或者摄像头之类的 划分分类的目的是方便管理 >首先可以安照分类查询 方便用户的搜索体验 不同的设备都不同的命令 我们可以以设备的分类进行命令的划分定义 >这样操作设备的时候只需要知道属于什么类型 就可以知道发送什么命令 其次设备会传递不同格式的数据到服务端 #### 分类的缓存 >我们的分类时不怎么变化的 所以我们可以提前在程序启动的时候将数据放入缓存中 后面的查询操作也可以从缓存中查询 >但是我们遇到了一个问题 当我们增删改的时候 缓存的数据没有发生变化 导致数据不一致 解决:清理缓存 重新加载 ###4.12事件驱动 >event_driven 我们提前计划好了一些事情 我们声明在发生什么事情的时候我们会做某些操作 然后就等着这个事情发生 ####事件的扩展 >我们发现我们还有地方没有处理 用户登录成功后需要更新用户的登录日志 本次的登录状态数据 用户的在线状态数据 >我们就可以利用事件机制进行处理 当我们登录后直接发送一个事件 谁愿意收就谁收 谁收到谁处理 ###场景 >场景是用户给自己添加绑定设备的时候选择的场景 比如家 公司等 这个场景是关联到用户的 >上面分类的时候是可以查询缓存的 因为是分类是针对所以的设备 所以的用户 >场景可以能非常多 我们无法全部加载到缓存中 >但是我们还是希望用缓存 所以我们期望最好是能自动删除 比如我们一段时间没有使用缓存 则删除缓存 >所以我们的缓存要设置有效期 >所以我们的缓存要设置有效期 每隔一段时间就会清楚缓存 >我们引入一个技术 定时任务 ###编程 1.面向对象编程 2.面向接口编程 3.面向切面编程 4.面向注解编程 5.面向监狱编程