摘要:本篇文章主要介绍了字母哥JAVA的答辩通关之路。文章详细阐述了JAVA学习的重要性,通过一系列的学习方法和技巧,帮助读者逐步掌握JAVA编程技能。文章强调了答辩过程中的注意事项和应对策略,帮助读者顺利通过答辩环节。对于想要学习JAVA编程或者即将面临答辩的读者来说,本文提供了宝贵的参考经验和指导。
JAVA答辩通关之路
- 部分同学讲解视频
- 答辩200问
- 说一下项目的技术亮点
- 前端、后端、前台、后台之间的区别
- Get、Post是什么
- 前端如何和后端进行交互的吗
- 前端和后端进行数据交互的技术是什么
- 系统是前后端分离的
- 前端和后端进行交互传递的数据是什么格式
- 你如何确保用户数据的安全性和隐私性,例如个人信息、付款详细信息和订单历史记录
- 你使用了哪些加密或身份验证方法?
- 你是如何测试网站的性能和可扩展性的?
- 你的网站可以处理多少个并发用户
- 你如何处理潜在的错误或异常?
- 你如何处理系统中数据不一致、重复或丢失等潜在问题
- 如何保证你的系统设计的合理性和有效性?
- 你是如何保证存储在MySQL数据库中的用户数据的安全和隐私的?
- 你采取了哪些措施来防止未经授权的访问、数据泄露或数据损坏?
- 你是如何测试系统功能和性能的
- 你使用什幺工具或方法来衡量系统的质量和效率
- 在测试过程中有没有遇到什幺挑战或困难
- 你计划在未来如何改进或扩展该系统
- 你想添加到系统中的一些新特性或功能是什
- 他们将如何使用户和系统目标受益
- 你如何处理系统中的数据验证和异常处理
- 你是否为此使用了任何工具或库
- 你如何评估系统的性能和效率
- 你是否为此使用了任何指标或基准
- 解释系统功能模块之间如何交互。你是如何设计前端和后端之间的通信和数据流的
- 你使用了什幺协议和格式
- 你们是如何保证数据库的数据完整性和查询效率的
- 你是否使用过任何工具或方法来优化你的数据库性能
- 前端使用了哪些技术
- 前端使用是Vue的版本是什么
- 前端使用的UI框架是什么
- 为啥系统要使用Vue技术
- Vue中的双向绑定如何理解
- Vue中的组件如何理解
- 前端项目中有没有使用到node.js
- 前端项目中构建Vue的工具是什么
- 请问系统有没有是有MVC设计模式呢
- Vue文件的组成有哪些呢
- 说一下Vue中常见的几个生命周期
- 说一些Vue中常见的指令
- 说一下vue中的data是干什么用的
- 说一下Vue中的{{}}语法是什么
- 说一下Vue是如何进行页面跳转的
- 说一下Vue是如何把接受上一个页面的参数值
- 说一下什么是Token(令牌)
- 说一下如何判断用户是否登录的
- 说一下前端的缓存Cookie
- 说一下前端有没有使用到缓存localStore
- 说一下系统的这些图形可视化是如何实现的
- 说一下登录是如何实现的
- 系统的页面router在哪里进行声明
- 我看你项目使用了Vue以及webpack打包工具,每个页面都有import这个导入解释一下这个作用
- 我看你Vue组件里面使用了Watch,能给我讲解一下Watch的作用吗?
- 我看你项目使用了Vue,你能给我说一下如何引用其他组件的吗?
- 你使用的是Vue是吧,说一下Vue组件里面的一些常见方法和用途
- 我看你项目使用了Vuex,你能说说Vuex是干嘛的吗?
- 请问一下你后端使用的是什么语言和框架
- 请问一下后端操作数据库的框架使用的是什么呢
- 请问一下后端是如何配置数据库链接的呢?位置在哪里?
- 你说你项目使用了一些插件,请问一下你是如何引用插件的呢?
- 为什么使用mysql数据库
- 说一下表设计里面为啥都有一个CreatorId和CreationTime
- 说一下springboot声明的数据库实体放在哪里
- 说一下什么是接口 我们系统有没有接口呢
- 说说系统使用了哪些算法(MD5)
- 说说系统使用了哪些算法(协同过滤算法)
- 说说系统使用了哪些算法(HMAC算法)每个系统都用了
- 说说系统中使用了哪些算法(Ant路径匹配算法)每个系统都用了
部分同学讲解视频
讲解百度网盘地址
https://pan.baidu.com/s/1gcPfUtYNYxmmX3_SWAXKjg?pwd=8p1d
提取码:8p1d
–来自百度网盘超级会员V3的分享
答辩200问
最近会持续性更新答辩的内容,以及后续的视频教程
每个例子 都分为2步 知识科普(可写入论文) 答辩场景回答
说一下项目的技术亮点
答辩场景回答:首先项目是分为了前端和后端,是一个前后端分离的项目,前后端分离能够降低程序的耦合度,前端专注前端,后端专注后端,术业有专攻。在项目的实现过程中我们后端主要使用的框架是springboot,通过springboot和ssm对比,springboot配置了许多常用的功能,比如控制器的路由,全局返回结果的处理,全局异常错误的处理,并且可以通过maven快速的复原系统的环境配置。并且springboot的部署也是比较方便的,它内置了tomcat服务器,意思就是很方便的部署在任何一台机器上。在前端的技术方面,目前我们系统使用的是vue,vue是目前比较流行的前端技术,在vue的基础上我们还使用elementui的框架,这个框架里面包括了大量的组件,比如按钮,表格,弹窗等等组件,通过这些组件化的思想能够大大的提升代码的复用,高复用就代表代码的质量越高,并且组件化的思想也是非常提升开发的效率。
前端、后端、前台、后台之间的区别
前台 (Frontend): 这是用户直接与之交互的界面。无论是网页、桌面应用还是移动应用,前台都是用户看到并与之互动的部分。例如,一个在线购物网站的搜索商品、添加到购物车和结账等功能都是前台的一部分。
后台 (Backend): 后台是给系统管理员或特定用户使用的界面,他们通常具有特定的权限来管理和维护系统。例如,一个电子商务网站的库存管理、订单处理和用户权限控制等都属于后台的功能。
前端 (Frontend): 前端技术主要用于实现前台的用户界面和后台界面,以及与后端进行数据交互。它涉及的技术包括HTML、CSS、JavaScript等,用于创建用户所看到的网页或应用的界面。
后端 (Backend): 后端是指系统的后端逻辑部分,主要负责处理数据、业务逻辑和与数据库的交互。常见的后端技术包括PHP、Python、Java、Ruby on Rails等。
从下面的图可以看出最终项目的效果已前台和后台等方式呈现
答辩场景回答:前台和后台是通过权限进行区分的,给一些用户使用的就是前台,进行系统管理的就是后台,每个系统都会有后台,前端就是编写前台和后台的样式和布局以及交互效果,后端就是编写一些接口,这些接口提供给前端,前端通过axios完成数据的获取。
Get、Post是什么
在计算机和网络中,GET和POST是两种常用的HTTP协议方法,主要用于浏览器和服务器之间的数据交换。
答辩场景回答:get和post都是一种HTTP请求的方式,他们的主要区别是Get能够发送给后端的内容比较小,并且安全性比较低,POST则相反,我们系统开发主要使用的是Post,很少使用Get。
前端如何和后端进行交互的吗
前端和后端的数据交互主要遵循HTTP协议,采用诸如AJAX这样的技术来处理数据、资源获取以及状态管理等复杂的前后端交互逻辑。具体来说,这个过程可以分为以下几个步骤
步骤一:前端向后端发起请求:这是数据交互的第一步,通常由前端代码实现。它可以通过URL接口地址将需要的数据作为参数传递给服务器。
步骤二:后端接口接收前端的参数:在接收到前端的请求后,后端接口会开始层层调用方法处理这些数据。
步骤三:后端处理数据:这一步通常包括查询数据库以获取所需的数据。
步骤四:后端返回数据给前端:一旦数据处理完成,后端就会将结果数据返回给前端。
步骤五:前端渲染数据:最后一步是前端使用收到的数据进行渲染,更新用户界面。
答辩场景回答:系统在点击按钮、或则调整新的页面的时候,前端通过js完成请求数据的组装,然后通过axios网络请求技术请求后端提供的URL,然后后端接受到前端的请求会执行具体的业务逻辑处理,这个过程中会操作的数据库,后端操作完后会把结果响应给前端,前端最终获取到后端的数据在组装显示到页面,最终呈现给用户。
前端和后端进行数据交互的技术是什么
Axios是一个基于Promise的HTTP客户端,可以用于浏览器和Node.js中。它是一个轻量级的库,简单的讲就是可以发送get、post请求。
答辩场景回答:前端使用了Axios,Axios是一个Http网络请求库,它能够发送get,post请求。
系统是前后端分离的
前后端分离是一种软件开发架构方式,它的核心是将前端和后端的开发完全分开。在这种模式下,前端工程师专注于用户界面和用户体验的构建,而后端工程师则主要负责服务器、应用以及数据库的开发。
这种分离方式的主要优势在于可以提高开发效率和降低维护成本。由于各负其责,开发者可以更加专注,从而加快开发速度。同时,由于前后端的代码是独立的,因此也降低了整个系统的维护难度。
在实际应用中,前后端分离通常通过API(应用程序接口)来进行数据交互。如果前端和后端只通过简单的API文档就能进行数据交流,那么就说明他们的逻辑是分离的。此外,静态资源和服务(实现接口的业务逻辑)在开发阶段就进行分离开发,并在部署阶段分别部署在不同的服务器上,这种方式可以算作是严格意义上的前后端分离。
然而,值得注意的是,前后端分离并不意味着完全不依赖对方。在某些情况下,如用户权限验证、页面跳转等,前后端仍然需要紧密合作。而且,前后端分离只是一种架构模式,具体实施时还需要根据项目的实际情况进行调整。
答辩场景回答:系统是前后端分离的,前后端分离是目前比较主流的软件开发架构,前端人员专注系统前端的开发,后端人员专注后端的开发,这样的好处是术业有专攻,专业性更强,开发效率也能高,前端和后端开发完毕后最终通过接口(API)的方式来进行数据交互,这样就完整的代替了以前的开发模式了。
前端和后端进行交互传递的数据是什么格式
前端和后端交互时,传递的数据格式主要是JSON
JSON格式有一个很明显的优点,那就是它的简洁性和清晰性。易于人阅读和编写,同时也易于机器解析和生成
下面就是一个标准的Json格式
{ "name": "字母哥", "age": "26", "desc": "4年开发经验" }
答辩场景回答:系统和后端进行交互的过程中,主要使用的是json格式,json是一种字符串,前后端交互的过程中规定一个指定的数据格式,方便前后端进行联调。
你如何确保用户数据的安全性和隐私性,例如个人信息、付款详细信息和订单历史记录
在系统设计的过程中,我们可以从下面几点和老师说
加密传输:在数据进行传输的过程中,我们可以使用SSL、TLS等机密协议来宝子数据在传输过程中的安全,这可以防止未经授权的第三方截取或篡改数据。
访问控制:在接口的设计过程中,对没有登录的用户进行接口拦截,提示403未授权,实施严格的访问控制策略,确保只有经过验证和授权的用户才能访问相关数据。
你使用了哪些加密或身份验证方法?
在系统进行登录的时候,我们会在登录接口颁发一个token,通过RSA非对称加密算法生成一个签名,该签名无法被伪造,然后在每次请求接口的时候我们会从header中获取token,去再次根据signature进行检测,如果再次生成的token和header中获取的token一样则说明没有被伪造。
你是如何测试网站的性能和可扩展性的?
测试网址的性能的时候首先要考虑用什么工具,目前我们可以使用postman、jmeter、webload等专业的测试工具对网址的接口进行压测,通过观察系统的qps或者tps等来查看系统的性能。在扩展性方面我们可以搭建集群,通过把项目部署在多台机器上,在通过nginx进行负载均衡算法把流量打到不同的机器上,从而提高了系统的性能、稳定性等等。
你的网站可以处理多少个并发用户
我们系统使用的springboot3.1。springboot对于单台机器可以最大处理2000个并发,具体的多少和机器的配置和性能都有关系。
你如何处理潜在的错误或异常?
在系统架构设计中,对于系统的异常我们会通过日志将他收集,并且会在系统编写异常处理类,在响应接口之前进行拦截异常,返回一个友好的提示给用户,具体的可以参考我们系统的GlobalExceptionHandler类
你如何处理系统中数据不一致、重复或丢失等潜在问题
数据不一致:对于这一块,系统数据不一致是经常会发生的,我们可以通过定时任务或者写特定的sql语句去查询出系统存在的异常数据。
重复:对于重复的数据要考虑是不是每次新增的时候没有判断是否存在,并且可以在数据库层面加唯一判断或者是唯一索引来避免重复的问题
丢失:系统数据丢失也是经常会存在的,一个是可以接入阿里云mysql服务,通过阿里云的快照,把丢失的数据进行恢复。
如何保证你的系统设计的合理性和有效性?
系统的设计会更加业务的大小用户的多少来进行考虑的。可以通过下面几个点来说
**需求分析:**利益相关者进行深入沟通,确保对业务需求有清晰、全面的理解。
**模块化设计:**使用接口和抽象来定义模块之间的交互,减少模块间的耦合。将系统分解为独立的模块或服务,每个模块负责一部分功能。
**遵循设计原则:**应用SOLID原则(单一职责、开闭原则、里氏替换、接口隔离和依赖倒置)来指导类的设计和系统的架构。
**技术选型:**考虑技术的成熟度、社区支持、学习曲线和维护成本。
你是如何保证存储在MySQL数据库中的用户数据的安全和隐私的?
**数据加密:**对一些比较敏感的数据进行加密(比如密码、或者手机号、地址进行脱敏处理)
**访问控制:**限制对数据库的访问权限,只授予必要的权限给必要的用户,还可以使用强密码和定期更新密码的策略。
**网络安全:**将数据库服务器放在受保护的网络区域内、使用防火墙限制不必要的入站和出站流量。
你采取了哪些措施来防止未经授权的访问、数据泄露或数据损坏?
你是如何测试系统功能和性能的
你使用什幺工具或方法来衡量系统的质量和效率
在测试过程中有没有遇到什幺挑战或困难
你计划在未来如何改进或扩展该系统
你想添加到系统中的一些新特性或功能是什
他们将如何使用户和系统目标受益
你如何处理系统中的数据验证和异常处理
你是否为此使用了任何工具或库
你如何评估系统的性能和效率
你是否为此使用了任何指标或基准
解释系统功能模块之间如何交互。你是如何设计前端和后端之间的通信和数据流的
你使用了什幺协议和格式
你们是如何保证数据库的数据完整性和查询效率的
你是否使用过任何工具或方法来优化你的数据库性能
前端使用了哪些技术
一般问技术就包括了框架、组件、一些技术方案。
答辩场景回答:我本次做的系统前端使用的是HTML和CSS构建网页布局和样式,使用了Js来构建页面的交互操作,除此之外使用了Vue和ElementUI构建复杂的页面应用,并且使用了Axios进行前后端数据交互。
前端使用是Vue的版本是什么
答辩场景回答:前端目前使用的是Vue2,
前端使用的UI框架是什么
答辩场景回答:前端目前使用的UI框架是ElementUI,使用他的目的是他提供了非常丰富的组件,减少了重复性工作的开发。
为啥系统要使用Vue技术
Vue.js是一款用于构建用户界面的渐进式JavaScript框架。它的主要优点包括:
轻量级:Vue.js是一个轻巧、高性能的MVVM库,这使得它在处理大型应用程序时具有显著的优势。
易于学习和使用:Vue的文档深入浅出,逻辑清晰,使得开发者能够快速上手并高效地进行开发。
响应式编程:数据和视图之间的同步是Vue的一个核心特性,它让数据和视图之间的同步变得直观和自动。
组件化:Vue提供了一套完整的组件化解决方案,允许开发者将复杂的用户界面拆分成可复用的组件。
虚拟DOM:在处理大量数据更新时,Vue能够通过虚拟DOM技术减少不必要的重绘和重排,从而提高性能。
完善的中文文档和社区支持:Vue有详细的中文文档和活跃的中文社区,为国内开发者提供了方便。
答辩场景回答:本系统使用vue的原因如下,一是目前主流的前端技术,它会有比较丰富的生态并且完善的文档,在CSDN或则一些博客上能够很容易找到相关解决的方案,二是他的组件化思想,把每个功能想成一个小模块,最终把这些小模块像搭建积木一样组装就成了一个系统,并且组件化的思想减少了重复性代码的编写。三是他的响应式编程,它是基于数据的驱动模型,数据改变了页面视图就跟着变,页面视图改变了数据就跟着变,双向绑定的思想让系统开发变得更加简单直观。
Vue中的双向绑定如何理解
双向数据绑定是Vue.js的核心特性之一,它让数据和视图之间的同步变得直观和自动。在这种模式中,当数据发生变化时,视图会立即更新以反映这些变化;同样,当用户在视图(例如表单元素)中进行操作并导致数据变化时,模型也会自动、实时地更新为新的值。
答辩场景回答:双向绑定的意思就是你变了我跟着变,我变了你也跟着变,一直保持着同步的状态,在我们系统中就是数据改变了页面跟着变,页面变了数据跟着变。
Vue中的组件如何理解
Vue的组件是其最强大的功能之一,允许开发者进行数据传递、扩展HTML元素和封装可重用的代码。从较高的层面上看,组件是自定义元素,Vue.js的编译器为其添加特殊功能。在某些情况下,组件也可以表现为使用is特性进行了扩展的原生HTML。
组件系统是Vue的核心概念,因为它提供了一种抽象方式,使我们能够使用小型、独立且通常可复用的组件来构建大型应用。几乎任何类型的应用界面都可以抽象为一个组件树。这种组件化的方法不仅提高了开发效率,还方便了代码的重复使用,同时简化了调试步骤。
答辩场景回答:系统中使用组件,能够减少重组代码的编写,高度的封装能够减少代码的冗余,提高代码的质量。
前端项目中有没有使用到node.js
答辩场景回答:前端项目使用了webpack,webpack来管理项目是基于nodejs的,所以使用了nodejs。
前端项目中构建Vue的工具是什么
在Vue项目中,webpack是一个关键的构建工具,负责处理项目的模块化和打包。本质上来说,webpack是一个现代的JavaScript应用的静态模块打包工具,它不仅会帮助我们处理模块间的依赖关系,而且不仅限于JavaScript,还支持各种主流格式。
答辩场景回答:我们项目使用的是webpack来进行构建项目的,在运行前需要执行 npm run dev的命令来运行前端项目,并且我们依赖的一些三方工具库,都存在node_modules这个文件夹下面。
请问系统有没有是有MVC设计模式呢
MVC: 也是一种设计模式, 组织代码的结构, 是model数据模型, view视图, Controller控制器, 在控制器这层里编写js代码, 来控制数据和视图关联
答辩场景回答:项目虽然是前后端分离,但是是使用了MVC设计模式的,后端主要完成了控制器,前端则负责View视图,这个视图指的就是View组件,model数据模型则指的就是vue中的data
Vue文件的组成有哪些呢
一个.vue文件就是一个Vue组件,它主要由三部分组成:模板(template)、脚本(script一个.vue文件就是一个Vue组件,它主要由三部分组成:模板(template)、脚本(script)和样式(style)。
模板(template):这是组件的HTML结构部分,包含了组件的标签和文本内容。所有的HTML结构都是在标签中。
脚本(script):这部分包含了组件的逻辑处理代码,例如数据处理、事件监听等。所有的JS逻辑都在script标签中,并且必须设置导出,即export default {…}。
样式(style):这部分是组件的CSS样式定义部分,包括了组件的颜色、字体、布局等样式信息。所有的CSS样式都在style标签中,通常需要设置scoped属性,表示这些样式仅作用于当前组件。
答辩场景回答:我们项目的Vue页面文件都放在了Src->Views 这个目录下,一个页面的组成主要是靠template、script、style等几个方式组成,并且template就是html,script就是我们说的js,style就是我们说的css,Vue把这几个模块放在了一个文件,并且把他叫做组件。
说一下Vue中常见的几个生命周期
在Vue中,组件从创建到销毁的整个过程被称为生命周期。这个过程中主要包括四个阶段:创建、挂载、更新和销毁。每个阶段都有相应的生命周期钩子函数,这些函数可以让开发者在特定阶段运行自己的代码。
以下是各个阶段以及对应的生命周期钩子函数:
创建阶段:这个阶段开始于实例化Vue对象,并在数据观测(data observer)和event/watcher事件配置之前调用beforeCreate函数。这个阶段的主要生命周期钩子函数有beforeCreate和created。
挂载阶段:这个阶段开始于模板编译并把实例挂载到DOM上,这个阶段的主要生命周期钩子函数有mounted。
更新阶段:当Vue实例的数据发生变化时,会触发更新阶段,这个阶段的主要生命周期钩子函数有updated。
销毁阶段:这个阶段主要涉及到组件销毁和清理工作,这个阶段的主要生命周期钩子函数有beforeDestroy和destroyed。
答辩场景回答:我们项目使用了vue,每次进入页面的时候,就代表了组件创建,创建的时候会执行创建阶段,挂载到Body上的时候执行挂载阶段,然后页面被我们关掉的时候会执行销毁阶段,一般我们在创建阶段的时候会从后端获取数据。
说一些Vue中常见的指令
Vue中提供了许多方便操作DOM的指令,这些指令以v-xxx的形式表示。以下是Vue中一些常见的指令:
v-bind:主要用于数据绑定,可以动态地更新HTML元素的属性值。
v-on:主要用于事件监听,可以在HTML元素上绑定事件监听器。
v-model:实现表单元素的双向数据绑定,用于创建和管理表单输入和应用状态之间的双向数据同步。
v-for:用于循环创建DOM元素,可以基于数组或对象来渲染列表。
v-show和v-hide:这两个指令用于显示和隐藏元素,区别在于v-show通过修改标签上的display属性来实现显示和隐藏,而v-hide则是真正地添加或删除DOM元素。
v-if和v-else:这两个指令主要用于条件性地渲染元素或者模板片段,当条件为真时,v-if会将元素及其子元素包含到DOM中,否则就移除;而v-else则作为v-if的补充,当v-if的条件不为真时执行
答辩场景回答:在系统中存在一些多条记录显示的时候使用了v-for,他是一种循环技术,在进行一些判断显示还是不显示的时候会使用v-if和v-else,根据这个指令就能很方便来控制页面内容的显示,在一些新增表单和修改表单的时候会使用v-model
说一下vue中的data是干什么用的
几乎每一个vue组件都会使用到data这个属性,
在Vue.js中,data是Vue实例的数据对象,用于存储组件数据。这些数据可以是一些简单的键值对,也可以是更复杂的JavaScript对象。当这些数据发生变化时,因为Vue会递归将data的属性转换为getter/setter,所以视图将会产生响应式的更新。
答辩场景回答:vue是数据双向绑定的,要想数据变动也能显示到页面的html中,就必须声明这个数据在data中,只有data中的数据才能被认为是可以渲染到页面的数据
说一下Vue中的{{}}语法是什么
在Vue中,插值语法{{ }}被用于在HTML元素中添加变量,以便与JavaScript程序中的变量值进行同步,从而简化代码编写。
答辩场景回答:在系统中可能存在一些显示 比如想把name字段显示到一个div标签中比如
我的名字:{{name}}
通过上面的语法就可以搞定name渲染到div中的操作
说一下Vue是如何进行页面跳转的
在Vue中,可以使用this.$router.push()方法来跳转到下一个页面。例如:
methods: { goToNextPage() { this.$router.push('/next-page'); } }
也可以进行带参数进行跳转
methods: { goToNextPage(param) { this.$router.push({ path: '/next-page', query: { param: param } }); } }
答辩场景回答 在系统中可以使用vue自带的this.$router.push这个方法完成页面的跳转,如果需要带参数的话,在该方法的第2个参数支持query对象传参,把你想要的值赋值给query最终就可以显示网站的网址的后面。
说一下Vue是如何把接受上一个页面的参数值
methods: { getParam() { console.log(this.$route.params.param); // 输出传递过来的参数值 } }
答辩场景回答 在系统中经常会需要接受到上一个页面的参数,通过vue提供的语法this.$route.params来获取上一个页面的参数
说一下什么是Token(令牌)
令牌(Token)是服务端生成的一串加密字符串,可以作为客户端进行请求的一个“令牌”。当用户第一次使用账户名和密码成功登录后,服务器会产生一个Token以及其失效时间,并将这些信息返回给客户端。Token在系统中持续存在,除非系统重新启动。其主要作用是在客户端身份认证的过程中发挥作用,用于判断请求是否合法,并确定这次请求属于哪个用户。
答辩场景回答 在系统中,每次系统登录后,后端都会返回一个token给前端,前端需要保存该token数据,在进行一些敏感的请求的时候需要带着token进行请求,每一个token都能标识唯一的一个用户,后端也能够根据token判断用户是否登录,并且是哪一个用户。
说一下如何判断用户是否登录的
答辩场景回答 在系统中都会有登录,在登录成功后后端会返回一个唯一凭证给前端,我们称为token,也叫令牌,然后把token存在前端,每次进行一些操作的时候可以判断token是否存在,存在说明已经登录,否则没有登录
说一下前端的缓存Cookie
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,主要用于记录客户端的用户信息。当用户访问网页时,相关信息(如姓名)可以记录在 Cookie 中,当下一次访问该页面时,可以在 Cookie 中读取用户的访问记录。此外,Cookie 还用于告知服务端两个请求是否来自同一浏览器,常用于保持用户的登录状态。
答辩场景回答 在系统中都会有登录,在登录后会获取到一个token,如果用户一不小心把页面关闭掉了,下次进入还需要登录就比较繁琐,给用户不好的体验,如果这个时候用户登录后把token缓存到cookie中,下次进入系统的时候从cookie中先获取到token,并且判断该token是否失效,如果没有失效就能正常使用系统,这样给大大提供了用户的使用体验。
说一下前端有没有使用到缓存localStore
前端缓存是指将数据存储在浏览器中,以便下次访问时可以更快地加载和显示。LocalStorage 是 HTML5 提供的一种客户端存储方式,可以将数据保存在用户的本地计算机上,即使用户关闭了浏览器窗口或电脑也不会丢失。
使用 LocalStorage 可以实现以下功能:
保存用户设置信息,例如主题、字体大小等。
保存用户登录状态,避免每次访问网站都需要重新登录。
保存购物车信息,让用户可以在不同设备之间同步购物车内容。
保存表单数据,避免用户填写表单时需要重复输入相同的信息。
使用 LocalStorage 的步骤如下:
通过 localStorage.setItem(key, value) 方法将数据保存到 LocalStorage 中,其中 key 是数据的标识符,value 是要保存的数据。
通过 localStorage.getItem(key) 方法从 LocalStorage 中获取数据,其中 key 是数据的标识符。
通过 localStorage.removeItem(key) 方法从 LocalStorage 中删除数据,其中 key 是数据的标识符。
通过 localStorage.clear() 方法清空 LocalStorage 中的所有数据。
需要注意的是,LocalStorage 只能存储字符串类型的数据,如果需要存储对象或数组类型的数据,需要先将其转换为 JSON 字符串再进行存储。同时,LocalStorage 中的数据是以键值对的形式存储的,因此需要为每个数据指定一个唯一的 key。
答辩场景回答 我们系统也是有使用了localStorage,有时候前端需要缓存一些数据的时候就会使用到这个localStorage,比如我们想保存一下用户的token,都是可以使用localStorage的。
说一下系统的这些图形可视化是如何实现的
前端图形可视化主要利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,再进行交互处理。具体来说,有一些优秀的工具和技术可以应用:
ECharts: 是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的图表。
使用Echarts完成柱状图的步骤如下:
引入Echarts库文件,可以通过CDN或者下载到本地。
在HTML中创建一个用于显示图表的容器。
编写JavaScript代码,初始化Echarts实例并设置图表的配置项。
// 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('barChart')); // 指定图表的配置项和数据 var option = { title: { text: '柱状图示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option);
这样就可以完成一个简单的柱状图了。你可以根据实际需求修改图表的配置项和数据。
答辩场景回答 我们系统使用的Echarts这个三方库来做图形可视化展示,比如实现一个柱状图只需要引入该库,然后声明一个div容器,然后使用echarts提供的语法进行配置,完成配置后就可以渲染到页面上,然后再这个过程中我们是从后端获取数据,然后把这些数据加载到echarts的配置中,然后就能正常显示出图形了。
说一下登录是如何实现的
答辩场景回答 首先是前端会写一个表单,然后这个表单里面包含了账号和密码2个输入框,在点击按钮的时候会获取2个账号和密码表单的输入值,然后通过前端判断下用户是否输入了账号密码,如果输入了前端通过axios发送json数据给后端编写的登录方法,该方法会把参数传入到service层,然后service层通过mybatis去连接数据库,并且生成查询sql语句,最终mysql返回查询的结果,然后后端把这个结果返回给前端,前端接受到这个结果后判断是否登录成功,如果登录成功则跳转下一个页面,否则则提示用户或则密码输入有误。
系统的页面router在哪里进行声明
官方教程
我们打开一个标准的element-ui-admin的项目
可以看到router文件夹里面有个index.js
答辩场景回答 我们系统使用了ElementUI这个框架,这个框架的每个页面需要在Router的Index的文件里面进行配置,按照官方教程就可以完成配置
我看你项目使用了Vue以及webpack打包工具,每个页面都有import这个导入解释一下这个作用
几乎每个页面都可以看到import这个关键词
在前端开发中,import 和 require 都是用于导入模块的语法。它们之间的主要区别在于模块解析的方式和加载时机。
import:是 ES6(ECMAScript 2015)引入的新特性,用于静态导入模块。它使用静态的字符串路径来引用模块,并且可以在代码中使用模块导出的内容。import 语句会立即执行模块代码,并将结果赋值给指定的变量。这种方式适用于需要立即使用的模块。
示例:
复制代码 import { func1, func2 } from './module.js'; func1(); func2();
require:是 Node.js 中的模块加载方式,用于动态导入模块。它使用动态的字符串路径来引用模块,并且需要在代码中使用回调函数或者 Promise 来处理模块加载完成后的结果。require 语句不会立即执行模块代码,而是将模块代码缓存起来,等到真正需要使用时再执行。这种方式适用于需要延迟加载的模块。
示例:
const module = require('./module.js'); module.func1(); module.func2();
总结:import 是静态导入,适用于需要立即使用的模块;require 是动态导入,适用于需要延迟加载的模块。
答辩场景回答 在使用vue这个框架的时候,几乎都会使用到import这个关键词,这个关键词就是导入的意思,比如你想引用其他模块的内容,就需要import一下这个模块,前提是这个模块允许被导入。这个模块如果被允许导入,他会有export这个特定的导出语法标记的。
我看你Vue组件里面使用了Watch,能给我讲解一下Watch的作用吗?
watch:侦听器,是Vue实例的一个属性,是用来响应数据的变化,需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
基本的用法
watch: { 被监听的数据: { handler(数据改变后的值, 数据改变之前的值) { 相关代码逻辑... } } }
被监听的数据:data中定义的数据;
数据改变后的值:该数据改变后的新值;
数据改变之前的值:该数据改变之前的值。
答辩场景回答 在项目中,比如有购物车的时候,比如你的购物车明细发生了改变,你需要重新计算总金额,这个时候你可以使用watch来进行操作,只要购物车发生了改变,我们就直接重新计算一次购物车总金额,所以watch作用就是监听Vue中data数据发生了改变触发的函数。
我看你项目使用了Vue,你能给我说一下如何引用其他组件的吗?
在Vue.js中,可以使用import语句来导入一个组件,然后在需要的地方使用标签引用该组件。具体步骤如下:
首先,在需要导入的组件所在的文件中,使用export default语句导出该组件,例如:
// MyComponent.vue export default { name: 'MyComponent', data() { return { // ... }; }, methods: { // ... }, // ... };
然后,在需要引用该组件的文件中,使用import语句导入该组件,并在模板中使用标签引用该组件,例如:
import MyComponent from './MyComponent.vue'; export default { components: { MyComponent, }, template: ` `, };
需要注意的是,在使用import语句时,应该确保组件已经被完全渲染出来,否则可能会出现错误。因此,最好在mounted()钩子函数中使用import语句。
答辩场景回答 在Vue项目中,时时刻刻都在使用组件,在使用之前我们需要先import我们需要使用的组件,然后在components对象中声明这个组件,然后可以在templete中进行使用组件
你使用的是Vue是吧,说一下Vue组件里面的一些常见方法和用途
//导入一些其他的东西 import { mapGetters } from 'vuex' //导出该组件 export default { name: '组件名称', data:{ name:"我是字母" }, filters:{ //编写一些过滤器 }, computed:{ //编写一些特定计算 比如在金额需要保留二位小数的时候,默认给他处理 }, components:{ //我引入的一些组件 }, watch:{ "name":function(n,o){ console.log("data中的name发生了改变会触发该时间") } }, mounted(){ console.log("组件被挂载到body上的时候"); }, destroyed(){ console.log("组件被销毁的时候") }, methods:{ //编写一些组件的自定义方法 } }
答辩场景回答 在Vue项目中,使用最多的就是data,这个data会关系到页面数据的渲染,然后就是componets,当我们需要使用其他组件的时候,可以先通过import导入组件然后再compontents声明,就可以使用了。然后还有mounted这个方法,大部分我们一进入的时候就需要去后端获取数据,这个mounted就是最好获取数据的地方,然后有一些特定的方法,我们就可以写到methods中
我看你项目使用了Vuex,你能说说Vuex是干嘛的吗?
Vuex 是 Vue.js 应用程序的状态管理库。它提供了一个集中式存储来管理应用程序的所有组件的状态,使得组件之间的状态共享变得更加简单和易于维护。
在传统的 Vue.js 应用程序中,每个组件都有自己的状态,当多个组件需要共享状态时,通常需要通过父组件向下传递状态,或者使用事件总线等方式来实现。这种方式会导致代码的耦合度较高,难以维护。
而 Vuex 则提供了一种集中式的状态管理方式,所有的组件都可以通过 Vuex 来访问和修改共享的状态。同时,Vuex 还提供了一些辅助函数,例如 getters、mutations、actions 等,使得状态的管理更加方便和灵活。
总之,Vuex 可以帮助开发者更好地管理 Vue.js 应用程序的状态,提高代码的可维护性和可扩展性。
答辩场景回答 说简单一点就是一个集中式的js变量,各个页面如果需要获取一些公共的变量,方法,直接可以从store中获取,这样就避免了js随便乱定义导致系统不好维护的情况。
请问一下你后端使用的是什么语言和框架
语言是Java
框架是SpringBoot
答辩场景回答 语言是Java框架是SpringBoot
请问一下后端操作数据库的框架使用的是什么呢
mybatis-plus
MyBatis-Plus是MyBatis的增强工具,只做增强不做改变,为简化开发、提高效率而生。以下是使用MyBatis-Plus的一些主要优点:
依赖少:仅仅依赖Mybatis以及Mybatis-Spring,减少项目依赖,降低管理复杂度。
损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作。
预防Sql注入:内置Sql注入剥离器,有效预防Sql注入攻击,增强了系统的安全性。
通用CRUD操作:内置通用Mapper、通用Service,仅需少量配置即可实现单表大部分CRUD操作,降低了开发难度和提高了开发效率。
多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可以自由配置,解决了主键问题。
强大的条件构造器:满足各类使用需求,提供了丰富的查询方式。
支持多种数据库:任何能使用MyBatis进行CRUD,并且支持标准SQL的数据库。
综上,MyBatis-Plus通过其丰富的功能和良好的安全性,能够极大地提高开发效率和系统的安全性,从而受到开发者的青睐。
答辩场景回答 使用的是mybatis,因为mybatis操作数据库比较方便
请问一下后端是如何配置数据库链接的呢?位置在哪里?
在application.properties或application.yml文件中配置数据源信息:
# application.properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
答辩场景回答 我们项目配置的地方在application.properties这个文件中,然后配置数据库的地址、端口、数据库名称等信息。每次mybatis操作的时候会读取改配置的数据库链接信息。
你说你项目使用了一些插件,请问一下你是如何引用插件的呢?
在Spring Boot项目中,可以通过在项目的pom.xml文件中添加插件依赖来引入其他插件。以下是引入插件的步骤:
打开项目的pom.xml文件。
在标签内添加插件依赖。例如,如果要引入Maven的编译插件,可以添加以下代码:
org.apache.maven.plugins maven-compiler-plugin 3.8.1
保存pom.xml文件。
在命令行中运行mvn clean install命令,Maven会自动下载并安装插件。
答辩场景回答 我们项目是使用maven来管理这些库和插件的,在pom.xml里面依赖了很多的插件声明,只要声明你要使用的插件,然后更新maven就会导入该插件,然后正常使用就好了!
为什么使用mysql数据库
MySQL数据库被广泛使用,主要有以下几个原因:
运行速度快:MySQL数据库的运行速度相对较快。
价格适中:对于个人和中小型企业来说,MySQL是免费的。
容易使用:相对于其他大型数据库系统,MySQL的配置和管理过程更加简单,易于学习和使用。
可移植性强:MySQL能够适应多种操作系统平台,如Windows、Linux、Unix、MacOS等。
丰富的功能和工具:MySQL提供了诸多实用的功能和工具,例如事务处理、索引优化、备份恢复等,可以便捷地管理和维护数据库。
广泛应用:许多大型互联网网站,包括BAT门户、电商网站等都在使用MySQL作为后端数据库存储。
因此,无论是从性能、易用性、可移植性还是应用范围来看,MySQL都是一个非常不错的选择。
答辩场景回答 我们项目之所以选择mysql主要原因是使用广泛、并且sql语法非常规范通俗易懂,并且mysql目前是开源的,能够减少一大笔费用的开支,除此之外mysql在性能、安全、跨平台等方面都具有非常大的优势
说一下表设计里面为啥都有一个CreatorId和CreationTime
官方解释
在数据库设计中,CreatorId和CreationTime常常被添加至表中以便于追踪和管理数据。CreatorId字段作为创建者的唯一标识符,可以帮助我们准确地知道每一条记录是由哪个用户或者程序创建的。而CreationTime字段则用来记录每一次操作或事务的具体发生时间。
这两个字段在许多场景下都十分重要。例如,当我们需要查询某段时间内创建的数据或者对特定用户创建的数据进行筛选时,CreatorId和CreationTime就能发挥出它们的作用。同时,通过比较CreationTime和UpdateTime字段,我们可以追踪到数据的历史变更情况,从而对于数据的完整性和准确性有更深入的理解。
答辩场景回答 在系统表设计的过程中,通常我们是需要记录每一条数据的创建时间和创建人,通过这2个字段我们可以很容易知道这条记录是哪个用户创建的,什么时间创建的,并且还可以通过这个创建人来过滤只让用户看自己的数据。
说一下springboot声明的数据库实体放在哪里
答辩场景回答 数据库的每一个表都对应了一个Model(模型),并且这个模型上有很多标注,比如@TableName(‘表名称’)就是标注数据库的表名称叫啥,@TableField(“列名字”)则表标注数据库列的字段叫啥名字,都是一一对应起来的。
说一下什么是接口 我们系统有没有接口呢
接口在计算机领域中是一个非常重要的概念,尤其在后端设计中。它主要是指一套由后端设计并供给第三方(如前端)使用的方法
答辩场景回答 在程序设计中,我们经常说的前端和后端联调接口,这个接口就是指的就是这个控制器(controller) ,控制器他主要是就springboot暴露给前端的一个访问方式,在控制器里面经常会有RequestMapping这个字段,这个字段代表的是前端访问的路径,根据这个路径就可以匹配到这个路由
说说系统使用了哪些算法(MD5)
MD5,全称为Message-Digest Algorithm 5,是一种广泛使用的密码散列函数,可以生成一个128位(16字节)的散列值(hash value),用于确保信息传输的完整性和一致性。此算法由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年发布。
MD5算法的主要特点包括:压缩性,即任意长度的数据通过MD5算法算出的散列值长度都是固定的;不可逆性,即无法通过散列值反推出原始数据;对于不同的输入数据,其MD5散列值肯定是不同的。然而,尽管如此,MD5算法也存在一些缺点,例如它可能存在碰撞现象,即不同的输入可能会产生出相同的散列值。这使得MD5算法在密码学领域受到了一些质疑。
答辩场景回答 在程序设计中,为了防止密码被盗用,一般系统都会使用MD5进行密码加密,也称加盐操作,通过MD5加密的密码没有办法通过数据库来获取用户的密码,必须用户本人进行密码输入然后通过MD5加密的结果去数据库匹配,如果匹配到了则代表用户密码输入正确。
说说系统使用了哪些算法(协同过滤算法)
协同过滤算法是一种推荐算法,主要功能是预测和推荐。它通过对用户历史行为数据的挖掘发现用户的偏好,然后基于不同的偏好对用户进行群组划分并推荐品味相似的商品。
协同过滤算法主要分为两种:基于用户的协同过滤算法(User-Based)和基于物品的协同过滤算法(Item-Based)。
基于用户的协同过滤算法实现过程主要包括:首先,计算物品之间的相似度;然后,根据用户的历史行为数据,计算用户之间的相似度;最后,通过用户之间的相似度和物品之间的相似度来预测用户对物品的评分或偏好。
而基于物品的协同过滤算法则实现过程包括:首先,构建用户与物品的关系倒排;然后,构建物品与物品的共现矩阵;接着,计算物品之间的相似度,即计算相似矩阵;最后,根据用户的历史记录,给用户推荐物品。
答辩场景回答 在系统中,由于有一些推荐的逻辑,为了能够更好的推荐相关的内容给用户,这个使用我们使用了协同过滤算法来进行推荐,推荐的逻辑就是寻找用户和用户之间的相似度,相似度越高的用户他们喜欢的东西相同,就可以推荐相关的东西给这些用户,当然建立这些关系可以是一些资讯、购物、点赞、阅读记录等等。
说说系统使用了哪些算法(HMAC算法)每个系统都用了
HMAC算法是一种基于密钥的报文完整性的验证方法,其安全性是建立在Hash加密算法基础上的。HMAC算法的实现原理可以分为三个主要步骤:
选择Hash函数:HMAC采用一个固定的Hash函数,如SHA-256、MD5等。Hash函数将任意长度的输入数据转化为固定长度的输出,具有良好的单向性和抗碰撞性。
**预处理:**将消息分成若干块,并对每一块进行填充和分组操作。填充的目的是为了保证消息长度满足Hash函数的要求,分组则是为了方便后续计算。
**计算认证码:**将填充后的消息块与密钥依次经过Hash函数计算,得到认证码。最后,将所有认证码拼接在一起,形成完整的HMAC值。
此外,值得一提的是,HMAC可以与MD5和SHA-1等散列函数结合使用,分别被称为HMAC-MD5,HMAC-SHA1。在实际应用中,HMAC广泛应用于数据完整性验证等场景。
答辩场景回答 因为系统使用了JWT进行Token的生成,token是令牌的意思,每一个token都能代表某个用户,根据SHA-256等算法来生成一个不可逆的字符串,这个字符串是不可以逆向获取他的信息的,但是在进行系统可以通过填充其中的密钥来验证这个数据是否是本系统生成的,如果是则代表他token有效。其中SHA-256就是一种加密算法,并且不可以逆向破解。
说说系统中使用了哪些算法(Ant路径匹配算法)每个系统都用了
SpringBoot路由匹配主要使用的是Ant风格的路径匹配算法,该算法是由Spring框架实现的,具体为org.springframework.util.AntPathMatcher。此外,当涉及到微服务间的请求路由时,如使用Spring Cloud Gateway,它采用的是基于表达式的路由算法。这种算法会根据请求的URL、请求的方法、请求的头部信息等来匹配路由规则,并将请求转发给相应的微服务。具体的实现方式是通过SpEL(Spring Expression Language,Spring表达式语言)来完成。
答辩场景回答 在系统设计中,我们主要关心的就是接口,但是请求的URL如何进入到我们的控制器具体的方法,在这个过程中就使用了Ant路径匹配算法,它能够把代码所有控制器和方法逆向成路由字典,然后根据用户网址URL来匹配具体的控制器和方法,最终去执行这个控制器的方法。
还没有评论,来说两句吧...