《中州养老》

简介: 《中州养老》是一个面向养老院的单体后台管理系统,涵盖员工管理端与家属小程序端。系统功能完善,包含预约参观、入住退住、计费、健康监测等模块。我主要负责核心模块设计开发,如护理等级、床位管理、权限控制或智能监测等。项目采用SpringBoot+Vue3技术栈,结合Redis缓存、Nginx部署、阿里云OSS与IoT平台,实现高效稳定的数据交互与实时健康监控。通过RBAC权限模型保障系统安全,利用定时任务、线程池、索引优化等手段提升性能,支持微信登录、小程序预约、设备报警等实用功能,全面助力智慧养老信息化建设。(238字)

1、《中州养老》
聊一下最近做的这个养老项目?
好的,面试官!
我最近做这个项目是一个单体项目,主要是给养老院使用的一个后台管理系统。它有两端:
● 第一个是给养老院员工使用的后台管理系统
● 第二个是给老人的家属使用的小程序端
这个养老院的功能是比较全的,包含了老人的预约参观、入住、退住、计费、老人健康数据监测等很多的模块
在这个项目的开发过程中,我主要负责的是项目中核心模块的设计和开发
你主要负责了哪些模块?
以下三种情况,选择其一即可
情况1
在这个项目中的模块是很多的,我主要负责的是项目中的基础数据维护,比如在养老院中有房型管理、床位管理、护理等级管理、入住管理、在住管理这些模块。
我主要的开发工作就是设计这些模块的表结构、有的时候需要与前端开发配合,也去设计这些功能接口
面试官:那你详细说一下护理等级模块这个模块
护理等级这个模块在养老院系统的主要作用是,让将要入住的老人进行选择配置,比如有一个老人入住养老院,在前期呢,会先给老人做一个健康评估,然后销售员会根据老人的健康评估报告以及老人的年龄这些综合因素,去推荐老人选择不同的护理等级,不同的护理等级包含的护理项目是不同的,价格也是不一样的
面试官:那你详细说一下床位管理模块这个模块
床位管理这个模块在养老院系统的主要作用是,基础数据的维护,比如根据养老院实际的情况来创建对应的楼层,楼层中的房间对应编号,以及每个房间对应的床位编号,并且每个楼层的房间和床位对应的配置也是不同的。老人也可以根据自己的实际情况来选择需要入住的房间和床位。这样的话,老人就能与房间和床位进行绑定,后期方便更好的服务于老人
情况2
在这个项目中的模块是很多的,我主要负责的是项目中权限管理模块。
面试官:那你详细说一下这个模块
好~
在养老院系统中,员工都可以登录这个系统,并且每个员工的角色和岗位是不同的,所以每个员工可以看到的菜单和访问的数据是做了控制的,控制的基本思想就是RBAC权限模型。
RBAC意思是基于角色的访问控制,就是说,一个员工入职之后可以给他分配不同的角色,而每个角色对应的菜单和访问的资源是不同的,所以就可以通过RBAC的这个思想很方便的来控制用户的访问和操作权限
情况3
在这个项目中的模块是很多的,我主要负责的是项目的智能监测系统。
面试官:那你详细说一下这个模块
好的~
在养老院系统中,当老人入住选配的时候,是可以护理等级不同选择是否需要智能监测这些功能,如果老人选择了智能监测这些功能,老人入住的房间和床位中会给入住的这个老人绑定智能的硬件设备来监测老人的健康数据,同时呢,也会给老人一些穿戴设备,比如健康定位手表,这个手表也可以实时的监测老人的健康数据。
一旦监测出了老人的健康数据有异常,就是触发报警,就会给负责这个老人的护理员来发起提醒,让护理员及时去处理。这样的话就能更好的实时监测到老人的数据是否健康
同时,在家属端的小程序上,也可以及时的查看老人的健康数据清空,不然老人的健康数据历史,是否包含了异常数据等等这些
这个项目中使用到了什么技术?
嗯~
在这个项目中,除了后端以外,我也负责了前端项目的部分工作
● 其中前端主要使用的是vue3、TS和腾讯的一个组件库TDesign
● 后端是以SSM为基础框架,Springboot来构建的项目,其中也包含了很多的其他技术,比如Redis缓存管理,我们使用的是Spring Cache、定时任务使用的Spring Task、使用了Nginx作为前端的静态服务器和反向代理服务器等等这些技术
● 在整合特定业务的时候,我们也对接了第三方接口来协助完成业务功能,比如我们项目中的文件都是采用的阿里云的OSS进行的存储;老人健康数据监测我们使用的阿里云的IOT平台;
项目的开发流程是什么?
回忆一下,我们开发的流程是什么,然后在此基础上做点补充,核心如下:
嗯!好的,面试官
● 当来了新需求之后,产品经理会召集开发人员来开会,说明需求
● 一旦需求明确之后,我们会根据需求来评估使用到的技术和工作量
● 当需求明确之后,后端开发和前端会碰头来聊一下关于功能接口的问题
注意:也可以说,前端如果没时间,后端会根据需求文档进行接口开发,最后再让前端去对接和联调
● 接口定了之后,我们会根据需求来设计表结构
● 如果有特殊的技术要求会先调研特定场景的技术,然后对接到项目中
● 表和接口都有了之后,就可以着手编码开发了
● 编码完成之后,先自测,自测没问题,就会提交测试环境,跟前端开发进行联调
● 当联调完毕后,会通知测试人员来进行功能接口的测试
● 如果测试过程中,出现了问题,就会提bug到管理工具(可能是禅道)
● 后端看到bug,修复后,再让测试进行回归bug就可以了
下面一张图方便大家记忆:

