js jquery写一个画板 实现撤回、清空、换色的功能

画布的canvas画板的大小就是这个画板图片的大小

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, user-scalable=no,initial-scale=1.0, maximum-scale=1.0, mininum-scale=1.0"
    />
    <link rel="stylesheet" href="../css/common.css" />
    <link rel="stylesheet" href="../css/animate.min.css" />
    <title>page4</title>
  </head>
  <body>
    <style>
      body {
        margin: 0;
        padding: 0;
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
      }
      #box {
        position: relative;
        width: calc(100vh * 16 / 9);
        height: 100vh;
        max-height: 100%;
        /* background-color: #ccc; */
        display: flex;
        justify-content: center;
        align-items: center;
        text-align: center;
        font-size: 24px;
        background: url("../images/page4Bg.png");
        background-size: contain;
      }
      .btn {
        transition: transform 0.1s;
      }
      .btn:hover {
        transform: scale(1.1);
      }
      img {
        position: absolute;
        /* cursor: pointer; */
      }
      .hei {
        position: fixed;
        z-index: 999;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: rgb(0, 0, 0);
      }
      .color_btn_selected {
        border: 2px solid blueviolet;
        box-sizing: border-box;
        border-radius: 50%;
      }
    </style>
    <!-- 黑幕 -->
    <div class="hei"></div>
    <div id="box">
      <!-- 返回 -->
      <img
        onclick="ret()"
        class="btn"
        style="width: 4.5%; top: 3%; left: 3%;cursor: pointer;"
        src="../images/fanhui@2x.png"
        alt=""
      />
      <!-- 重玩 -->
      <img
        id="clear_btn"
        class="op_btn btn chongwan"
        style="width: 9.5%; bottom: 3%; right: 38.5%;cursor: pointer;"
        src="../images/cwBtn.png "
        alt=""
      />
      <!-- 语音 -->
      <img
        class="btn yuyin"
        onclick="playMp3()"
        style="width: 9.5%; bottom: 3%; right: 28%;cursor: pointer;"
        src="../images/yuyin@2x.png"
        alt=""
      />
      <!-- 上一页 -->
      <img
        class="btn shangyiye"
        onclick="pre()"
        style="width: 12%; bottom: 3%; right: 15%;cursor: pointer;"
        src="../images/syy.png"
        alt=""
      />
      <!-- 下一页 -->
      <img
        class="btn xiayiye"
        onclick="next()"
        style="width: 12%; bottom: 3%; right: 2%;cursor: pointer;"
        src="../images/nextPage.png"
        alt=""
      />
      <!-- 背景 -->
      <img
        style="width: 80%; top: 50%; left: 50%;transform: translate(-50%,-55%);"
        src="../images/hb_bg.png"
        alt=""
      />
      <!-- 画板 -->
      <img
        class="hb"
        style="width: 32%;
        top: 28%;
        left: 18%;"
        src="../images/hb_img.png"
        alt=""
      />
      <!-- 撤销 -->
      <img
        id="cx_btn"
        class="op_btn btn"
        style="width: 9%;
        top: 68%;
        left: 41%;cursor: pointer;"
        src="../images/hb_cx.png"
        alt=""
      />
      <!-- 颜色 -->
      <img
        id="black_btn"
        class="color_btn color_btn_selected"
        itemColor="#000000"
        style="width: 2.5%;
        top: 68.6%;
        left: 18%;cursor: pointer;"
        src="../images/hb_hei.png"
        alt=""
      />
      <img
        id="red_btn"
        class="color_btn"
        itemColor="#ff5656"
        style="width: 2.5%;
                top: 68.6%;
                left: 21.7%;cursor: pointer;"
        src="../images/hb_red.png"
        alt=""
      />
      <img
        id="yellow_btn"
        class="color_btn"
        itemColor="#ffbe21"
        style="width: 2.5%;
              top: 68.6%;
              left: 25.4%;cursor: pointer;"
        src="../images/hb_h.png"
        alt=""
      />
      <img
        id="green_btn"
        class="color_btn"
        itemColor="#6ad226"
        style="width: 2.5%;
              top: 68.6%;
              left: 29.1%;cursor: pointer;"
        src="../images/hb_lv.png"
        alt=""
      />
      <img
        id="blue_btn"
        class="color_btn"
        itemColor="#5da1ff"
        style="width: 2.5%;
               top: 68.6%;
               left: 32.8%;cursor: pointer;"
        src="../images/hb_l.png"
        alt=""
      />
      <img
        id="purple_btn"
        class="color_btn"
        itemColor="#e56dff"
        style="width: 2.5%;
        top: 68.6%;
        left: 36.5%;cursor: pointer;"
        src="../images/hb_z.png"
        alt=""
      />
      <canvas
        id="canvas"
        style="position: absolute;
        z-index: 999;
        top: 28%;
        left: 18%;
        /* border: 1px solid red; */
        border-radius: 25px;
        width: 377px;
        height: 252px;"
      ></canvas>
    </div>
    <script src="../js/jquery-1.12.3.js"></script>
    <!-- <script type="text/javascript" src="../js/handingWrite.js"></script> -->
    <script>
      function resizeBox() {
        var box = document.getElementById("box");
        var width = window.innerWidth; // 获取窗口宽度
        var height = window.innerHeight; // 获取窗口高度
        // 计算盒子的高度
        var boxHeight = Math.min(height, (width / 16) * 9); // 高度最多为100%
        // 设置盒子的样式
        box.style.height = boxHeight + "px";
      }
      // 初始化时调整盒子大小
      resizeBox();
      // 监听窗口大小改变事件
      window.addEventListener("resize", function () {
        resizeBox();
      });
    </script>
    <script>
      function pre() {
        new Audio("../mp3/pages.mp3").play();
        $(".hei").fadeIn(500); // 2000毫秒为过渡效果持续时间
        setTimeout(() => {
          window.location.href = "./page3.html";
        }, 500);
      }
    </script>
    <script>
      var playing = false;
      var audio = null;
      function playMp3() {
        if (playing) {
          return; // 如果正在播放,不执行后续操作
        }
        playing = true; // 设置为正在播放状态
        if (audio) {
          audio.pause(); // 停止当前音频的播放
        }
        audio = new Audio("../mp3/P4-1.mp3");
        audio.addEventListener("ended", function () {
          playing = false; // 播放结束后设置为非播放状态
        });
        audio.play();
      }
    </script>
    <!-- 设置页面所欲图片禁止拖拽 -->
    <script>
      var images = document.querySelectorAll("img"); // 获取所有图片元素
      for (var i = 0; i < images.length; i++) {
        images[i].draggable = false; // 将draggable属性设置为false
      }
    </script>
    <script>
      // 语音按钮
      const imgElement = document.querySelector(".btn.yuyin");
      imgElement.addEventListener("mousedown", function (event) {
        // 更改图片元素的src属性
        imgElement.src = "../images/axyy.png";
      });
      imgElement.addEventListener("mouseup", function (event) {
        imgElement.src = "../images/yuyin@2x.png";
      });
      imgElement.addEventListener("mouseleave", function (event) {
        imgElement.src = "../images/yuyin@2x.png";
      });

      // 上一页按钮
      const imgElement2 = document.querySelector(".btn.shangyiye");
      imgElement2.addEventListener("mousedown", function (event) {
        // 更改图片元素的src属性
        imgElement2.src = "../images/As.png";
      });
      imgElement2.addEventListener("mouseup", function (event) {
        imgElement2.src = "../images/syy.png";
      });
      imgElement2.addEventListener("mouseleave", function (event) {
        imgElement2.src = "../images/syy.png";
      });

      // 下一页按钮
      const imgElement3 = document.querySelector(".btn.xiayiye");
      imgElement3.addEventListener("mousedown", function (event) {
        // 更改图片元素的src属性
        imgElement3.src = "../images/Ax.png";
      });
      imgElement3.addEventListener("mouseup", function (event) {
        imgElement3.src = "../images/nextPage.png";
      });
      imgElement3.addEventListener("mouseleave", function (event) {
        imgElement3.src = "../images/nextPage.png";
      });

      // 重玩按钮
      const imgElement4 = document.querySelector('.btn.chongwan');
      imgElement4.addEventListener('mousedown', function(event) {
        // 更改图片元素的src属性
        imgElement4.src = '../images/axcw.png';
      });
      imgElement4.addEventListener('mouseup', function(event) {
        imgElement4.src = '../images/cwBtn.png';
      });
      imgElement3.addEventListener('mouseleave', function(event) {
        imgElement4.src = '../images/cwBtn.png';
      });

      $("#clear_btn").mousedown(function (event) {
        // 更改图片元素的src属性
        $(this).attr("src", "../images/axcw.png");
      });

      $("#clear_btn").mouseup(function (event) {
        $(this).attr("src", "../images/cwBtn.png");
      });

      $("#clear_btn").mouseleave(function (event) {
        $(this).attr("src", "../images/cwBtn.png");
      });
    </script>
    <script>
      // 在页面加载完成后执行
      $(document).ready(function () {
        // 设置一个延时,以便看到渐变过渡效果
        setTimeout(function () {
          $(".hei").fadeOut(500, function () {
            // 渐变过渡结束后隐藏盒子
            $(this).hide();
          });
        }, 0);
      });
    </script>
    <script>
      function next() {
        new Audio("../mp3/pages.mp3").play();
        $(".hei").fadeIn(500); // 2000毫秒为过渡效果持续时间
        setTimeout(() => {
          window.location.href = "./page5.html";
        }, 500);
      }
    </script>
    <!-- 返回列表 -->
    <script>
      function ret() {
        $(".hei").fadeIn(500); // 2000毫秒为过渡效果持续时间
        setTimeout(() => {
          window.location.href = "../../../../../page2.html";
        }, 500);
      }
    </script>
    <!-- 画板 -->
    <script>
      var canvas = document.getElementById("canvas");
      var canvasWidth = document.querySelector(".hb").offsetWidth;
      var canvasHeight = document.querySelector(".hb").offsetHeight;
      var cxt = canvas.getContext("2d");
      canvas.width = canvasWidth;
      canvas.height = canvasHeight;
      $("#canvas").css("width", canvasWidth + "px")
      $("#canvas").css("height", canvasHeight + "px")
      var isMouseDown = false;
      var lastLoc = { x: 0, y: 0 }; //起笔坐标
      var lastTime = 0; //用于计算时间
      var lastLineWidth = -1;
      var lineColor = "#000000";
      paths = []; // 存储绘制的路径
      colors = []; // 存储绘制的颜色
      drawGrid(cxt);
      // 鼠标按下
      function beginStroke(point) {
      	isMouseDown = true;
      	lastLoc = windowToCanvas(point.x, point.y);
      	lastTime = new Date().getTime();
      	paths.push([]); // 创建新的路径数组
      	paths[paths.length - 1].push(lastLoc); // 将起点坐标加入当前路径
      	colors.push(lineColor); // 存储绘制的颜色
      }
      // 鼠标结束
      function endStroke() {
        console.log("color",lineColor);
      	isMouseDown = false;
      }
      // 鼠标移动
      function moveStroke(point) {
      	var curLoc = windowToCanvas(point.x, point.y);
      	var curTime = new Date().getTime();
      	var s = calcDistance(curLoc, lastLoc); // 获取笔锋经过的距离
      	var t = curTime - lastTime; // 获取笔锋经过的时间 ,用于计算行笔速度,赋值不同的宽度
      	var lineWidth = calcLineWidth(t, s);
      	cxt.beginPath();
      	cxt.moveTo(lastLoc.x, lastLoc.y);
      	cxt.lineTo(curLoc.x, curLoc.y);
      	cxt.strokeStyle = lineColor;
      	cxt.lineWidth = lineWidth;
      	cxt.lineCap = "round";
      	cxt.lineJoin = "round";
      	cxt.stroke();
      	cxt.closePath();
      	lastLoc = curLoc;
      	lastTime = curTime;
      	lastLineWidth = lineWidth;
      	paths[paths.length - 1].push(curLoc); // 将当前点加入当前路径
      }
      canvas.onmousedown = function (e) {
      	e.preventDefault();
      	beginStroke({ x: e.clientX, y: e.clientY });
      };
      canvas.onmouseup = function (e) {
      	endStroke();
      	e.preventDefault();
      };
      canvas.onmouseout = function (e) {
      	endStroke();
      	e.preventDefault();
      };
      canvas.onmousemove = function (e) {
      	e.preventDefault();
      	if (isMouseDown) {
      		moveStroke({ x: e.clientX, y: e.clientY });
      	}
      };
      // 触屏事件
      canvas.addEventListener("touchstart", function (e) {
      	e.preventDefault();
      	var touch = e.touches[0];
      	beginStroke({ x: touch.pageX, y: touch.pageY });
      });
      canvas.addEventListener("touchmove", function (e) {
      	e.preventDefault();
      	if (isMouseDown) {
      		var touch = e.touches[0];
      		moveStroke({ x: touch.pageX, y: touch.pageY });
      	}
      });
      canvas.addEventListener("touchend", function (e) {
      	e.preventDefault();
      	endStroke();
      });
      // }
      var maxLineWidth = 10;
      var minLineWidth = 10;
      var maxStrokeV = 10;
      var minStrokeV = 0.1;
      function calcLineWidth(t, s) {
      	// 计算运笔速度和时间,获取不同得到宽度
      	var resultLineWidth = 0;
      	var v = s / t;
      	if (v <= minStrokeV) {
      		resultLineWidth = maxLineWidth;
      	} else if (v >= maxStrokeV) {
      		resultLineWidth = minLineWidth;
      	} else {
      		resultLineWidth =
      			maxLineWidth -
      			((v - minStrokeV) / (maxStrokeV - minStrokeV)) *
      			(maxLineWidth - minLineWidth);
      	}
      	if ((lastLineWidth == -1)) {
      		return resultLineWidth;
      	}
      	return (lastLineWidth * 2) / 3 + (resultLineWidth * 1) / 3;
      }
      function calcDistance(loc1, loc2) {
      	return Math.sqrt(
      		(loc1.x - loc2.x) * (loc1.x - loc2.x) +
      		(loc1.y - loc2.y) * (loc1.y - loc2.y)
      	);
      }
      function windowToCanvas(x, y) {
      	var box = canvas.getBoundingClientRect();
      	return { x: x - box.left, y: y - box.top };
      }
      function drawGrid(cxt) {
      	cxt.save();
      	cxt.beginPath();
      	// cxt.moveTo(3, 3);
      	// cxt.lineTo(canvas.width - 3, 3);
      	// cxt.lineTo(canvas.width - 3, canvas.height - 3);
      	// cxt.lineTo(3, canvas.height - 3);
      	// cxt.lineTo(3, 3);
      	// cxt.lineWidth = 6;
      	// cxt.strokeStyle = "red";
      	// cxt.closePath();
      	// cxt.stroke();
      	// cxt.restore();
      	// cxt.save();
      	// cxt.beginPath();
      	// cxt.moveTo(3, 3);
      	// cxt.lineTo(canvas.width, canvas.height);
      	// cxt.moveTo(canvas.width, 3);
      	// cxt.lineTo(3, canvas.height);
      	// cxt.moveTo(canvas.width / 2, 3);
      	// cxt.lineTo(canvas.width / 2, canvas.height);
      	// cxt.moveTo(3, canvas.height / 2);
      	// cxt.lineTo(canvas.width, canvas.height / 2);
      	// cxt.strokeStyle = "red";
      	cxt.lineWidth = 1;
      	cxt.stroke();
      	cxt.closePath();
      	cxt.restore();
      }
      // 撤回
      $("#cx_btn").click(function (e) {
      	if (paths.length > 0) {
      		paths.pop(); // 删除最后一个路径
      		colors.pop(); // 删除最后一个颜色
      		cxt.clearRect(0, 0, canvas.width, canvas.height);
      		drawGrid(cxt);
      		// 重新绘制剩余的路径
      		for (var i = 0; i < paths.length; i++) {
      			var path = paths[i];
      			for (var j = 0; j < path.length - 1; j++) {
      				cxt.beginPath();
      				cxt.moveTo(path[j].x, path[j].y);
      				cxt.lineTo(path[j + 1].x, path[j + 1].y);
      				cxt.strokeStyle = colors[i];
      				cxt.lineWidth = lastLineWidth;
      				cxt.lineCap = "round";
      				cxt.lineJoin = "round";
      				cxt.stroke();
      				cxt.closePath();
      			}
      		}
      	}
      });
      // 清除
      $("#clear_btn").click(function (e) {
        paths = []; // 清空绘制的路径
        colors = []; // 清空绘制的颜色
      	cxt.clearRect(0, 0, canvas.width, canvas.height);
      	drawGrid(cxt);
      })
      // 换颜色
      $(".color_btn").click(function () {
      	if (!$(this).hasClass("color_btn_selected")) {
      		$(this).addClass("color_btn_selected").siblings().removeClass("color_btn_selected");
      	}
      	lineColor = $(this).attr("itemColor");
      })
    </script>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/72070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)

