首页
碎碎念
东邻西舍
本站信息
前来吐槽
统计
Search
1
openwrt系统上安装第三方插件
27,291 阅读
2
ubuntu下zerotier的基本使用教程
14,544 阅读
3
给小米R3G更换系统:从padavan刷成openwrt
13,424 阅读
4
openwrt使用第一步:设置上网拨号
11,298 阅读
5
openwrt无线中继功能:实现不插网线就能上网
10,073 阅读
学习点滴
Java
Web前端
Linux
踩坑实录
折腾搞机
关于建站
只言片语
登录
Search
标签搜索
Linux
Java
建站
踩坑实录
Ubuntu
折腾搞机
MySQL
MyBatis
CSS
HTML
Spring
SQL
Nginx
OpenWrt
树莓派
路由器
Maven
SSL
Git
Windows
知识分子没文化
累计撰写
85
篇文章
累计收到
155
条评论
首页
栏目
学习点滴
Java
Web前端
Linux
踩坑实录
折腾搞机
关于建站
只言片语
页面
碎碎念
东邻西舍
本站信息
前来吐槽
统计
搜索到
52
篇与
的结果
2021-05-25
踩坑实录|mybatis项目报错:...Exception: Type interface UserMapper is not known to the MapperRegistry
环境说明: 系统:win10 专业版 开发环境:IDEA JDK版本:1.8 mysql:5.5 mybatis:3.5.3 Junit:5.7.0 问题再现: mybatis项目运行时报错,报错信息如下: org.apache.ibatis.binding.BindingException: Type interface com.langp.dao.UserMapper is not known to the MapperRegistry. at org.apache.ibatis.binding.MapperRegistry.getMapper(MapperRegistry.java:47) at org.apache.ibatis.session.Configuration.getMapper(Configuration.java:779) at com.langp.dao.UserMapperTest.getUserList(UserMapperTest.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:498) ····· Process finished with exit code -1 错误原因: 报错信息中出现了Type interface com.langp.dao.UserMapper is not known to the MapperRegistry,简单翻译一下就是:类型接口com.langp.dao.UserMapper不为MapperRegistry所知。 所以这个错误肯定是与mapper有关系的。每一个Mapper.xml都需要在mybatis核心配置文件中进行注册,由于mybatis的核心配置文件mybatis-config.xml中缺少对应接口的Mapper.xml,所以运行时就会报错。 解决方法: 在mybatis的核心配置文件中添加如下内容: <!-- 每一个mapper.xml配置文件都需要在mybaits核心文件中注册 --> <mappers> <mapper resource="com/langp/dao/UserMapper.xml"></mapper> </mappers> 其中,resource属性的值是接口对应Mapper.xml文件。添加之后即可解决。
2021年05月25日
2,650 阅读
0 评论
1 点赞
2021-05-24
Java总结:JDBC连接操作数据库(一)
目录: 前言 一、JDBC结构 1.Java程序 2.JDBC管理器 3.驱动程序 4.数据库 二、JDBC编程的步骤 1、导入包 2、加载驱动程序 3、设置JDBC的连接地址信息 4、创建数据库连接 5、使用SQL语句操作数据库 5.1.Statement接口方法创建表: 5.2.PreparedStatement接口: 6、关闭连接 三、相关的类与方法 1、DriverManager类 ——管理驱动 2、Connection接口 ——建立连接 3、Statement接口 ——执行SQL语句 4、PreparedStatement接口 ——执行SQL语句 5、ResultSet接口 ——存放查询之后返回的结果 前言 Java Database Connectivity简称JDBC,属于Java核心API的一部分,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口。支持ANSI SQL-92标准,通过调用这些类和接口提供的成员方法,我们可以方便地连接各种不同的数据库,进而使用标准的SQL命令对数据库进行查询、插入、删除、更新等操作。 一、JDBC结构 1.Java程序 主要功能是根据JDBC方法实现对数据库的访问和操作。 主要任务有:请求与数据库建立连接,向数据库发送SQL请求,为结果集定义存储应用和数据类型,查询结果,处理错误,控制传输、提交及关闭连接等。 2.JDBC管理器 即驱动程序管理器,动态地管理和维护数据库查询查询所需要的所有驱动程序对象,实现Java程序与特定驱动程序的连接。 主要任务有:为特定数据库选择驱动程序,处理JDBC初始化调用,为每个驱动程序提供JDBC功能的入口,为JDBC调用执行参数等 3.驱动程序 主要任务:建立与数据库的连接,向数据库发送请求,用户程序请求是执行编译,将错误代码格式化成标准的JDBC错误代码。 编程所使用的数据库系统不同,所需要的驱动程序也有所不同。 4.数据库 按数据结构来存储和管理数据的计算机软件。 常见的数据库比如mysql、Oracle、SqlServer等。 二、JDBC编程的步骤 一次完整的JDBC实现过程分为以下几步: 1、导入包 在程序首部将相关的包导入程序 import java.sql.*; 2、加载驱动程序 使用Class.forName()方法来加载相应的驱动程序。不同数据库所需要加载的驱动程序也不同: // 加载mysql的驱动程序 Class.forName("com.mysql.jdbc.Driver"); //加载oracle的驱动程序 Class.forName("oracle.jdbc.driver.oracleDriver"); 3、设置JDBC的连接地址信息 指定JDBC要连接的地址、端口、数据库、用户名、密码等信息 String username = "root"; String password = "root"; String url = "jdbc:mysql://localhost:3306/test"; // 如果要往表中插入中文,还需要设置编码为utf-8 String url = "jdbc:mysql://localhost:3306/test?seUnicode=true&characterEncoding=utf8"; 其中,"jdbc:mysql"是连接协议,“localhost”是连接地址,“3306”是mysql的连接端口(mysql的默认连接端口是3306),“test”是要连接操作的数据库。 4、创建数据库连接 DriverManager 类中的getConnection() 方法用上一步设置好的url作为参数来创建一个连接对象,并返回这个连接对象给Connection的实例。 //url是上一步创建的连接地址 Connection conn = DriverManager.getConnection(url,username,password); 5、使用SQL语句操作数据库 JDBC中执行SQL语句可以使用Statement接口以及其子接口PreparedStatement接口,下面分别使用不同接口来举例简单说明其用法: 5.1.Statement接口方法创建表: /** * 例子:Statement接口执行创建表,并且插入一组数据 */ // 在当前数据库下创建一个学生表,表中包含主键字段id、姓名name、以及更新时间updatetime String sql1 = "create table student(id int NOT NULL AUTO_INCREMENT primary key,name char(10),updateTime Datetime)"; // 向创建的student表添加一组信息 String sql2 = "insert into student(name,updatetime) values('qwe',sysdate())"; // 创建一个Statement对象 Statement st = conn.createStatement(); // 用executeUpdate()函数执行不返回任何内容的sql语句,如INSERT、UPDATE、DELETE以及其他DDL(数据定义语言)等。其参数为SQL语句 // 执行建表SQL语句 st.executeUpdate(sql1); // execute()函数可以执行传进来的任意SQL语句 // 执行插入数据的SQL语句 st.execute(sql2); // 释放资源 st.close(); 5.2.PreparedStatement接口: /** * 例子:PreparedStatement接口执行查询表中数据的SQL语句 */ String sql3 = "select * from student"; // 创建一个PreparedStatement对象,同时对传入的SQL语句进行预编译 PreparedStatement ps = conn.prepareStatement(sql3); // PreparedStatement接口中的execute()方法是没有参数的,因为SQL语句在创建对象时已传入并且预编译了 ResultSet result = ps.executeQuery(); while(rs.next()){ // 通过索引来获取查询到的值 int id = rs.getInt(1); String name = rs.getString(2); // 通过列名来获取查询到的值 Date date = rs.getDate("updateTime"); } // 释放资源 ps.close(); 6、关闭连接 用完就要释放所连接的数据库及JDBC资源,关闭与数据库的连接 conn.close(); 上面就是是JDBC编程的基本流程,下面对这个过程中涉及到的一些类与方法做简单介绍: 三、相关的类与方法 1、DriverManager类 ——管理驱动 用于管理一组JDBC驱动程序的基本服务。 官方文档介绍:DriverManager (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 static Connection getConnection(String url) 用指定的数据库URL来创建连接 static Connection getConnection(String url, Properties info) 用指定的数据库URL和相关信息(用户名、用户密码等属性列表)来创建连接 static Connection getConnection(String url, String user, String password) 用指定的数据库URL、用户名和用户密码来创建连接 static Driver getDriver(String url) 定位在给定URL下的驱动程序。 DriverManager尝试从已注册的JDBC驱动程序集中选择适当的驱动程序。 static void deregisterDriver(Driver driver) 从DriverManager的已注册驱动程序列表中删除指定的驱动程序。 static void println(String message) 将消息输出到当前JDBC日志流。 static void setLoginTimeout(int seconds) 驱动程序尝试连接数据库时将等待的最长时间,以秒为单位。 2、Connection接口 ——建立连接 负责建立与指定数据库的连接。 默认情况下,Connection对象处于自动提交模式,这意味着它在执行每个语句后自动提交更改。 如果禁用了自动提交模式,则必须显式调用方法commit()方法才能提交更改;否则,将不会保存数据库更改。 官方文档介绍: Connection (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 Statement createStatement() 创建一个Statement对象,用于将SQL语句发送到数据库。 PreparedStatement prepareStatement(String sql) 创建一个PreparedStatement对象,用于将参数化的SQL语句发送到数据库。 void close() 立即释放此Connection对象的数据库和JDBC资源,而不是等待它们自动释放。 void commit() 使自上一次提交/回退以来进行的所有更改永久生效,并释放此Connection对象当前持有的所有数据库锁。 void rollback() 撤销对数据库执行的添加、删除或者修改记录等操作,并释放此Connection对象当前持有的所有数据库锁。 3、Statement接口 ——执行SQL语句 用于执行静态SQL语句并返回其产生的结果的对象。 默认情况下,每个Statement对象只能同时打开一个ResultSet对象。 因此,如果一个ResultSet对象的读取与另一个的读取交错,则每个都必须由不同的Statement对象生成。 如果当前存在打开的语句,Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。 官方文档介绍: Statement (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 Connection getConnection() 检索产生此Statement对象的Connection对象 void close() 立即释放此Statement对象的数据库和JDBC资源,而不是在自动关闭时等待它发生 boolean execute(String sql) 执行给定的SQL语句,该语句可能返回多个结果 ResultSet executeQuery(String sql) 执行给定的SQL语句,该语句返回一个ResultSet对象 int executeUpdate(String sql) 执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句,也可以是不返回任何内容的SQL语句,例如SQL DDL语句 ResultSet getResultSet() 以ResultSet对象的形式检索当前结果 executeUpdate()、executeQuery()与execute()方法的区别: execute()函数:可以执行所有SQL语句。 当执行查询语句时,返回的boolean值指示查询结果的形式,返回值为true时表示查询结果为ResultSet,反之为false(即认为没有查到);执行其他语句时,如果第一个结果是更新计数或不存在任何结果,则返回false executeUpdate():执行insert、update、delete等不返回任何内容的非查询语句。 executeQuery():用于执行select语句。返回一个ResultSet对象,其中包含由给定查询产生的数据; 永不为空 4、PreparedStatement接口 ——执行SQL语句 表示预编译的SQL语句的对象。是Statement的子接口。 创建PreparedStatement对象时需传入一个SQL语句,该SQL语句已预编译并存储在PreparedStatement对象中。然后可以使用该对象多次有效地执行该语句。 官方文档介绍: PreparedStatement (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 boolean execute() 在此PreparedStatement对象中执行SQL语句,可以是任何类型的SQL语句 ResultSet executeQuery() 在此PreparedStatement对象中执行SQL查询,并返回查询生成的ResultSet对象 int executeUpdate() 在此PreparedStatement对象中执行SQL语句,该对象必须是SQL数据操作语言(DML)语句,例如INSERT,UPDATE或DELETE; 或不返回任何内容的SQL语句,例如DDL语句 5、ResultSet接口 ——存放查询之后返回的结果 表示数据库结果集的数据表,通常通过执行查询数据库的语句来生成。 ResultSet对象有一个游标,该游标指向其当前数据行。 最初,光标位于第一行之前。next()方法可将光标移动到下一行,当ResultSet对象中没有更多行时它将返回false,因此可以在while循环中使用它来迭代结果集。例如: // 假设rs是前面进行查询操作返回的ResultSet对象 while(rs.next()){ // 输出结果 } 用next()方法可以实现访问每一个数据行,那么如何获取数据行中的每一列数据呢?ResultSet接口提供了用于从当前行中检索列值的getter方法,方法名是get+类型,如getBoolean(),getInt()。 getter方法的参数可以是列的索引值或者列的名称,对应的是用索引或者列名来从当前数据行中检索列值。 通常,使用列索引会更有效。 列从1开始编号。为实现最大的可移植性,应按从左到右的顺序读取每一行中的结果集列,并且每一列只能读取一次。 getter方法用列名检索时传入的列名称不区分大小写。 当多个列具有相同的名称时,将返回第一个匹配列的值。 对于在查询中未明确命名的列,最好使用列的索引。 如果使用了列名,则应注意确保它们唯一地引用了预期的列,这可以通过SQL AS子句来确保。 例如: // 假设rs是前面进行查询操作返回的ResultSet对象 while(rs.next()){ // 使用索引来检索 int id = rs.getInt(1); // 使用列的名称来检索 String name = rs.getString("name"); // 且列名不区分大小写 Date updateTime = rs.getDate("UPDATETIME"); } 官方文档介绍: ResultSet (Java Platform SE 8 ) (langp.wang) 其常用成员方法如下: 返回值 方法体 说明 boolean absolute(int row) 将光标移动到此ResultSet对象中的给定行号 boolean first() 将光标移动到此ResultSet对象的第一行 void beforeFirst() 将光标移动到此ResultSet对象的前面,紧挨着第一行 boolean isFirst() 检索光标是否在此ResultSet对象的第一行上 boolean last() 将光标移动到此ResultSet对象的最后一行 void afterLast() 将光标移动到此ResultSet对象的末尾,紧接在最后一行之后 boolean isLast() 检索光标是否在此ResultSet对象的最后一行 boolean next() 将光标从当前位置向前移动一行 void insertRow() 将插入行的内容插入到此ResultSet对象和数据库中 void updateRow() 使用此ResultSet对象的当前行的新内容更新底层数据库 void deleteRow() 从此ResultSet对象和底层数据库中删除当前行 void update类型(int ColumnIndex,类型 x) 使用给定类型x更新指定列 int get类型(int ColumnIndex) 以Java类型的形式获取此ResultSet的对象的当前行中指定列的值 主要参考资料: 《数据库系统概论(第5版)》 王珊 萨师煊 编著 Java SE 1.8 官方文档
2021年05月24日
1,600 阅读
0 评论
1 点赞
2021-04-29
简单总结CSS中元素形状的平滑变化
目录: 前言 一、transition属性 ——设置过渡效果 1.作用: 2.属性: 3. 默认值: 4.JavaScript语法: 5.使用及说明: 二、transform属性 ——变化效果 1.作用: 2语法: 3.属性值: 三、效果演示代码 1.html代码 2.CSS代码 前言 将鼠标放到图片上面以查看实现效果: 例子涉及到的相关知识点如下: 一、transition属性 ——设置过渡效果 1.作用: 设置元素变化时的过渡效果 2.属性: transition属性包括四个子属性,即transition-property、transition-duration、ransition-timing-function、transition-delay,各个属性的含义见下方表格: 值 描述 transition-property 指定哪个元素属性会发生变化 transition-duration 指定过渡效果需要多少秒或毫秒才能完成 ransition-timing-function 指定过渡效果的变化速度曲线 transition-delay 定义过渡效果延迟多长时间开始 注:使用时应该必须指定 transition-duration 属性,否则效果持续时间为0,不会有任何效果 3. 默认值: all 0 ease 0 4.JavaScript语法: object.style.transition="width 2s"; 5.使用及说明: 举个例子: 存在一个矩形,设置过渡效果为:延迟1s,矩形的宽度变化,过渡时间为0.5s,过渡效果的变化曲线为linear ,代码如下: .div { transition-property: width; transition-duration: 0.5s; transition-timing-function: linear; transition-delay: 1s; } 上面写法看起来就很繁琐,更别说写起来了。所以为了方便,可以将这几个属性合并成transition 属性,上面的就可以这么写: .div { transition: width 0.5s linear 1s; // 部分用不到的属性可以省略,一般都得设置产生过渡变化的属性和过渡时间 } 除了设置单个属性的变化效果,也可以设置多个属性的变化效果,中间用逗号隔开: transition: width 2s, height 1s, transform 2s; 二、transform属性 ——变化效果 1.作用: 设置元素的变化效果,与transition属性一起使用可实现元素的平滑变化 2语法: transform: none|transform-functions; 3.属性值: 值 描述 none 不进行转换。 translate(x,y) 定义 2D 转换。 translate3d(x,y,z) 定义 3D 转换。 scale(x[,y]?) 定义 2D 缩放转换。 scale3d(x,y,z) 定义 3D 缩放转换。 rotate(angle) 定义 2D 旋转,在参数中规定角度。 rotate3d(x,y,z,angle) 定义 3D 旋转。 skew(x-angle,y-angle) 定义沿着 X 和 Y 轴的 2D 倾斜转换。 perspective(n) 为 3D 转换元素定义透视视图。 更多transform变化属性参考: CSS3 transform 属性 | 菜鸟教程 (runoob.com) 三、效果演示代码 1.html代码 <div class="box"> <img src="https://gitee.com/wang-langping/langp/raw/master/%E5%AD%A6%E4%B9%A0%E7%82%B9%E6%BB%B4/web%E5%89%8D%E7%AB%AF/%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93CSS%E4%B8%AD%E5%85%83%E7%B4%A0%E5%BD%A2%E7%8A%B6%E7%9A%84%E5%B9%B3%E6%BB%91%E5%8F%98%E5%8C%96/agree.png" alt="网络未连接或图片链接已失效" class="agree"> <img src="https://gitee.com/wang-langping/langp/raw/master/%E5%AD%A6%E4%B9%A0%E7%82%B9%E6%BB%B4/web%E5%89%8D%E7%AB%AF/%E7%AE%80%E5%8D%95%E6%80%BB%E7%BB%93CSS%E4%B8%AD%E5%85%83%E7%B4%A0%E5%BD%A2%E7%8A%B6%E7%9A%84%E5%B9%B3%E6%BB%91%E5%8F%98%E5%8C%96/windmill.png" alt="网络未连接或图片链接已失效" class="windmill"> </div> 2.CSS代码 <style> .box { display: inline-flex; border:1px solid #aaabad; margin:10px; } .agree { width: 60px; height: 60px; margin: 45px; transition: all 0.5s; } /* 设置鼠标悬浮到图片上时图片的变化效果 */ .agree:hover { transform: scale(1.5); } .windmill { margin: 30px; width: 100px; height: 100px; transition: all 3s; } .windmill:hover { transform: rotate(720deg); } </style>
2021年04月29日
1,958 阅读
0 评论
2 点赞
2021-04-18
简单总结Layui中的表单验证
目录: 一、校验规则 1.使用内置校验规则 2.自定义校验规则 二、示例文件的实现代码 1.HTML代码 2.CSS代码 3.JS代码 简单来说,实现Layui框架中的表单验证很简单,只需要给表单元素添加上”lay-verify“属性 示例如下: 一、校验规则 1.使用内置校验规则 Layui对于常见的字符串(如手机号,邮箱,网址等)都设置了相应的校验规则,不用再自己写规则,使用时只需要将校验规则赋值给“lay-verify”属性即可。 Layui中内置的校验规则如下: 规则 说明 required 必填项 phone 手机号 email 邮箱 url 网址 number 数字 date 日期 identity 身份证 例如:设置一个输入框对手机号码进行校验: <!-- 也可以支持多条校验规则同时使用,用“|”隔开 --> 手机号:<input type="text" placeholder="请输入手机号" lay-verify="required|phone"> <button lay-submit>提交</button> 2.自定义校验规则 当然,在大部分时候,Layui中内置的校验规则还是有点不够用,所以我们还是需要来自定义规则来校验表单数据。 用一个实例来简单说明: <!-- username为自定义的规则 --> 用户名:<input type="text" placeholder="请输入用户名" lay-verify="username"> <script> // 用户名长度不能大于16位 layui.form.verify({ // value:表单的值、item:表单的DOM对象 username:function(value,item){ if (value.length > 16){ return "用户名大于16位"; } } }) </script> 这个例子较为简单,只涉及到表单数据的长度判断,若要设置更复杂的规则还需要用到正则表达式,鉴于篇幅长度本篇博客不再赘述。相关的教程可以参考:JavaScript 正则表达式、JavaScript RegExp 对象 二、示例文件的实现代码 提前导入Layui和jQuery的CDN文件: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> <link rel="stylesheet" href="https://www.layuicdn.com/layui-v2.6.4/css/layui.css"> <script src="https://www.layuicdn.com/layui/layui.js"></script> 1.HTML代码 <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;"> <legend id="title">简单总结Layui中的表单验证</legend><br> </fieldset> <div class="container"> <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;"> <legend>内置的校验规则</legend> </fieldset> <div class=" layui-collapse" lay-accordion> <!-- 必填项 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">必填项校验</p> <!-- layui-show来决定是否默认展开 --> <div class="layui-form-item layui-colla-content layui-show"> <label class="layui-form-label">必填项:</label> <div class="layui-input-inline"> <!-- lay-verify 属性定义校验规则 --> <input type="text" class="layui-input" placeholder="请输入必填项" lay-verify="required"> </div> <div class="layui-form-mid layui-word-aux">此项为必填项</div> <button id="btn-required" class="layui-btn layui-btn-sm" lay-submit>校验</button> </div> </div> <!-- 手机号校验 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">手机号校验</p> <div class="layui-form-item layui-colla-content"> <label class="layui-form-label">手机号:</label> <div class="layui-input-inline"> <input type="text" class="layui-input" placeholder="请输入正确格式的手机号码" lay-verify="phone"> </div> <div class="layui-form-mid layui-word-aux">1开头的11位数字</div> <button id="btn-phone" class="layui-btn layui-btn-sm" lay-submit>校验手机号</button> </div> </div> <!-- 邮箱 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">邮箱校验</p> <div class="layui-form-item layui-colla-content"> <label class="layui-form-label">邮箱:</label> <div class="layui-input-inline"> <input type="text" class="layui-input" placeholder="请输入正确格式的邮箱" lay-verify="email"> </div> <div class="layui-form-mid layui-word-aux">正确的邮箱格式</div> <button id="btn-email" class="layui-btn layui-btn-sm" lay-submit>校验邮箱</button> </div> </div> <!-- 网址 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">网址校验</p> <div class="layui-form-item layui-colla-content"> <label class="layui-form-label">网址:</label> <div class="layui-input-inline"> <input type="text" class="layui-input" placeholder="请输入网址" lay-verify="url"> </div> <div class="layui-form-mid layui-word-aux">http(s)://开头</div> <button id="btn-url" class="layui-btn layui-btn-sm" lay-submit>校验网址</button> </div> </div> <!-- 数字 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">数字校验</p> <div class="layui-form-item layui-colla-content"> <label class="layui-form-label">数字:</label> <div class="layui-input-inline"> <input type="text" class="layui-input" placeholder="请输入数字" lay-verify="number"> </div> <div class="layui-form-mid layui-word-aux">数字</div> <button id="btn-number" class="layui-btn layui-btn-sm" lay-submit>校验数字</button> </div> </div> <!-- 日期 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">日期校验</p> <div class="layui-form-item layui-colla-content"> <label class="layui-form-label">日期:</label> <div class="layui-input-inline"> <input type="text" class="layui-input" placeholder="请输入日期" lay-verify="date"> </div> <div class="layui-form-mid layui-word-aux">格式:年(YYYY)-月(MM)-日(DD)</div> <button id="btn-date" class="layui-btn layui-btn-sm" lay-submit>校验日期</button> </div> </div> <!-- 身份证 --> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">身份证号校验</p> <div class="layui-form-item layui-colla-content"> <label class="layui-form-label">身份证号:</label> <div class="layui-input-inline"> <input type="text" class="layui-input" placeholder="请输入身份证号" lay-verify="identity"> </div> <div class="layui-form-mid layui-word-aux">正确的身份证号码</div> <button id="btn-identity" class="layui-btn layui-btn-sm" lay-submit>校验身份证号</button> </div> </div> </div> </div> <br><br> <div class="container"> <fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;"> <legend>自定义校验规则</legend> </fieldset> <!-- 自定义规则--> <div class="layui-form layui-collapse" lay-accordion> <div class="layui-form layui-colla-item"> <p class="layui-colla-title">自定义规则</p> <div class="layui-form-item layui-colla-content layui-show"> <label class="layui-form-label">密码</label> <div class="layui-input-inline"> <input type="password" class="layui-input" placeholder="请输入密码" lay-verify="password"> </div> <div class="layui-form-mid layui-word-aux">至少八位数字与字母的组合</div> <button id="btn-custom" class="layui-btn layui-btn-sm" lay-submit>校验</button> </div> </div> </div> </div> 2.CSS代码 <style> #title { text-align: center; margin: 20px; } .container { width: 800px; margin: 20px auto; } button { margin: 5px; float: right; } </style> 3.JS代码 <script> // 注意:自 layui 2.6.0 开始,无需再单独加载指定模块,因为 layui.js 已经包含了所有的内置模块,无需再指定模块 $("#btn-required").click(function () { layer.msg("必填项已填写", { icon: 6 , time: 1000 }) }); $("#btn-phone").click(function () { layer.msg("手机号码格式正确", { icon: 6 , time: 1000 }); }); $("#btn-email").click(function () { layer.msg("邮箱格式正确", { icon: 6 , time: 1000 }); }) $("#btn-url").click(function () { layer.msg("网址格式正确", { icon: 6 , time: 1000 }); }); $("#btn-number").click(function () { layer.msg("填写的值为数字", { icon: 6 , time: 1000 }); }); $("#btn-date").click(function () { layer.msg("日期格式正确", { icon: 6 , time: 1000 }); }); $("#btn-identity").click(function () { layer.msg("身份证格式正确", { icon: 6 , time: 1000 }); }); $("#btn-custom").click(function () { layer.msg("密码格式正确", { icon: 6 , time: 1000 }); }); // 引入layui的form模块,自定义校验规则 layui.form.verify({ //value:表单的值、item:表单的DOM对象 password: function (value,item) { if (/[\u4e00-\u9fa5]+$/.test(value)) { return "密码不能出现汉字噢"; } if (value.length < 8) { return "密码小于8位"; } } }) </script>
2021年04月18日
2,868 阅读
0 评论
0 点赞
2021-04-16
Bootstrap框架实现简易的模态框
目录: 一、模态框的简单介绍 二、代码实现 1.HTML代码 2.CSS代码 一、模态框的简单介绍 点击按钮以查看实现效果: 模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独来源的内容,使用户可以在不离开父窗体的情况下有一些互动,比如提供信息、交互等。 简单来说,模态框是一个div,包含“modal-header”(模态框头部)、“modal-body”(模态框主体)、“modal-footer”(模态框底部)三个子元素。 简单结构大概是这样: 二、代码实现 导入jQuery和Bootstrap: <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"> </script><link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> 1.HTML代码 <h2>Bootstrap框架实现简易的模态框</h2> <!-- 触发模态框的按钮 data-target的值是要加载的模态框 --> <button class="click btn btn-primary" data-toggle="modal" data-target="#showModal">点击显示模态框</button> <!-- modal属性用于把div识别为模态框窗口,fade是可以设置模态框淡入淡出 aria-labelledby的值是模态框的标题 aria-hidden="true"用于保持模态窗口不可见,直到触发器(比如按钮)被触发为止--> <div class="modal fade" id="showModal" tabindex="-1" role="dialog" aria-labelledby="titleModal" aria-hidden="true"> <!-- modal-dialog 设置弹出层 弹出效果--> <div class="modal-dialog"> <!-- 模态框的底层 --> <div class="modal-content"> <!-- 模态框头部--> <div class="modal-header"> <!-- 关闭按钮 data-dismiss="modal"用来关闭窗口 --> <button class="close" data-dismiss="modal" aria-hidden="true"> <!-- × 转义成“x”关闭符号 --> × </button> <!-- 模态框标题 --> <h4 class="modal-title" id="titleModal">Roookie博客 | 记录 · 收纳 · 分享</h4> </div> <!-- 模态框主体 --> <div class="modal-body"> <br><a href="https://www.langp.wang"> <img src="https://gitee.com/wang-langping/langp/raw/master/icon/1.png" alt="网络连接失败,请检查网络连接"> </a> </div> <!-- 模态框底部 --> <div class="modal-footer"> <!-- 模态框底部的操作按钮 --> <button class="btn btn-info" data-dismiss="modal">确定</button> <button class="btn btn-default" data-dismiss="modal">取消</button> </div> </div> </div> </div> 2.CSS代码 h2,h4,.modal-body{ text-align:center; } .click{ display:block; padding:10px; margin:30px auto; } 更多内容: Bootstrap 模态框(Modal)插件 | 菜鸟教程 (runoob.com)
2021年04月16日
1,598 阅读
0 评论
0 点赞
2021-04-16
用jQuery实现元素被点击选中的效果
目录: 一、说明 二、代码实现 1.HTML代码 2.CSS代码 3.JS代码 一、说明 页面中存在四个div元素,实现以下效果: 当鼠标放置在div元素上面的时候,元素呈现平滑放大效果; 鼠标点击任意一个元素,元素变大,周围出现阴影,表现出被选中的效果 演示效果如下,鼠标点击即可选中或者用按钮进行多选: 二、代码实现 提前导入jQuery文件: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> 1.HTML代码 <h2>用jQuery实现元素被点击选中的效果</h2> <div class="box"> <div>元素1</div> <div>元素2</div> <div>元素3</div> <div>元素4</div> <button id="all-selected">全选/取消全选</button> </div> 2.CSS代码 <style> h2 { text-align: center; } .box{ display:flex; border:1px solid #aaabad; width:700px; margin:auto; } /*给盒子设置样式*/ .box>div { border: 3px solid dodgerblue; margin: 30px auto; padding: 15px; border-radius: 10px; /* 定义元素的变化参数,持续时间0.5s,元素所有属性都变化 */ transition: all 0.5s; -webkit-transition: all 0.5s; -ms-transition: all 0.5s; -moz-transition: all 0.5s; } /*为盒子添加伪类,实现鼠标放到元素上的效果*/ .box>div:hover { /* 定义变化的效果,盒子的长和宽均变为原来的1.2倍 */ transform: scale(1.2, 1.2); } /* 元素被选中时的效果 */ .selected { box-shadow: 0 0 15px deepskyblue; /* 定义变化的效果,盒子的长和宽均变为原来的1.2倍 */ transform: scale(1.2, 1.2); } #all-selected { width:100px; height:35px; border-radius:5px; display:inline-block; margin: 40px 25px 25px; transition:all 0.5s; } #all-selected:hover{ background-color:#c9c9c9; } </style> 3.JS代码 <script> // 设置一个变量symbol,来判断当前的状态是否为选中 let symbol = true; $(document).ready(function () { // 为box盒子添加点击事件 $(".box>div").click(function () { if (symbol === true) { // 当symbol的值为true时,为点击的元素添加"selected"属性 $(this).addClass("selected"); // 同时symbol的值取反 symbol = false; } else { // 当symbol的值为false时,移除"selected"属性 $(this).removeClass("selected"); // symbol的值取反 symbol = true; } }); // 为“全选”按钮添加全选事件 $("#all-selected").click(function () { if (symbol === true) { $(".box>div").addClass("selected"); symbol = false; } else { $(".box>div").removeClass("selected"); symbol = true; } }); }); </script>
2021年04月16日
1,863 阅读
0 评论
0 点赞
2021-04-14
IDEA添加并配置Tomcat服务器
目录: 一、提前准备 二、创建Java web项目 三、添加Tomcat服务器 四、启动Tomcat服务器 五、其他操作 更改Tomcat默认端口 环境说明: 系统:Win10专业版 JDK版本:1.8 Tomcat版本:8.5.57 开发环境:IDEA 2020.03 Ultimate 一、提前准备 首先,访问Tomcat官网,选择一个版本的Tomcat进行下载,下载完之后解压。本篇博客以Tomcat8.5为例,下载的是windows 64位。下载完之后解压,记住解压完的文件位置,后面导入服务器时要用到。 其次,要保证当前的计算机正确配置了Java环境,win10系统下Java环境的配置请参考:Win10系统配置Java开发环境 二、创建Java web项目 注意:IDEA的Community版本是无法进行Web开发的,Web开发需要Ultimate版本 打开IDEA,先创建一个Java项目。然后在项目名上依次点击右键->”Add Framework Support“,弹出的窗口中勾选“Web Application”选项,点击右下角“OK”即可。 这样创建出来的就是Java web项目了,原来的项目目录会多出来一个“web”文件夹: 三、添加Tomcat服务器 依次点击“File”->“setting”(或者快捷键Ctrl+Alt+s)打开设置界面,然后选择“Build,Execution,Deployment”->“Application Servers”,点击“+”新添加一个应用服务器: 选择的服务器类型为“Tomcat Server”,注意不要选成“TomEE Server”: 在弹出的窗口中选择本地Tomcat的所在目录,IDEA会自动识别出Tomcat的版本,两连“OK”退出 回到主界面,找到菜单栏右边的“Add Configuration”: 点击左上角“+”,在展开的列表中依次选择“Tomcat Server”->“Local”,新建一个本地服务配置。因为前面添加了Tomcat服务器,所以右侧窗口中出现的配置项已自动填好,有需要的可以根据下图说明来改变部分选项: 然后我们需要把之前新建的这个项目放到Tomcat服务器上运行。切换到选项卡“Deployment”,点击左下角“+”,选择“Artifact”,当前项目就被添加上去了,添加完点击“OK”退出。 四、启动Tomcat服务器 如果前面配置没问题的话,现在左下角会出现“Services”窗口选项,在服务器名称上右键->“Run”,Tomcat服务器就启动了。 等待几秒钟服务器完全启动之后,会自动在浏览器中打开项目,如果没有自动打开那就用“localhost:8080”在浏览器中访问项目。 当前由于我们运行的只是空项目,没有对项目做任何更改,所以项目的运行结果会是下面这样: 到这里就配置成功了。 五、其他操作 更改Tomcat默认端口 在主界面找到菜单栏右边的“Tomcat ”,选择“Edit Configurations”: “HTTP port”是默认端口,更改完之后要重启Tomcat服务器才能生效 暂时这些,其他的碰到再添加。
2021年04月14日
1,548 阅读
0 评论
0 点赞
2021-04-07
Win10系统配置Java开发环境
目录: 两句废话 一、安装JDK 二、配置环境变量 三、验证环境是否搭建成功 环境说明: 系统:Win10专业版 Java版本:1.8 两句废话 最近收到了升级Win10 20H2版本的更新消息(别问我为什么2021年才收到2020年的更新包,问就是不知道),之前也听说这是修复Bug的一次更新。所以出于对微软的信任,原来的旧系统我并没有备份,就直接升级了系统,系统升级过程还算顺利。但是,我还是太”轻敌“了,新系统用了几天之后,原来的Bug修没修复还真没感觉出来,能感觉出来的反倒是是几个新的Bug:Win+V打不开剪贴板,运行窗口用notepad打不开记事本,快捷键Shift+Win+S无法打开windows自带的截图功能,这几项Bug暂且还能接受,因为有其他第三方软件能够代替这几个功能。最让我难受的一个Bug就是全屏开始菜单里的图标全成了光秃秃的小方块,没有应用名字,也没有图案logo,每次打开开始菜单都得回忆一下要找的应用的位置,非常麻烦,网上提供的方法也基本上都是治标不治本,用了一周多实在是忍受不了这些Bug,于是忍痛重装了系统。 所以话说回来,更新Win10之前一定要把原来的系统备份一遍!!!!这次经历可真是太长记性了。 重装完系统的确清爽多了,但是写Java时,才想起来新系统的Java环境还没配置,所以把配置Java环境的过程记录下来,方便以后查询(以后谁要让我帮他配Java环境,我就把这篇博客链接扔过去)。 嗯,废话讲完了。 附上Oracle官方文档中安装Java环境的相关链接:JDK Installation for Microsoft Windows (oracle.com) 一、安装JDK 首先下载JDK安装包。 Java 官网:Oracle 甲骨文中国 | 集成的云应用和平台服务 JDK 最新版本下载:Java Downloads | Oracle 旧版本 JDK 下载:Java Archive | Oracle 选择一个Java版本之后,选择“Windows x64”版本进行下载。 由于下载 JDK 旧版本需要登录 Oracle 帐号,随便用临时邮箱注册了一个账号,用这个就行: 帐号:linshi@linshiyouxiang.net 密码:Youxiang123@ 本篇博客以JDK 8(也称为JDK 1.8)作为示例来说明。 下载好之后打开安装,安装的是JDK和JRE两部分。安装时直接一路点击“下一步”,安装注意一下安装位置,后面要用。 二、配置环境变量 “计算机”图标上点击右键->属性->高级系统设置(win10 20H2需要在属性窗口的后面才能找到高级系统设置),在高级系统设置窗口的右下角点击“环境变量”。 “环境变量”分为两部分,一个是“用户变量”,这里面配置的环境变量只适用于当前计算机用户,另一个是“系统变量”,设置的环境变量适用于这台计算机上的所有用户。具体设置成哪种环境变量看个人习惯。 添加如下两条环境变量: 环境变量名称 环境变量值 JAVA_HOME C:\Program Files\Java\jdk1.8.0_221 Path %JAVA_HOME%\bin JAVA_HOME的值是JDK的安装路径,如果在上一步安装的时候没有更改安装路径的话,则JDK的默认安装路径为:“C:\Program Files\Java\jdk1.8.0_221 ”,因为版本号的问题,JDK的安装文件夹名称可能会有些许差别,请根据实际情况写。 其实第一个环境变量的名称并不是固定的,在其他的配置Java环境变量的教程中名称也可能不同。这个只是习惯而已,只要保证环境变量值没什么问题即可。 这两条添加完之后,两连“确定”完成配置。 三、验证环境是否搭建成功 使用快捷键Win+R打开运行窗口,输入“cmd”,然后回车打开命令行界面,使用如下命令查看当前系统的Java版本: java -version 结果如下: 结果正确显示出Java的版本信息时,说明Java环境配置成功。
2021年04月07日
2,174 阅读
0 评论
0 点赞
2021-04-01
【踩坑实录】Ubuntu系统解压后的文件出现权限问题,无法查看编辑
环境说明: ubuntu 20.04 + kubuntu桌面 问题如图: 源自我在配置Tomcat时,从官网上下载的Tomcat8.5压缩包,在KDE桌面环境下解压之后的文件图标上会显示小锁,系统提示文件无法编辑、无法查看 问题原因 下载的文件默认权限是比较低的,系统无法进行相关的操作,只需要更改权限即可 解决办法: 修改权限即可,在终端上输入: # 修改tomcat-8.5文件夹的权限为755: sudo chmod 755 -R tomcat-8.5 修改后即可进行文件操作了。
2021年04月01日
1,956 阅读
0 评论
0 点赞
2021-03-22
【踩坑实录】Java运行程序报错“Exception in thread main java. lang. NullPointerException”
环境说明: 开发环境:JDK 1.8 IDEA 系统:Win10 专业版 问题 大概是这样:在一个Student类中定义了一个静态对象数组以及其他的数据成员和成员方法,其中某个成员方法中包含对这个对象数组的部分操作。在main方法中申明一个Student的对象,通过Student对象调用这个方法操作静态数组,然后运行结果报错: 原因 问题原因其实很简单,就是没有对这个数组进行初始化操作,即当前只存在数组的声明,系统只为二维数组对象的引用变量分配了空间,并没有创建相应的数组对象 。那么在相关的方法中,自然无法对这个看似存在但实际却找不到影儿的数组进行操作,所以就会报错了。 解决办法 在类中再添加一个成员方法init(),给这个对象数组进行内存空间的申请及初始化: 然后在main方法中申明对象以后,首先调用init()方法对对象数组进行初始化。 其实刚开始想直接在重载的构造方法中调用这个函数,这样的话就不用手动调用了,在初始化对象时就会同时完成对象数组的初始化,但仔细一想好像也不行,每初始化一个对象就会重新初始化数组,这样就会造成原来数组的信息丢失。所以还是老老实实手动调用吧。
2021年03月22日
1,499 阅读
0 评论
0 点赞
2021-03-12
ubuntu系统中的文件权限管理总结
目录: 思维导图 1.ubuntu中的文件权限介绍 1.1 用户组 1.2 文件权限等级 2.查看文件权限 3.修改文件权限 3.1 用字母表示权限等级 3.2 用数字表示权限等级 思维导图 注:修改文件权限等操作需要一定系统权限,本文的命令默认是在root用户下进行的,如有必要,请在命令前加入sudo 来提升权限。 1.ubuntu中的文件权限介绍 1.1 用户组 对于一个文件或者文件夹来说,与其相关的用户组分为三类: user:该文件或文件夹的拥有者 group:与user在同一个用户组的用户 other:除了user和group的其他所有用户 1.2 文件权限等级 文件权限等级有三种,分别为读、写、执行。有两种表示方法: 用字母表示: 读:r(read) 写:w(write) 执行:x(execute) ——假如这个文件可执行的话 无权限:-(可以理解为占位符) 这个很好理解,表示形式就是对应英文单词的首字母。假设有文件test.txt,user有这个文件的读、写、执行权限,group有读、写权限,other有执行权限,那么它的文件权限就可以用这种方式表示为:rwxrw- - -x。这串字符分为三部分,分别表示了user、group、other这三类用户的权限情况: 用十进制数字表示: 读:4 写:2 执行:1 无权限:0 那么问题来了,表示每个权限的数字为什么是”4“、 ”2“、 ”1“,而不是其他数字呢?其实用二进制来解释就很好理解了。在二进制中只有“0”和“1”两种取值,相对应到文件权限上,有权限是“1”,无权限是“0”。假设用户同时具备读、写、执行三种权限,那么按照读、写、执行的顺序排列,可得到一个二进制数“111”,将这个二进制数转换成十进制数就变成了“421”,所以就可以得到每种文件权限对应的十进制数字了,即:读(4)、写(2)、执行(1)。 以上是数字表示单个权限的情况,当数字来表示组合权限时稍显麻烦,但也并不算复杂。举个栗子说明权限表示的规则:还是文件test.txt,三类用户的权限不同,user有这个文件的读(4)、写(2)、执行(1)权限,group有读(4)、执行(1)权限,other只有这个文件的执行(1)权限,用数字来表示就是:“751”。即每位数字是该用户所拥有权限的和,看下图: 综上所述,这两种方法用一个表格总结下来就是这样: 读(read) 写(write) 执行(execute) 字母 r w x 十进制数字 4 2 1 2.查看文件权限 # 查看文件权限, ls -l [文件名] # 查看文件夹权限 ls -ld [文件夹名] 比如查看当前目录下的test.txt这个文本文件的权限信息: ls -l test.txt 结果如下,图中红框部分就是文件权限信息: 查看当前目录下的test文件夹的权限信息: ls -ld test 执行结果: 最前面的“d”表示文档类型,即文件夹,其他的还有: -:普通文档 l:链接文件(link file); b:装置文件里面的可供储存的接口设备(可随机存取装置); c:装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。 后面对应的每一位上,有权限就用权限对应字母表示,若没有权限则用”-“来占位。 查看文件权限时,若省略后面的文件名参数,命令结果就会显示当前目录下的所有文件及文件夹的权限等信息。 查看文件夹权限时,省略文件名参数,命令的执行结果会变成显示当前所在的文件夹的权限信息。 基本介绍完了,接下来就是如何修改文件权限。 3.修改文件权限 修改文件的权限用chmod命令,对于一个文件来说,文件权限的表示方法有字母和数字两种,所以修改权限时就可以有两种方法。 3.1 用字母表示权限等级 举几个例子来说明,假设有一个文件“test”: # 增加group用户的可执行权限 chmod g+x test “+”表示在原来的基础上增加权限 # 删除other用户的可写权限 chmod o-w test “-”表示在原来的基础上删除权限 # 给user用户给test文件的可写、可读、可执行权限 chmod u=rwx test “=”可以给用户直接赋予多个权限 # 假设有文件test,给全部用户增加这个文件的可写权限 chmod a+w test a在这里表示全部用户(user+group+other) 综上来说,这种方式下命令可以简单概括为: chmod [用户]+/-/=[权限] [文件/文件名] [用户]有u(user)、g(group)、o(other)和a(user+group+other) [权限]有r(read)、w(write)、x(execute) 3.2 用数字表示权限等级 继续举例子说明: # 修改文件“test1”的权限为user读、写、执行,group可读,other可执行 chmod 741 test1 # 修改文件夹“test2”的权限为user、group、other均可读写可执行 chmod -R 777 test2 “-R”参数表示对该文件夹下所有的文件及文件夹都执行修改权限操作,即递归执行,一般适用于文件夹操作。 所以这个方式简单概括就是这样的命令形式: chmod [参数选项] [权限] [文件/文件夹] 这里要强调的是,在正式使用的服务器上,请不要给任何一个文件赋予777权限,即任何用户均可读写可执行的权限,会存在较大的安全隐患。
2021年03月12日
3,210 阅读
2 评论
1 点赞
2021-03-07
ubuntu下zerotier的基本使用教程
目录: 前言 1.安装 2.创建一个网络 3.加入一个网络 4.其他操作 (1)手动启动zerotier服务: (2)开机启动: (4)查看本机连接的网络: (5)断开当前加入的网络: 环境说明: 设备:树莓派4B 操作系统:ubuntu 20.10 zerotier版本:1.6.3 前言 zerotier官网:https://www.zerotier.com/ 官方文档:https://zerotier.atlassian.net/wiki/spaces/SD/overview 1.安装 输入以下命令在ubuntu中安装zerotier: curl -s https://install.zerotier.com | sudo bash 2.创建一个网络 首先进入zerotier官网,用邮箱注册一个账号。然后进入网络列表,点击Create A Network按钮创建一个网络,下方列表中会出现一个网络ID,点击网络ID进入即可这个网络的设置界面。 该网络的“setting”选项有如下几个项目需要设置: 其他大部分设置可以保持默认选项不做修改 3.加入一个网络 首先在要连接的Linux设备上输入如下命令加入网络,如果连接成功就会出现200的状态码提示: sudo zerotier-cli join 网络ID # 查看当前连接的网络,如果列表中出现网络号说明连接成功 sudo zerotier-cli listnetworks private属性的网络检测到新设备连接时要手动授权,需要在这个网络的控制台授权新设备连接。未授权之前设备列表是这样: 在前面的列表项上打上勾,即完成授权,设备状态变成这样: 那么这个linux设备就加入到了这个网络中,如果再往这个网络中加入一个设备,这两个设备只要保持运行zerotier且都连接到这同一个网络,即使这两个设备不在同一个局域网内,也能互相访问了。 4.其他操作 (1)手动启动zerotier服务: sudo systemctl start zerotier-one.service (2)开机启动: sudo systemctl enable zerotier-one.service (4)查看本机连接的网络: sudo zerotier-cli listnetworks (5)断开当前加入的网络: sudo zerotier-cli leave 网络ID 以上是zerotier的基本操作,本篇只涉及到Linux平台的操作,由于其他平台的zerotier都有图形化的客户端,操作起来还是比较简单的,所以不再赘述(绝对不是因为我懒)。 这里推荐B站的一个up主的视频,关于zerotier他讲的很详细,可以说是包教包会:https://www.bilibili.com/video/BV1VJ411H7Yv {bilibili bvid="BV1VJ411H7Yv" page=""/}
2021年03月07日
14,544 阅读
2 评论
2 点赞
2021-02-13
【踩坑实录】安装ubuntu+win10双系统之后,系统时间相差8小时
环境说明: ubuntu 20.04 + win10 专业版 问题表现 在笔记本上同时安装了win10和ubuntu双系统之后,发现两个系统上的系统时间相差了8个小时, 解决方法 这是我经常用的一个方法,不需要修改配置文件,只需要在系统控制台中输入: sudo timedatectl set-local-rtc 1 执行完之后重启,然后ubuntu和win10系统的时间就一致了。
2021年02月13日
901 阅读
0 评论
0 点赞
2021-02-04
为ubuntu server20.04 连接wifi
环境说明: Linux:ubuntu server 20.04 简单的上手体验了一下树莓派的32位原生系统RaspberryPi OS之后,直接给树莓派安装了64位的ubuntu server系统,但是在为它连接wifi时,貌似用原来RaspberryPi OS系统连接wifi的方法不管用,所以在查了一些资料之后,便把ubuntu系统连接wifi的方法记录下来,以防忘记。 首先,wifi信息需要进入系统之后,在/etc/netplan的配置文件中更改: cd /etc/netplan # 进入配置文件的目录 ls # 查看配置文件名称,不同机器的配置文件名称不同 sudo nano *****.yaml # 编辑配置文件 按照以下格式补充修改配置文件: network: version: 2 ethernets: eth0: dhcp4: true match: macaddress: b8:27:eb:c6:94:8f set-name: eth0 wifis: wlan0: dhcp4: true access-points: "wifi的ssid": password: "wifi密码" 补充的部分能复制就复制,复制过去直接改成自己的wifi名称和密码就行,因为在实际输入的情况下会出现很多问题(不得不说yaml的语法是真的一言难尽),如果实在没办法去复制的话,在手动输入的情况下要注意以下几个坑: 在yaml语法规则中,要严格按照层次结构进行缩进(在命令行下缩进四个空字符就差不多是下一层); 冒号后面如果不换行的话,那么一定要空一格再输入后面的内容,比如dhcp4: true这句; 关于wifi名称,如果wifi名称不包含空格的话双引号可以省略,否则就必须把wifi名称用双引号括起来 配置完成以后,ctrl+o保存,ctrl+x退出。 # 配置好文件之后 需要执行下面这个命令,查看配置是否有错,如果有错它会自动回滚上次正确配置 sudo netplan try # 没错会让你按enter确认使用这些配置,然后执行这个命令来使配置生效 sudo netplan apply 然后再重启,等到设备连接到wifi就行了。 附上一些更详细的配置:WiFi 配置 ——ubuntu20.04 server
2021年02月04日
2,417 阅读
0 评论
1 点赞
2021-02-03
【踩坑实录】win10下在控制台中无法使用 mysql 命令:mysql : 无法将“mysql”项识别为 cmdlet、函数、脚本文件
环境说明: 系统:win10专业版 mysql 5.7 问题 win10 在使用 mysql 命令登录数据库时,出现报错信息: 解决办法 系统中如果正常安装了 MySQL 的话,没有添加 MySQL 的环境变量的话,在 MySQL 安装目录 bin 文件夹以外的路径下执行 mysql 命令的时候就会报这个错误。解决办法就是添加环境变量: 右键 “开始菜单” -> “系统” -> “高级系统设置” -> “环境变量”,向 Path 中添加环境变量,值为 MySQL 安装目录下的 bin 文件夹: D:\Program\Environment\MySQL\MySQL Server 5.7\bin 配置完之后再使用 mysql 命令时就不报错了
2021年02月03日
2,161 阅读
0 评论
0 点赞
1
2
3
4