项目组成员有哪些?
当时,我们项目组大概有8-9个人左右吧
● 后端开发3人
● 前端开发1人
● 测试2人(多项目组公共的)
● 项目经理1人
● 产品经理1人
● UI设计1人(多项目组公共的)
如何创建接口,你设计过接口吗?
首先需求确定之后,我们会根据产品原型和需求文档来设计接口,我们项目中是遵循了Restful风格的规范。主要包含了几个部分
● 请求路径:一般都是以资源名称或者小模块名称进行命名
● 请求方式
○ 查询是get请求
○ 新增是post请求
○ 修改是put请求
○ 删除是delete请求
● 接口的入参,一般也有两种形式
○ 其中get请求会使用问号传参或者是path路径传参,后端使用形参接收参数
○ 如果是put或者post请求会使用json对象传参,后端需要使用dto去接收参数
● 接口的出参,我们项目中定义了统一的接口规范
○ 如果返回数据较多,一般会封装一个vo进行返回,vo可以过滤敏感数据,或者是整合数据
你们项目中使用过在线接口文档吗?使用的哪个?
嗯,使用过的~
我们项目中主要采用的swagger在线接口文档,使用它的主要的作用就是,可以很方便进行前后端协同工作
比如,当进行前后端联调的时候,前端只需要根据在线的接口文档就可以很方便查看某个接口的详细说明,可以查看接口的路径、入参、出参、请求方式 这些内容都可以查看。
如果在开发的过程中,接口有任何的变动,在线接口文档也可以做到实时同步,减少了沟通成本。
还有一个好处就是:在项目的后期,需要整理出一份接口文档,我们使用swagger工具可以很方便的导出一份离线的接口文档,也能增加我们的效率
你们项目中异常是如何处理的?
嗯~
在我们的项目中定义了一个全局异常处理器来统一处理异常。
一般项目开发中的异常分为了两类:一个是预期异常,一个是运行时异常。
● 其中预期异常就是程序员手动抛出的异常,如果有业务处理不合理,可以使用异常来提供接口的返回
● 运行时异常,这类异常是项目中不可控的异常,比如代码直接报错了,这个时候接口的返回会有一个统一的返回格式,来方便的给前端进行提醒,同时呢,后端看到之后可以在后端查看异常方便进行处理
在定义全局异常的时候,会使用到两个注解
● @RestControllerAdvice 定义是一个控制器增强类,来表示这个类是一个全局异常处理器
● @ExceptionHandler 这个是在方法上进行定义,它可以指定异常的类型来进行拦截,通过不同的异常类型,进行不同的前端响应,比如预期异常可以直接返回,如果是运行时异常,则会转换响应内容
说几个常见的git命令
这个在我们平时开发经常使用
比如有:
● git clone 从远程仓库克隆一份代码到本地
● git add 添加一个文件或多个文件到暂存区
● git commit 提交文件到本地仓库
● git pull 拉取远程仓库的代码,并合并到本地分支代码中
● git push 推送本地代码到远程仓库
● git remote 查看远程仓库或者是设置远程仓库地址
● git reset 可以从暂存区移除文件或者指定回归的版本进行代码回退
当然,在我们平时开发中,使用的idea中都已经集成了,操作起来更方便一些
git本地仓库和远程仓库的区别
这两类仓库在平时开发也是必不可少的
● 本地仓库是存储在计算机本地的Git仓库,用于保存项目的完整历史记录和文件版本。可以进行开发、修改和提交代码等git控制的操作。
● 远程仓库是位于网络上的Git仓库,通常托管在远程服务器上,如GitHub、Gitee、GitLab等。它用于协作和共享代码,团队成员可以将本地仓库的更改推送到远程仓库,或者从远程仓库拉取最新的更改到本地仓库。
git基本的工作原理是什么
Git的主要作用就是跟踪和管理项目文件的变化,记录文件的每个版本和修改。这里面有三个概念来进行控制
● 工作区:包含.git文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码
● 版本库:前面看到的.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
● 暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
如果使用git产生了冲突,你是怎么解决的?
好的~
我们团队开发,当拉取代码的时候,如果有其他同事也跟我一样修改了同一个类中的相同位置的代码就有可能会发生冲突,解决冲突的第一时间我会先找对应的同事进行沟通,这些冲突一般都是前期沟通不充分导致的,通过沟通确定是什么问题。
解决冲突操作一般会使用idea来完成,当拉取代码的时候,如果有冲突会弹窗进行提示,主要是会做版本的比对,有本地的代码和远程仓库的代码,然后根据实际情况选择即可,最终解决冲突需要commit
如果不用idea,当执行pull命令的时候,也有可能会产生冲突,解决方案是
● 首先使用git status来查看哪些文件冲突
● 找到这些冲突的文件,在文件中会有冲突代码的标记,也是两部分:本地仓库的代码和远程仓库的代码
● 然后根据实际情况,进行删除多余的代码和标记即可
● 解决完冲突以后,需要使用git add来标记已解决冲突
● 完成所有的冲突解决后,需要使用git commit命令来提交修改,如果需要推送,可以直接git push
你们项目中分支是如何管理,创建分支有什么规则?
我们项目的分支主要有 master、 release、各种 develop,其中 develop 指的是开发过程中,每个版本根据需求实际情况, 创建一个或者多个分支,当需求开发完成以后,合并到其中一个分支,当本次需求上线后,在保证与线上代码一致的情况下, 将上线分支合并到 release并打上 tag 标签,记录版本信息,最后将release 再合并到 master, master 和 release 基本上不做修改。
● 分支名称有4段组成,格式如下:
dev-分支主名称-版本-日期
分支主名称 命名一般是模块名或者需求的简单描述,尽量做到见名知意, 后期如果需要查找旧版本信息, 相对也会比较容易查找.
你负责开发的这个模块,说(画)一下它们的表结构关系?
以下模块也是根据自己的情况来进行阐述,不用所有都阐述
模块1-护理模块
嗯,我在项目中负责了一个护理模块,这里面主要涉及到了4张表
关于业务的介绍,请参考前面章节
这4张表分别是:护理项目表、护理计划表、护理等级表,其中护理项目与护理计划是多对多的关系,有一张中间表,护理计划与护理等级是一对一的关系