前言&#xff1a; 在前面一篇文章云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初始安装&#xff08;一&#xff09;_华为cna_晚风_END的博客-CSDN博客 介绍了基于VMware虚拟机里嵌套部署华为云的云计算&#xff0c;不过仅仅是做到了在VRM的web界面添加计算节点…

云安全攻防(八)之 Docker Remote API 未授权访问逃逸

Docker Remote API 未授权访问逃逸 基础知识 Docker Remote API 是一个取代远程命令行界面&#xff08;rcli&#xff09;的REST API&#xff0c;其默认绑定2375端口&#xff0c;如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以…

Spring Boot集成Mybatis Plus通过Pagehelper实现分页查询

文章目录 0 简要说明Pagehelper1 搭建环境1.1 项目目录1.2 项目搭建需要的依赖1.3 配置分页插件拦截器1.4 源代码启动类实体类数据层xml映射文件业务层业务层实现类控制层接口配置swagger请求体 2 可能出现的疑问或者问题2.1 关于total属性疑问2.2 分页不生效问题 3 案例说明3.…

数据库技术--数据库引擎,数据访问接口及其关系详解(附加形象的比喻)

目录 背景数据库引擎Jet数据库&#xff1a;ISAM&#xff1a;ODBC&#xff08;Open Database Connectivity&#xff09;&#xff1a; 数据访问接口ADO&#xff08;ActiveX Data Objects&#xff09;DAO&#xff08;Data Access Objects&#xff09;RDO&#xff08;Remote Data O…

