相比大家在日常生活中对八股文很是抓狂吧?更希望可以自测一下自己的技术能力,本文带你做一个简单的八股文自测宝典
技术选型:springboot + mybatis-plus + vue + thymeleaf + axios + 原生js + redis + mysql
看着很大杂烩吧!!!带你用各方面的技术融合起来做一个小dem
demo图片
这个demo看似不难但也并非很简单!!也需要考虑一些东西,首先第一要考虑随机出的面试题不能重复出现,这里我用的是洗牌算法!我们看下面代码
// 生成1-19之间的随机数数组
var arr = [];
for (var i = 1; i <= 19; i++) {
arr.push(i);
}
// 打乱数组顺序(洗牌算法)
for (var i = 0; i < arr.length; i++) {
var j = Math.floor(Math.random() * (i + 1));
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 输出前10个随机数
for (var i = 0; i < 10; i++) {
console.log(arr[i]);
}
我们看效果图!
实现了上面的功能那我们就可以在数组里存放面试题啦!!!但是上面的代码一执行直接把所有的随机数都展示出来了,这显然不行,那我们就要让他点一下按钮出现一个随机
<!-- html代码 -->
<button id="btn">点击生成随机数</button>
<p id="result"></p>
<!-- javascript代码 -->
var arr = [];
for (var i = 1; i <= 19; i++) {
arr.push(i);
}
shuffle(arr); // 洗牌
var result = document.getElementById('result');
var btn = document.getElementById('btn');
var index = 0;
btn.addEventListener('click', function() {
if (index >= arr.length) {
result.textContent = "随机数已经全部生成完毕!";
btn.disabled = true;
return;
}
result.textContent = arr[index];
index++;
});
function shuffle(arr) {
for (var i = 0; i < arr.length; i++) {
var j = Math.floor(Math.random() * (i + 1));
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
效果图
了解了这个我们就可以自己来实现自测的小demo,
如果要是把面试题全都存放到前端显然不合适,这里我用到的是mysql,后端用的是java
首先第一步我们要创建一个springBoot的工程,然后pom.xml里填入依赖
<dependencies>
<!-- 视图模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatisPlus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
下面是工程的结构
yml配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/examination?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: root
thymeleaf:
cache: false
encoding: UTF-8
mode: HTML
prefix: classpath:/templates/
suffix: .html
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.lession.pojo
server:
port: 8080
tomcat:
uri-encoding: UTF-8
max-http-header-size: 8096
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: auto
table-id-underline: true
field-strategy: not_null
refresh: true
logic-delete-value: -1
logic-not-delete-value: 1
key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator #默认key生成类
meta-object-handler: com.baomidou.mybatisplus.extension.handlers.MybatisMapWrapperFactory #默认的对象字段填充控制器
configuration:
map-underscore-to-camel-case: true
实体类我就不展示了!直接看数据访问层
@Repository
public interface QuestionsMapper extends BaseMapper<Questions> {
}
这里我们看到直接继承了BaseMapper<>
BaseMapper是mybatis-plus自带的一个封装接口,封装了CRUD的方法
mybatis-plus是myBatis的增强版,在mybatis的基础上只做增强不做改变!!
Questions: 是我们的实体类
业务逻辑层同理
public interface QuestionsService extends IService<Questions> {
}
我们看一下service层的实现类
@Service
public class QuestionsServiceImpl extends ServiceImpl<QuestionsMapper, Questions> implements QuestionsService {
}
下面我们就要看看前后端是如何交互的!!
首先前端要有一个这样的代码
/**
* 异步请求获取题目
*/
console.log(type)
axios.get('/questions/list', {
params: {
'type' : type
}
}).then(res => {
for(let i = 0; i < res.data.length; i++) {
arr[i] = res.data[i].title
}
shuffle(arr); // 洗牌
});
这里我们用到的是axios
表现层的代码
/**
* 查询所有题目
* @return
*/
@ResponseBody
@RequestMapping("/list")
public Object questionsList(Integer type) {
List<Questions> list = null;
if(type != null) {
LambdaQueryWrapper<Questions> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Questions::getType, type);
list = questionsService.list(queryWrapper);
}else {
list = questionsService.list();
}
return list;
}
那如何实现的呢?
首先前端有一个axios.get()的请求,里面有一个url:'/questions/list'地址
axios.get('/questions/list') 这行代码我们足以向后台发送请求了,但是如何接收呢?那就用到了回调函数
axios.get().then(res => {这段代码就可以拿到后台的return返回的值了
console.log(res.data)
})
我的axios.get('','这里我加了一个{params:{}}'); {params:{}}:如果想给后台提交参数采用这个
如果是get请求: params:{}
如果是post请求: data:{}
表现层:controller
看不懂条件构造器我们完全可以简单写成这样大家就理解了
/** * 查询所有题目 * @return */ @ResponseBody @RequestMapping("/list") public Object questionsList(Integer type) { List<Questions> list = questionsService.list(); return list; }
下面这行代码我们可以理解为:select * from questions where type = #{type}
LambdaQueryWrapper<Questions> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Questions::getType, type);
代码基本全写完了,很简单吧!但是会出现一个小问题,虽然不影响执行吧,但是我们发现
如果数据库的数据较多,我们每次刷新都会执行数据库,那显然不合理,那我们就需要使用redis缓存来处理了
首先我们要有一个配置类:JedisConfig
public class JedisConfig {
//Redis服务器IP
private static String ADDR = "127.0.0.1";
//Redis的端口号
private static int PORT = 6379;
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_ACTIVE = 10000;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 10000;
private static int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE); //整个池最大值
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 释放jedis资源
* @param jedis
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
接下来我们改一下控制层的代码
/**
* 查询所有题目
* @return
*/
@ResponseBody
@RequestMapping("/list")
public Object questionsList(Integer type) {
List<Questions> list = new ArrayList<>();
Jedis jedis = JedisConfig.getJedis();
if(jedis.exists("list")) {
// 从缓存中查询
list = JSON.parseArray(jedis.get("list"),Questions.class);
}else {
// 从数据库中查询
list = questionsService.list();
// 缓存没有数据,把数据存储在缓存中
String jsonObject = JSONObject.toJSONString(list);
jedis.set("list", jsonObject);
JedisConfig.returnResource(jedis);
}
return list;
}
以上就是本次文章的所有内容,我会把源码以及数据库发给大家!大佬勿喷!!!!!!!!