模块2-小程序登录
小程序这个业务表结构较少,简单说明即可,比如在小程序端登录成功之后,会把用户的信息保存到本地数据库中,有一张专门的表进行存储用户的信息(这个用户是指老人的家属)
模块3-权限模块
权限的模块中表较多,一共包含了7张表来进行权限控制
这7张表分别是:用户表、角色表、资源表、职位表、部门表。
● 用户与职位是N:1关系
● 用户与部门是N:1关系
● 用户与角色是N:N关系,则它们之间必然有一个中间表
● 角色与资源是N:N关系,则它们之间必然有一个中间表
下图方便大家理解和记忆

模块4-智能监测
(1)设备管理与设备数据存储
● 有一个张设备表比较关键,可以让智能设备对养老院的业务进行绑定,绑定有两种类型
○ 如果设备绑定了床位或房间,则设备表与房间表或床位表就是多对一的关系(一个房间或者床位可以绑定多个设备)
○ 如果设备绑定了某一个老人,是穿戴设备,则设备表与老人的关系是多对一的关系
● 当设备上报数据之后,会存储到设备数据表中,设备与设备数据表是一对多的关系

(2)报警规则
当设备数据上报的过程中,如果发现了异常数据则需要养老院的工作人员及时处理
● 一个设备可能会创建多条报警规则,所以设备与报警规则表是一对多的关系
● 符合报警规则的设备数据就存储到报警数据表中,同一个报警规则可以产生多条报警数据,是一堆多的关系