【C语言】操作符详解

目录 一、算数操作符 二、移位操作符 1.左移操作符 2.右移操作符 (1) 逻辑右移 (2) 算术右移 (3)小总结 三、位操作符 四、赋值操作符 五、单目操作符 六、关系操作符 七、逻辑操作符 八、 条件操作符 九、逗号表达式 十、下标引用、函数调用和结构成员 1. [ ]下…

第一百二十八天学习记录:数据结构与算法基础:栈和队列(上)(王卓教学视频)

栈和队列的定义和特点 1、栈和队列是两种常用的、重要的数据结构 2、栈和队列是限定插入和删除只能在表的“端点”进行的线性表 线性表可以在任意一个位置插入和删除&#xff0c;栈只能在最后位置插入和删除 队列 只能删除第一个元素 栈和队列是线性表的子集&#xf…

LeetCode面向运气之Javascript—第27题-移除元素-98.93%

LeetCode第27题-移除元素 题目要求 一个数组nums和一个值val&#xff0c;你需要原地移除所有数值等于val的元素&#xff0c;并返回移除后数组的新长度 举例 输入&#xff1a;nums [3,2,2,3], val 3 输出&#xff1a;2, nums [2,2] 输入&#xff1a;nums [0,1,2,2,3,0,4,2…

