带你快速制作一个java八股文自测宝典,同时带你快速上手Mybatis-plus以及axios + redis

        相比大家在日常生活中对八股文很是抓狂吧?更希望可以自测一下自己的技术能力,本文带你做一个简单的八股文自测宝典

技术选型: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;
    }

以上就是本次文章的所有内容,我会把源码以及数据库发给大家!大佬勿喷!!!!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值