什么是E-R图,有什么作用?
E-R图也称实体-联系图,提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
我们一般基于需求设计表的时候,如果业务实体比较多或者比较复杂,会借助E-R来表示多个实体之间的关系,以及每个实体中的关键字段,方便更好的理清业务关系,也为后期创建表做好了基础。
如何设计表呢?
嗯!
就像前面说的,如果遇到了复杂的业务,或者一个业务中包含了多个实体,则会先使用E-R图画出实体的关系和关键字段,然后就是详细设计每一个表结构,主要包含了四个层面吧:
● 第一个是表的命名或者字段的命名,尽可能的符合开发规范,我们一般会参考阿里的开发手册(嵩山版)
● 第二个是数据类型:然后根据字段存储的数据内容,来决定这个字段使用合适的类型,在保证长度的情况下,来选择比较合适的存储空间,比如:用户表中的姓名这个字段,数据类型是varchar,长度一般不超过50。如果是性别这个字段,一般就会有固定的两个值,就可以使用char类型,长度为1
● 第三个是主键,我们现在开发的单体项目,主键的生成策略是自增,因为是数值类型,占用存储空间也较小
● 第四是冗余字段,在后台管理系统中,很多的时候需要按照时间或者按照创建人来进行检索或者是控制权限,所以我们一般的表都会包含四个字段,分别是:创建时间、修改时间、创建人、修改人
你在项目中负责了哪些前端的工作?什么模块呢?
情况一:
因为现在是前后端开发,我们有的时候除了写后台的接口以外,也会写一些前端的页面,主要使用到的技术是Vue3、TypeScript、TDesign这些技术。我在养老这个项目就开发过几个页面,比如前面介绍的护理模块的开发,我就是负责了前后端的所有内容开发的。不过,都是一些基本的增删改查,基本的vue和组件的使用是可以的。更多的时候我还是主要负责后端的开发。
情况二:
在之前的项目中,都有专业的前端工程师来负责前端的开发,在项目中,我基本没涉及到过前端的开发。不过,对于一些vue3的内容,自己也学习过,一些简单的开发工作查些资料是可以完成的。
你对Vue熟悉吗?说一些vue常见的命令?
嗯~,这个在使用vue的过程中是比较常见的,指令有很多,我说几个比较常见的

  1. v-show:用于控制元素的显示和隐藏。
  2. v-if:用于条件性地渲染元素。
  3. v-else-if:与v-if结合使用,用于添加更多的条件分支。
  4. v-else:与v-if或v-else-if结合使用,用于处理其他条件。
  5. v-for:用于循环渲染元素或列表。
  6. v-text:用于更新元素的文本内容。
  7. v-bind:用于绑定属性或样式。
  8. v-on:用于监听事件并在触发时执行一些操作。
    你用过哪些Vue3的组合式API,它们有什么作用?
    嗯!这个在vue3的官网中也提供了很多,我说几个,开发中用的比较多的
    ● ref:创建一个响应式对象,可用于包装基本类型的数据,使其具有响应性。
    ● reactive:用于创建一个响应式的对象。与ref不同,reactive可以用于包装复杂的对象,使其内部的属性都成为响应式的。
    ● computed:用于创建一个计算属性。计算属性是基于其他响应式数据进行计算得到的值,当依赖的数据发生变化时,计算属性会自动更新。
    ● watch:用于监听一个响应式数据的变化。可以通过watch来执行一些副作用操作,比如发送网络请求、更新DOM等。
    ● onMounted、onUpdated、onUnmounted:用于在组件的生命周期钩子中执行一些操作。onMounted在组件挂载后执行,onUpdated在组件更新后执行,onUnmounted在组件卸载前执行。
    Vue的组件化有什么特点
    我认为vue组件化有两个特点:
    第一:Vue的组件一个很重要的作用就是复用性,可以让其他组件反复引用,避免代码冗余,减少代码量,降低维护成本。
    第二:组件化开发使每个组件成为一个独立的模块,具有特定的功能和明确定义的接口。这使得代码更易于理解和维护,提高了代码可读性和可维护性。
    用过Vue的父子组件吗?它们是如何通信的?
    嗯!这个项目中也是很常见的,通过父子组件通信,使开发更加模块化,增加模块的复用性
    第一:父组件传递信息到子组件
    ● 父组件中给子组件绑定属性,使用冒号的方式进行传递
    ● 子组件内部通过props选项接收数据
    第二:子组件传递信息到父组价
    ● 父组件中给子组件标签通过@绑定事件
    ● 子组件内部通过 emit 方法触发事件
    聊一下小程序端的有哪些业务模块?
    好的~
    小程序是家属端,是让老人的家属使用的,在小程序上家属可以通过微信登录,完成登录过后,可以进行操作,比如,可以预约参观,预约探访,购买服务,管理合同等,查看房型等操作。
    我在小程序端主要负责的是微信登录和预约这个模块。
    说一下微信登录的流程?
    好!
    微信登录需要前后端共同写作完成开发。
    ● 首先前端需要调用微信端来获取一个临时登录的凭证,然后就可以向后端发起登录请求了
    ● 后端接收到登录请求后,获取到临时登录凭证,然后携带着这个凭证到微信开发平台发起远程接口调用,获取用户在微信方的唯一用户标识,openId
    ● 如果能正常获取到openId,说明这个用户是存在的,在我们的后端就可以生成jwt的token,然后返回给用户,就说明这个用户登录成功了
    ● 当然,在我们本地也会存在一份用户的数据,保存用户的openId,方便对客户进行跟踪和验证
    ● 如果需要获取用户的手机号,也需要前后端协作,也会有一个手机号的临时凭证,跟获取openId的流程差不多,只不过这次获取的是用户的手机号
    说一下预约业务模块
    好的!
    ● 家属在小程序上完成探访预约和参观预约
    ● 预约是分时段的,从8点到18点每隔半小时为一个时段,每个时段预约位数是有限的,达到限制,不再提供预约
    ● 用户对自己的预约是可以取消的,用户取消后,预约单状态变为已取消,但是每位用户每天只能取消3次,超过当天不能再预约
    ● 预约成功后,预约单为待上门状态
    ● 超过预约时间一小时未到访,预约单状态变为已过期
    ● 预约人员在规定时间内到访,后台核销,预约单状态变为已完成
    如何校验token?流程是什么?
    嗯!这个一般在登录验证的过程中,都会使用到
    ● 首先,我们自定义一个拦截器,来拦截请求
    ● 从请求头中获取token
    ● 然后解析token,完成校验token是否有效
    ● 从token解析出的用户数据存储到Threadlocal中
    ● 最后完成全部校验过后,拦截器放行,继续请求
    ● 如果中间的非空判断或者解析错误,则会直接抛出401错误,提示前端重新登录
    哪里用到了Threadlocal,它有什么特点?
    ● 在拦截器中用到了Threadlocal,将获取到的用户ID赋值到线程属性中。
    ● ThreadLocal是Java中的一个线程局部变量工具类,它提供了一种在多线程环境下,每个线程都可以独立访问自己的变量副本的机制。ThreadLocal中存储的数据对于每个线程来说都是独立的,互不干扰。
    项目中对接过三方接口吗?如何对接?什么业务(场景)?
    是的,我开发的多个项目中都对接过第三方接口,
    比如
    ● 项目中需要对接微信登录,获取微信用户的openId,需要发起远程请求,请求微信开发者平台提供的接口
    ● 项目中需要对接阿里云的OSS或者IOT平台,也需要发起远程请求到阿里的开发者平台提供的接口
    一般对接这些第三方接口,
    ● 首先要明确的是该接口的详细描述,是否符合当前业务的需要
    ● 可以从三方提供的接口文档中明确接口的请求方式、入参、出参、路径等等这些必要信息
    每个接口的厂商不一样的,使用java对接的方式也不相同,比如
    ● 对接微信,需要根据接口文档的描述,使用Http客户端来封装参数发起请求
    ● 对接阿里云相关接口,阿里提供了对应的sdk,只要导入pom依赖,就可以很方便的发起远程调用
    ● 总之,别管哪种方式,都是http请求,都要仔细按照接口文档说明进行调用
    你们项目中哪里用到了定时任务?使用了什么技术?
    嗯!这个是很常见的,我们项目中很多地方都用到了定时任务
    ● 预约模块的过期状态自动修改
    ● 智能监测模块中规则每分钟进行扫描
    ● 智能监测模块中,设备数据自动清理30天之前的数据
    因为我们是单体项目,我们使用的就是Spring框架自带的定时任务调度Spring Task,集成它很方便,只需要两个注解就可以搞定,第一是引导类中开启任务调度,第二在任务类中使用@Scheduled注解来标明该方法的执行频率
    关于执行频率,可以使用cron表达式来进行表达
    解释一下RBAC权限系统?
    嗯~,我做的这个养老项目中,使用的就是RBAC权限模块来完成的权限控制,它的思想是这样的:基于角色的权限分配。简单说就是,当我们给用户分配资源的时候,并不是直接分配,而是给角色分配资源,然后给用户分配角色。这样的话,就可以通过用户找到角色,进而找到角色关联的资源数据。相对来说,更方便的管理。
    其中核心的权限控制使用了5张表进行了管理,分别是用户表、角色表、资源表,其中用户和角色是多对多的关系,它们有一张中间表。角色和资源也是多对多的关系,它们也有一张中间表
    详细的表结构说明,请参考上文:第14个面试题中的权限部分的表结构说明
    你在项目中做过优化吗?是怎么优化的?
    嗯!我想一下
    我们当时开发这个项目的时候,做过很多的优化,主要的任务就是优化用户的体验,主要是尽可能的缩短接口的响应时间。
    ● 首先呢,我们开发完成之后,会把项目发布到测试环境中,让测试人员去这些功能,他们有的时候会采用压力进行测试,在测试的过程中,如果发现接口的响应时间超过500ms,则会提出来,让后端进行优化
    ● 像这些比较慢的接口,一般都是接口的返回值数据量较大才会导致响应时间过长。如果这些对应接口的数据变化写操作较少,查询又比较多的话,我们一般会采用缓存来优化性能
    ● 比如,权限管理这些功能,有大量的树形接口需要返回,比如资源树形、部门树形,这些响应的数据很多,并且写操作的情况又较少,所以比较适合使用缓存来解决
    你们项目中哪里用到了什么缓存,使用的什么缓存技术?
    嗯!就像刚才说的,权限管理模块中有大量的接口都使用到了缓存,我们使用的缓存是非关系型数据库Redis。在使用Redis的过程中,我们发现直接使用Spring 封装的模块RedisTemplate需要在业务层中耦合大量的代码,所以我们最好采用了Spring Cache这个缓存框架,来为业务层的代码添加缓存的逻辑,它只需要添加少量的注解就可以很方便的达到添加缓存的效果。
    Redis如何与MySQL进行数据同步
    好!是这样的,我们这个项目添加缓存的地方主要是权限管理这些接口,它是一个单体项目,时效上要求没那么严格,所以我们的一个同步思路是:
    ● 当查询数据的时候,先判断Redis中是否有缓存
    ○ 如果有直接返回
    ○ 如果缓存中没有,则会查询数据库返回数据,同时也会把从库中查询的数据同步到redis中
    ● 当有写操作(增删改)的时候,会直接删除Redis的数据
    这样的话,就能保证MySQL中的数据一直与Redis是同步的
    Redis的数据类型有哪些?有什么特点?
    好的~
    Redis比较常见的数据类型有5种
    第一是字符串类型(String):它Java中的String类似
    第二是哈希(Hash):又叫散列,类似Java中的HashMap结构,存在两个key
    第三是列表(list):数据按照插入顺序排列,可以重复,类似Java中的LinkedList(双向链表结构)
    第四是集合(set):无序集合,数据排列无序,并且没有重复,类似Java中的HashSet
    第五个是有序集合(Sorted set/zset):集合中的每个数据会关联一个分数(score),按照分数的升序排列,并且没有重复
    这几种在项目会经常使用
    解释一下认证、授权、鉴权这些概念?
    好的~
    ● 认证就是在用户登录时进行身份验证(如使用用户名换和密码等),获取到用户是谁的过程
    ● 授权的意思是用户对系统进行操作时,赋予不同用户不同的权限使其访问的资源内容和其身份相匹配
    ● 鉴权的意思访问控制,系统实施严格的权限检查,确保只有被授权的用户才能访问相应的资源或操作
    Spring Security的主要功能是什么?
    Spring Security是Spring框架提供的一个强大且高度可定制的安全框架,为系统提供认证,授权,会话管理,密码加密与存储,安全异常处理与重定向等安全解决方案,涵盖了从用户认证、权限控制到安全会话管理等多个层面的安全需求。
    Spring Security中的密码加密和解密是如何实现的?
    好的!
    因为目前使用的是SpringSecurity的密码加密,框架推荐使用的加密方式是BCrypt加密,这种加密方式是在传统的MD5加密的方式下又做了更加安全的加密和校验逻辑。
    ● BCrypt相比MD5加密算法长度更长,MD5的长度是32位,BCrypt的长度更长是60位
    ● 安全性BCrypt更好一些,MD5加密同一个字符串加密多次都是相同的,而BCrypt在对明文密码加密时,添加了一个随机字符串(盐),使得对于同一个字符串加密多次是不同的,密码加密更加安全,防止大数据对比暴力解密 。
    ● 两种加密方式都是不可逆的,MD5可以直接对比加密后的字符串来进行校验,BCrypt提供了check方法来校验密码是否正确,最终也是对比加密之后的字符串是否一致
    简述你们项目的认证鉴权流程?
    好的~
    说到这个鉴权流程,需要结合着认证授权一起来聊一下
    ● 当员工入职之后,开通了账号,由他的上级给他分配权限,比如护理员只能访问护理任务相关的菜单和请求。这个就是授权的过程,其实就是主管给员工设置了某些角色,通过这些角色就可以控制这个员工的访问范围。
    ● 当员工使用账号登录的时候,就是认证的过程,通过该员工的角色找到对应的访问资源列表,由于这些资源列表可能会很多,所以我们存储到了redis,key就是员工的id,value就是该员工所能访问的资源列表
    ● 当该账号访问其他资源的时候,我们通过spring security提供的授权管理器,来进行校验,首先从token中获取员工的id,然后通过id到redis中查找对应的资源列表,然后拿当前访问的url到资料列表中去查,如果能查到就表示有该权限,放行,如果找不到,会报一个403,说明没有权限