Mac思维导图软件Xmind for Mac中文激活版

好的思维导图软件能帮助用户更好的发挥创作能力&#xff0c;XMind是一款流行的思维导图软件&#xff0c;可以帮助用户创建各种类型的思维导图和概念图。 多样化的导图类型&#xff1a;XMind提供了多种类型的导图&#xff0c;如鱼骨图、树形图、机构图等&#xff0c;可以满足不同…

Unity ML-Agent

介绍: 环境搭建 待为完序

温室花卉种植系统springboot框架jsp鲜花养殖智能管理java源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于Git无线传感网络的温室花卉种植智能控制系统 系统…

【linux-keepalive】keepalive避免单点故障,高可用配置

keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…

C++_模板初阶

在面向对象中&#xff0c;我们可以使用重载来实现多态。 但是问题在于&#xff0c;重载的函数仅仅是类型不同&#xff0c;代码复用率比较低&#xff0c;只要有新的类型出现时&#xff0c;就要增加对应的函数&#xff1b;另一方面它的代码可维护性比较低&#xff0c;一个出错可…

Android之消除APP图标的白色边框

有问题的效果&#xff1a; 解决方案&#xff1a; 第一步&#xff1a;app右键—>new—>Image Asset 第二步&#xff1a;上传Logo图标&#xff0c;选择每种分辨率&#xff0c;预览看效果&#xff0c;选择Resize&#xff0c;可以微调 第三步&#xff1a;点击 Next&#xff…

