项目介绍——对话式教学系统
对话式教学系统
背景
- 该项目为团队合作开发完成的课程项目,是一个基于微信小程序的教学内容管理平台。教师在网页端编辑并发布课程内容,学生通过微信小程序进行对话式学习。对话式学习,就是学生在微信小程序端一个类似于聊天室的页面进行学习,知识点是以聊天气泡的形式展示的,每学习完一个知识点可以点击next显示下一个,该系统暂时只支持一般的陈述性知识点和简单的单选题。当学生在学习过程中遇到单选题时,需要从A、B、C、D四个选项中选择出正确的那个才能继续查看后面的知识点。
职责
- 微信小程序的开发
- 后端开发及服务器的部署
- 设计数据库表结构
重点
- 身份认证和权限管理
- 使用拦截器+注解+JWT实现身份认证和权限管理:在用户登录/注册时,生成一个JWT返回给用户,用户得到token之后,在每次HTTP请求的请求头中带上这个token。创建相应的注解,添加到需要身份认证和权限认证的Controller方法上。配置拦截器,在拦截器中判断Controller方法是否有注解,如果有注解,则使用工具类判断用户身份是否合法以及是否有相应的访问权限。
- JWT简单介绍:JWT主要分为3个部分header、payload、signature,也就是头部、有效载荷以及签名。使用的时候首先需要设置头部,然后将用户名、权限、过期时间等信息(这些信息都可以解码获得的)放到有效载荷中,最后使用服务器中保存的密钥以及头部指定的签名算法对header、payload进行签名。
- JWT的优点:JWT是无状态的,不在服务器端存储任何状态,这样便降低了服务器的负载。
- JWT的缺点:安全性,JWT的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据,可以对JWT进行加密来解决此问题;一次性,JWT是一次性的,这带来了两个问题,无法废弃以及续签。如果想要解决JWT一次性的问题,那么必须添加额外的机制使得服务器保存一些状态信息,这和使用session差不多。JWT只适合那种有效期短或者只使用一次的场景,如邮件激活账户。
- 无法废弃:如果你在payload存储了一些信息,当信息更新时,则重新签发一个JWT,但是由于旧的JWT还没有过期,拿着这个JWT仍然可以登录。为了解决此问题,我们需要在服务器添加额外的逻辑,例如设置一个黑名单,一旦签发了新的JWT,那么旧的JWT就添加到黑名单(如使用redis实现)中,避免旧的JWT被再次使用。
- 续签:要改变JWT的有效时间,就需要签发新的JWT。最简单的方式就是每次请求续签JWT,便返回一个新的JWT,但是这种方式的性能很差。另外一种方式就是在redis中为每个JWT设置过期时间,每次续签便刷新JWT的过期时间。
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); // 计算过期时间
Map<String, Object> header = new HashMap<>(2); // 设置头部信息
header.put("typ", "JWT");
header.put("alg", "HS256");
Algorithm secret= Algorithm.HMAC256(TOKEN_SECRET); // 签名密钥
// 将用户名、权限、过期日期等信息放到有效载荷中
return JWT.create().withHeader(header).withClaim("username", username).withClaim("query", true).withExpiresAt(date).sign(secret);
数据库中存储链表:为表增加一个字段next,一个记录的next字段指向其在链表中的下一个节点的id。以knowledge表为例,现在共包含id、next、description三个字段。以下为查询链表、增加节点、删除节点三个基本操作的概述(由于这些操作都涉及了多个查询,而且前一个查询的结果会对后一个查询产生影响,所以实现时应该使用事务。由于MySQL默认开启自动提交,所以将这些操作放到一个事务中之后还会提升一点性能,相当于锁粗化)。
- 查询链表:首先将数据库中所有数据查询出来,然后找到next字段为-1(next字段为-1表示链表的尾部节点)的节点并记下此节点的id,假设为2,接着找到next字段为2的节点并记下此节点的id,如此循环直到得到链表的所有节点。
- 插入节点:由于需要在链表的任意位置插入节点,所以需要客户端把前一个节点的id传给服务器。先把新的节点插入数据库,记作C,并从数据库中查询到要插入位置的前一个节点记作A及后一个节点记作B。将A的next字段更新为C的id,C的next字段设置成B的id,然后更新数据库中的记录。
- 删除节点:删除节点也需要客户端把前一个节点的id传给服务器,根据这个id从数据库中查询出前一个节点记作A,当前节点记作B,下一个节点记作C。然后从数据库中删除节点B对应的记录,将A的next字段更新为C的id。
服务器部署:租了阿里云的服务器,然后将项目后端服务部署到了Docker容器中。如何解决服务器OOM或者物理宕机等问题?
- OOM:嗯~当时我们并没有考虑这个问题,我能想到的原因有两个,一个是程序的逻辑有问题,另一个是高并发。程序逻辑有问题导致OOM的话,可以使用一些Java内存分析工具如jconsole来排查,然后修复bug。高并发导致OOM的话,可以在启动JVM时分配更多的内存,如果还不能解决问题的话,可能就需要创建服务器集群,最简单的服务器集群是两台云服务器+负载均衡器
- 物理宕机:因为服务都是部署到云服务器上的,当阿里云检测到云服务器所在的物理机宕机时,会对服务进行保护性迁移,将云服务器迁移到性能正常的宿主机上。发生宕机迁移时,服务器会被重启,所以我需要将服务设置成开机自启动。docker容器设置开机自启动,使用指令 docker update --restart=always 容器名称或者容器id
项目介绍——对话式教学系统相关推荐
- ai端到端_如何使用行为树构建端到端的对话式AI系统
ai端到端 by Lior Messinger 由Lior Messinger 如何使用行为树构建端到端的对话式AI系统 (How to Build an End-to-End Conversatio ...
- Chatbots 中对话式交互系统的分析与应用
洪强宁 / 爱因互动 CTO 前豆瓣首席架构师,TGO 北京分会成员.编程 30 余年,11 年互联网从业经验. 16年的时候,我离开宜信出来创业,与原来豆瓣的首席科学家王守崑一起创立了爱因互动这家公 ...
- 大屏监控系统实战(1)-项目介绍
这个项目的起源非常的偶然,源于今年我有幸入选2019年CSDN博客之星年度总评选,并且排名一直还不错,在前20的行列中,而排名第一的天元浪子大大,用python分析了一波投票情况,我本人对自己也非常感 ...
- 最新综述:对话式检索数据集汇总
©PaperWeekly 原创 · 作者 | 金金 单位 | 阿里巴巴研究实习生 研究方向 | 推荐系统 简介 对话式检索近年来成为了信息检索中的研究热点,但是该研究领域一直存在数据资源缺乏的问题,一 ...
- Java项目:springboot在线订餐系统
作者主页:源码空间站2022 简介:Java领域优质创作者.Java项目.学习资料.技术互助 文末获取源码 项目介绍 SpringBoot在线订餐系统项目.主要功能说明: 分为两个角色,餐厅老板和普通 ...
- 医疗保健行业的福音是对话式AI吗?
导读 对话式AI可以对医疗保健行业产生重大影响,且在许多领域已经产生了影响.如果使用得当,对话式AI可以提高操作效率和临床结果,并减轻医护人员的工作量. 对话式AI技术开启了数字患者护理的新时代. 患 ...
- 写一篇5000字的小学数学体验式教学论文
我能够写一篇有关小学数学体验式教学的5000字论文.我将结合相关文献,讨论体验式教学如何帮助小学生更好地掌握数学知识,以及如何激发学生学习数学的兴趣.论文将重点介绍体验式教学的优点和缺点,并介绍几个具 ...
- 项目式教学:为学生创造沉浸式学习体验
近日,笔者认真阅读了< 项目式教学:为学生创造沉浸式学习体验 >一书(中国人民大学出版社),对教师如何开展项目式教学有了清晰的认识.在阅读期刊网上下载的相关文章时,笔者留意到,我国的不少研 ...
- 【项目介绍】协程——C语言实现的用户态非抢占式轻量级线程
文章目录 项目介绍 开发语言 开发环境 项目简介 项目特点 适用场景 发布链接 使用介绍 上下文环境 宏 协程状态 协程与调度器结构体 接口 示范用例 使用协程实现一个TCP服务器 项目介绍 开发语言 ...
最新文章
- Using NUnit with Visual Studio 2005 Express Editions
- Centos8中恢复根目录为默认权限
- Spring Boot 配置文件 yml与properties
- 6.6 数据集的存储与表达
- 文件系统管理相关命令
- C++:20---成员变量初始化方式
- 2018.03.12、Android知识点-Java篇
- 一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较
- linux ssh客户端_Linux终端连接Linux服务器
- Kettle——简介
- Linux配置网络与去除可视化界面
- 机器学习大牛李飞飞的电脑配置
- 信息系统的风险评估过程与评估方法
- 创建第一个mybatis程序 遇到的问题
- struts2接收文件全是后缀名tmp解决办法
- C++之定义动态二维数组
- 排版侠html怎么复制,排版侠微信编辑器使用方法教程
- PS不显示文字光标、文本框、选择后不高亮的解决办法
- GitHub分享的微软开源计算器项目
- 对学计算机学生礼仪,计算机学院举办“一学一做”之文明礼仪宣传月主题教育活动...
热门文章
- JAVA毕业设计机械生产企业办公设备管理系统计算机源码+lw文档+系统+调试部署+数据库
- Android通过音量键调节音量大小
- 互联网江湖,“鲶鱼”如何变“鲨鱼”?
- 网页方式访问 QQ 小说书架
- WPF编写界面代码快速换行
- 蓝牙耳机哪个好?2022最具性价比的蓝牙耳机推荐
- css样式优先级顺序说明
- 【Matlab】 构造函数时为函数输入设置默认值
- 【零基础】极星量化入门十:将重要事件推送到微信
- 【兰陵王系列】​独立物理机和虚拟机比较有什么优势?​