当然在我们的项目中,也有一些白名单,在白名单的资源是所有用户都可以访问请求的,这些也应该在用户认证成功之后存储到redis中,方便授权管理器进行校验
你们项目中哪里用到了物联网?(详细介绍业务-->位置绑定设备,老人绑定设备)
由于目前的这个项目是一个养老院中的管理系统,主要会对养老院中的房间床位或者是老人进行绑定设备。
● 比如在老人的床位中绑定睡眠监测带,方便检查老人的睡眠状况
● 比如在房间绑定智能烟雾报警器,方便检查房间中的温度和湿度
● 比如给老人提供一些穿戴设备,智能定位手表,方便监测老人的健康数据等等
通过这些设备的实时上报,我们使用了阿里云的物联网平台,来监测这些设备的上报数据,一旦发现异常情况,方便养老院及时进行处理
解释一下物联网中的产品、物模型、设备的概念
好的~
这些概念主要是阿里云物联网平台给提供的。
● 产品:物联网中的产品通常指的是任何可以接入物联网的物理设备或物体,能够自身信息,状态等通过网络传递给管理平台。例如,共享单车,智能音箱,智能电视,烟雾报警器,共享充电宝等等。
● 物模型:物模型是指对物理实体的建模,用于描述物理设备的特征和行为。物模型由属性、服务和事件组成,属性描述设备的静态特征,服务描述设备的动态行为,事件描述设备发生的事件。物模型是一种数据模型,由物联网平台和设备共同维护。例如,温度,湿度,电量,是否撞击等等。
● 物联网中的设备通常指的是可以接入物联网的物理设备或物体,这些设备具有一些特定的功能和特征。它是产品的具体某一个设备。
物联网中的数据如何采集、传输和处理?
好的!
-首先是采集,在物联网设备中通过烧录将信息采集程序编写进硬件设备中,通过网络上传到物联网管理平台,这个烧录是嵌入式开发员工来处理的,我们Java开发主要是来处理上报之后的数据。
● Java开发通过AMQP网络协议进行异步信息的通信,使用阿里云物联网平台提供的方法获取平台参数
● 养老系统接收到设备上报的数据之后,会根据不同的设备来保存设备中每一个物模型数据
○ 为了方便查看物模型的历史数据,我们存储到了MySQL一份全量数据
○ 为了能够在系统中实时查看上报的数据,我们把最新的数据存储到了redis
项目中用过多线程吗?(重点讲解线程池,什么业务,线程池的核心参数和原理)
物联网中设备的数据交互用到了多线程,保证数据交互的高效,多设备能够传递信息
线程池配置七大核心参数:

  1. 核心池参数:线程池中始终保持活跃的线程数
  2. 最大池参数:线程池允许的最大线程数
  3. 工作队列:用于保存等待执行的任务
  4. 线程空闲时间:除了核心池的线程其他线程能存活的最大时间
  5. 空闲时间的单位:用于指定空闲时间的单位
  6. 线程工厂:用于创建新线程的工厂
  7. 拒绝策略:当线程都在工作、队列都满了之后,线程池将执行拒绝策略
    如果设备上报的数据中有异常数据,你们是怎么处理的?处理的逻辑是什么?
    好的,这块业务相对来说比较复杂,我们的处理逻辑是这样的~
    ● 首先呢,在智能监测这个模块中,会有一个报警规则的创建,这个报警规则就是来定义哪些产品中的哪些物模型的异常数据的处理逻辑,我举几个例子
    ○ 比如,睡眠监测带上报的物模型中老人的心率是比较低的,假如低于了60,就说明设备监测到的数据是一个异常的,这个时候就需要生成报警数据,然后通知负责老人的护理员进行及时的处理
    ○ 比如,智能烟雾报警器,它是监测房间温度和湿度的,假如房间温度大于55,则会触发报警给养老院中的行政人员,让他们及时的进行处理
    ● 当定义了规则之后,我们会每个1分钟来检查最新上报的数据是否符合报警规则的定义,如果符合就直接触发报警
    ● 在定义报警规则的时候,我们会设置报警的持续周期,如果选择了3个持续周期,则表示连续三次符合报警规则才会触发一次报警
    ● 同时呢,为了访问频繁的报警,在创建报警规则的时候,也可以设置报警沉默周期,意思是当触发了报警之后,会触发沉默周期生效,在沉默周期内,则不会触发报警,比如沉周期是5分钟,也就是或,报警之后的5分钟内,不会再进行报警
    ● 关于通知的方式呢,为了更加及时的通知到相关的负责人,我们使用了websocket来进行推送数据,一旦有报警,会把消息推送给相关的负责人,会在前端自动弹窗进行说明报警的关键信息,方便及时的处理
    MySQL的索引是如何创建的?是什么场景?(介绍你项目中的业务)
    好的!养老系统中有一个家属端,在方便老人的家属查看老人的信息,比如就可以实时的查看老人的健康数据,也可以查看老人的健康历史数据。
    由于目前设备上报的数据都是存储到了MySQL的表中,设备上报的数据是巨大的,一天大概能上报70万的数据,当家属查看老人的历史数据的时候,由于表存储的数据较多,查询的效率就会很低。所以我们的解决方案就是给表中的查询字段添加了索引,这样查询效率就得到了很大的提升
    MySQL索引底层的实现原理是什么?
    MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:
    ● 第一阶数更多,路径更短
    ● 第二个磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
    ● 第三是B+树便于扫库和区间查询,叶子节点是一个双向链表
    如何检查MySQL索引是否失效?
    我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况
    关于索引失效,你遇到过哪些?
    嗯,这个情况比较多,我说一些自己的经验,以前遇到过的
    比如,索引在使用的时候没有遵循最左匹配法则,第二个是,模糊查询,如果%号在前面也会导致索引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。
    我们之前还遇到过一个就是,如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效
    所以,通常情况下,想要判断出这条sql是否有索引失效的情况,可以使用explain执行计划来分析
    什么是聚集索引和二级索引,什么是回表查询?
    好的~,聚集索引主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个,一般情况下主键在作为聚集索引的
    非聚集索引值的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚集索引
    什么是回表查询?
    嗯,其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的,回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表
    你参与过项目部署吗?是如何部署项目的?
    参与过~
    养老项目是一个单体项目,部署起来相对来说是比较简单的。
    我们在服务器中写了一个shell脚本,当项目开发到了一个小版本之后,我们会把代码合并到git的主分支中,然后执行shell脚本就可以完成自动部署,部署的过程就是
    ● 先从git仓库拉取最新的代码
    ● 然后使用maven进行编译打包安装
    ● 然后通过java -jar的方式进行启动项目即可
    常见的linux命令有哪些?
    嗯~由于我们的测试环境和生产环境都是部署在linux中的,也会经常使用到linux系统,常见的命令就比如:
    ● ps -ef | grep java 可以查看某一个进程的执行情况
    ● kill -9 进程id 可以强制的结束某一个进程
    ● tail -f 日志文件 可以查看系统运行的日志
    ● top 命令,可以查看系统的一些资源占用情况,比如cpu和内容的使用率等等这些
    ● 还有很多关于查看文件的命令,比如:cat、more等等这些
    你们项目中的bug是如何管理的?
    嗯!上家公司自己搭建了禅道服务器,所有的bug都提在了禅道中。
    ● 当某一阶段代码完成之后,会把代码提供交到测试环境,由测试人员来进行测试
    ● 如果测试过程中,发现了bug,他们会禅道中详细说明bug产生的原因,并且分配给对应的开发人员
    ● 我们开发在禅道中看到bug之后,首先会复现这个问题,然后解决掉,在禅道中标记为已解决
    ● 测试人员会对已解决的bug的再次进行回归测试,如果没有问题,则会结束这个bug
相关文章
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1002 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1698 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
642 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
611 14
|
9天前
|
人工智能 自然语言处理 API
Next AI Draw.io:当AI遇见Draw.io图表绘制
Next AI Draw.io 是一款融合AI与图表绘制的开源工具,基于Next.js实现,支持自然语言生成架构图、流程图等专业图表。集成多款主流大模型,提供智能绘图、图像识别优化、版本管理等功能,部署简单,安全可控,助力技术文档与系统设计高效创作。
687 151