nbcio-boot升级到3.1后出现online表单新增报错

nbcio-boot升级springboot、mybatis-plus和JSQLParser后出现新增online表单的时候报错&#xff0c;如下&#xff1a; 2023-08-13 21:18:01.292 [http-nio-8080-exec-12] [1;31mERROR[0;39m [36mo.jeecg.common.exception.JeecgBootExceptionHandler:69[0;39m - Handler dispat…

【Bert101】最先进的 NLP 模型解释【01/4】

0 什么是伯特&#xff1f; BERT是来自【Bidirectional Encoder Representations from Transformers】变压器的双向编码器表示的缩写&#xff0c;是用于自然语言处理的机器学习&#xff08;ML&#xff09;模型。它由Google AI Language的研究人员于2018年开发&#xff0c;可作为…

免费实用的日记应用:Day One for Mac中文版

Day One for Mac是一款运行在Mac平台上的日记软件&#xff0c;你可以使用Day One for mac通过快速菜单栏条目、提醒系统和鼓舞人心的信息来编写更多内容&#xff0c;day one mac版还支持Dropbox同步功能&#xff0c;想要day one mac中文免费版的朋友赶紧来试试吧&#xff01; …

力扣刷题(C++)知识点

一&#xff0c;找到数组的中间位置 这个是错的&#xff0c;不能分开来 C vector<int>& nums 用法 创建一维数组vector&#xff1a; vector<int> nums; //不指定长度vector<int> nums(n); //指定长度为n c &#xff1c;numeric&#xff1e; accumul…

C语言——指针进阶

本章重点 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析 1. 字符指针 在指针的类型中我们知道有一种指针类型为字符指针 char* int main() { char ch w; char *pc &ch; *pc w; return 0; }…

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…

IDEA项目实践——Spring当中的切面AOP

系列文章目录 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项…