技术标签: java 前端bootstrap vue 开发语言
目录
【十一】$modal.confirm中this不起作用问题:
解决方法:【Windows+R】打开命令提示符,查看被占用端口对应的PID:
netstat -aon|findstr "8080" (8080 表示进行查找的端口号)
点击回车,然后继续输入:
tasklist|findstr "19548" (19548 表示根据端口号查找出来的PID)
即可查看到该端口号被什么程序给占用,如图所示“8080”端口号是被java.exe所占用,最后打开任务管理器,切换到详细信息列表,在PID一列查看“19548”对应的程序,可以右击选项结束任务或进行其他操作,点击结束任务即可释放该端口。
/** 获取当前时间 数值为个位数时补0 */
var nowDate = new Date();
var year = nowDate.getFullYear();
var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1 : nowDate.getMonth() + 1;
var day = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate.getDate();
var nowTime = year + "-" + month + "-" + day;//控制台输出为:2022-08-15
// 获取当前时间精确至[年、月、日、时、分、秒]
let nTime = new Date();
let nYear = nTime.getFullYear();
let nMonth = nTime.getMonth() + 1;
let nDay = nTime.getDate();
let nHour = nTime.getHours();
let nMin = nTime.getMinutes();
let nSecond = nTime.getSeconds();
//getDay()方法就是获得这一天的星期码(int类型的),从星期一到星期日的星期码是1,2,3,4,5,6,0。
let nday = nTime.getDay();
提前须知:trigger如何选择:trigger:‘blur’ OR trigger:‘change’ OR 不设置?
【校验规则的使用方式】:
第一种方式:引入外部资源,然后校验中调用
/** 对身份证号的格式进行验证 */
import {validateSfz} from '../../../utils/validatesfz';
export default {
name: "applyInfo",
data() {
return {
rules: {
idCard: [{required: true, validator: validateSfz, trigger: "blur" }]
}
};
},
created() {},
methods: {}
};
第二种方式:内部声明方法,然后校验中调用
/** 校验输入的值只能是数字(整数和小数都可以 不能带+-号) */
export function validateNumber(rule, value,callback) {
if(value==''||value==undefined||value==null){
callback();
}else {
const reg = /^\d+$|^\d+[.]?\d+$/;
if ((!reg.test(value)) && value != '') {
callback(new Error('请输入数字格式的数据'));
} else {
callback();
}
}
}
export default {
name: "applyInfo",
data() {
return {
rules: {
price: [{required: true, validator: validateNumber, trigger: "blur" }]
}
};
},
created() {},
methods: {}
};
第三种方式:在参数中声明验证方法,在校验中调用
/** vue中 使用表单校验密码输入是否一致 */
export default {
data() {
const equalToPassword = (rule, value, callback) => {
if (this.user.newPassword !== value) {
callback(new Error("两次输入的密码不一致"));
} else {
callback();
}
};
return {
user: {
oldPassword: undefined,
newPassword: undefined,
confirmPassword: undefined,
email: undefined
},
// 表单校验
rules: {
oldPassword: [
{ required: true, message: "旧密码不能为空", trigger: "blur" }
],
newPassword: [
{ required: true, message: "新密码不能为空", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
],
confirmPassword: [
{ required: true, message: "确认密码不能为空", trigger: "blur" },
{ required: true, validator: equalToPassword, trigger: "blur" }
],
email: [
{ type: "email",message: "请输入正确的邮箱地址",trigger: ["blur", "change"]}
]
}
};
},
methods: {}
};
【IP地址的校验规则】
let regexp = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
let regexp = /^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$/;
let regexp = /^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$/;
【手机号码的校验规则】
const reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
const reg = /^[1][3-9][0-9]{9}$/;
【固话的校验规则】
const reg = /^0\d{2,3}-?\d{7,8}$/;
【身份证号码的校验规则】
const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
【邮箱的校验规则】
const reg = /^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+\.[a-z]+$/;
【密码的校验规则】
const reg = /^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$)([^\u4e00-\u9fa5\s]){6,20}$/;
(6-20位英文字母、数字或者符号(除空格),且字母、数字和标点符号至少包含两种)
【中文的校验规则】
const reg = /^[\u0391-\uFFE5A-Za-z]+$/;
【纯数字或者小数的校验规则】
const reg = /^\d+$|^\d+[.]?\d+$/;(不能带+-号 可以以0开头)
const reg = /^[+-]?(0|([1-9]\d*))(\.\d+)?$/;(可以带+-号 除非本就0,否则不能以0开头)
Js 正则表达式特殊字符含义:
字符 匹配
\o null
\t 制表符
\n 换行符
\v 垂直制表符
\f 换页符
\r 回车符
\xnn 由十六进制nn指定的拉丁字符 如\xoA等价于\n
\uxxx 有十六进制数xxxx指定的Unicode字符,如\u00009等价于\t
\cX 控制字符^X,如\cJ等价于\n
[…] 方括号内的任意字符
[^…] 不在方括号内的任意字符
. 除换行符和其他Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词 等价于[a-zA-Z0-9]
\W 任何非ASCII字符组成的单词 等价于[^a-zA-Z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符
\d 任何ASCII数字 等价于[0-9]
\D 除了ASCII数字之外的任何字符 等价于[^0-9]
{n,m} 匹配前一项至少n次,但不能超过m次
{n, } 匹配前一项n次或更多次
{n } 匹配前一项n次
? 匹配前一项0次或1次 等价于{0,1}
+ 匹配前一项1次或多次 等价于{1,}
* 匹配前一项0次或多次 等价于{0,}
| 选择,匹配的是该符号左边的子表达式或右边的子表达式
(…) 组合,将几个项组合为一个单元,这个单元可通过*,+,?,|等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?:…) 只组合,把项组合到一个单元,但不记忆与该组相匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,(?:形式的分组不编码
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置(注意:[\b]匹配的是退格符)
\B 匹配一个非单词的边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽正向先行断言,要求接下来的字符都与不p匹配
用于模式匹配的string方法:
Search(regx):返回第一个与之匹配的子串的起始位置,如果找不到匹配的子串,返回-1
Replace(regx,replacestr):检索和替换
Match(regx):返回的是一个有匹配结果组成的数组
Split(regx):返回的是分割后的数组
Validate默认的常用校验:
拓展应用:根据身份证号获取年龄和性别
/** 根据身份证号获取年龄 */
function getIdCardByAge(idCard) {
var pat = /^\d{6}(((19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{3}([0-9]|x|X))|(\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{3}))$/;
if(!pat.test(idCard)){
$('#age').val('');
$('#sex').val(0);
$.modal.alert("请输入正确的身份证号!", "warning");
return null;
}
if (idCard != null && idCard != '') {
//获取年龄
var myDate = new Date();
var month = myDate.getMonth() + 1;
var day = myDate.getDate();
var age = myDate.getFullYear() - idCard.substring(6, 10) - 1;
if (idCard.substring(10, 12) < month || idCard.substring(10, 12) == month && idCard.substring(12, 14) <= day) {
age++;
}
if(age <= 0){
age = 1;
}
$('#age').val(age);
var gender = idCard.slice(14, 17) % 2 ? "0" : "1"; // 1代表男性,2代表女性'
$('#sex').val(gender);
}
}
输入框中只能输入数字或者小数点
<!-- 第一种:在输入框中输入值后直接清除“数字”和“.”以外的字符 -->
<el-form-item label="金 额" prop="price">
<el-input v-model="form.price" @change="updatePrice" placeholder="请输入金额">
<template slot="append">元</template>
</el-input>
</el-form-item>
export default {
data() {
return {
// 表单参数
form: {
price: null
}
};
},
methods: {
updatePrice(){
this.form.price = this.form.price.replace(/[^\d\.]/g, ''); //清除“数字”和“.”以外的字符
},
}
};
<!-- 第二种:在表单校验中添加数字校验,非数字的给出错误提示 -->
<el-form :inline="true" :model="form" :rules="rules" class="demo-form-inline">
<el-form-item label="金 额" prop="price">
<el-input v-model="form.price" placeholder="请输入金额">
<template slot="append">元</template>
</el-input>
</el-form-item>
</el-form>
<script>
export default {
data() {
return {
form: {
price: null
},
// 表单校验
rules: {
price: [{pattern: /^(0|([1-9]\d*))(\.\d+)?$/, message: "请输入数字格式的数据", trigger: "blur"}]
}
},
methods: {}
}
</script>
//一般放在watch下,监听列表数据变动,永远默认全部行都选中
watch:{
'XXXList':function(val){
//列表默认全选
this.$nextTick(() => {
val.forEach(row => {
this.$refs.XXXTable.toggleRowSelection(row, true);
});
});
}
}
const data = this.$refs.XXXTable.selection;
console.log("选中了【"+data.length+"】条数据");
console.log("选中的数据为:"+JSON.stringify(data));
使用Vue开发时,在函数中改变了页面中的某个值,在函数中查看是修改成功了,但在页面中没有及时刷新改变后的值,执行下面这个方法,强制刷新数据 :this.$forceUpdate()
eg:itemTypeChange(data){
this.$forceUpdate();
let obj = {};
obj = this.itemTypeOptions.find((item)=>{
return item.id === data;
});
this.form.itemType=obj.typeName;
}
<style lang="scss">
// #XXX 是为想要设置文本框内容居中的区域设置的id
// 即在 id="orderGroupForm" 区域内使用el-input是且size=small的文本框中内容居中
#orderGroupForm .el-input--small .el-input__inner {
text-align: center;
}
</style>
变为
this.$refs['form'].clearValidate();//只清除表单验证消息,不清除表单内容
this.$refs['form'].resetFields();//清除表单内容和清除表单验证消息
//清除表单验证消息不起作用时,可尝试
setTimeout(() => {
this.$refs["form"].clearValidate();// 定时器执行
}, 30);
或者
this.$nextTick(function () {
this.$refs['form'].clearValidate();// 延时执行
})
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList"/>
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" layout="total, prev, pager, next"/>
this.$modal.confirm('是否确认登记?').then(function (){ updatePerson(this.form).then(response => { this.$modal.msgSuccess("确认登记成功"); this.XXXList(); }); }).catch(() => {}); 上面这种方式,使用时会发现方法执行完后,该有的弹窗提示和刷新表格没起作用,即通过this调用的方法,都失效了,将 function (){} 变为 () => {},即可解决这个问题: this.$modal.confirm('是否确认登记?').then(() => { updatePerson(this.form).then(response => { this.$modal.msgSuccess("确认登记成功"); this.XXXList(); }); }).catch(() => {});
/* 当单元格hover进入时,字体颜色改变 */
#XXXTable .el-table__body tr:hover > td{
color: black !important;
}
<el-form :inline="true" :model="form" :rules="rules" class="demo-form-inline">
<el-form-item label="开始时间" prop="startTime">
<el-date-picker v-model="form.startTime" type="date" value-format="yyyy-MM-dd"
:picker-options="pickerBeginDateBefore" clearable placeholder="请选择开始时间"/>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker v-model="form.endTime" type="date" value-format="yyyy-MM-dd"
:picker-options="pickerAfterDateBefore" clearable placeholder="请选择结束时间"/>
</el-form-item>
</el-form>
<script>
export default {
data() {
return {
pickerBeginDateBefore: {
disabledDate(time) {
return time.getTime() > Date.now();//只能选择今天以及今天之前的时间
}
},
pickerAfterDateBefore: {
disabledDate(time) {
return time.getTime() < Date.now()- 8.64e7;//只能选择今天以及今天之后的时间
}
},
form: {
startTime: null,
endTime: null
},
// 表单校验
rules: {
startTime: [{ required: true, message: "开始时间不能为空", trigger: "blur" }],
endTime: [{ required: true, message: "结束时间不能为空", trigger: "blur" }]
}
},
methods: {}
}
</script>
文章浏览阅读67次。目标:使用片段参数将字符串值从TextView传递到新片段TextView,但在FragmentPagerAdapter中使用具有不同布局/片段的ViewPager时.问题:新片段永远不会从前一个片段接收片段参数.我的设置:我的Activity托管了ViewPager和FragmentPagerAdapter.我重写了FragmentPagerAdapters getItem(int positi..._java访问视图传参
文章浏览阅读1w次,点赞4次,收藏12次。Android file类使用详解-SDcard_sdcard_print_file
文章浏览阅读1.2w次,点赞7次,收藏63次。用CMake来组织的工程中要用Qt首先要设置、找到Qt相关模块。主要是通过find_package这个CMake命令。但网上很多教程都过时了,或者不够清晰灵活。因为这部分很常用,所以特别用一篇文章把我们目前在生产环境中使用的方法给大家介绍下。设置Qt库路径Qt版本很多,我们的开发机上一般也装有多个不同版本的Qt。个人尝试性的项目一般用最新版的Qt,而真正发布的产品一般用的是LTS版本Qt(LTS:Long Term Support,长期支持版本,目前最新的LTS是5.9)。我们的方法是在系统中添_cmake测试代码中能定义qt类吗
文章浏览阅读2.2k次,点赞4次,收藏5次。Linux环境编译DCMTK源码,生成动态库文件和可执行文件_dicom动态库
文章浏览阅读416次。ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement.对于上述错误,相信对于第一次执行 MySQL 数据导出操作的同学大都会遇见。至于为什么会遇到这个错误,原因很简单,那就是:我们不知道 MySQL 默认的_mysql 导出select 数据 --secure-file-priv
文章浏览阅读854次,点赞20次,收藏17次。状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式。一只小老鼠要把它们都吃掉,问至少要跑多少距离?输出一行一个实数,表示要跑的最少距离,保留。第一行有一个整数,表示奶酪的数量。行,每行两个实数,第。对于全部的测试点,保证。,两点之间的距离公式为。_p1433状态dp
文章浏览阅读1.6k次。作者/排版/审核:陈明导读 问卷星是当前被广泛使用的线上问卷调查平台,特别是疫情期间,其快捷、易用、低成本的明显优势再度突出。一般而言,问卷调查的基本步骤包括:设计问卷→发放问卷→收集问卷→下载数据→分析数据。前期我们已经对问卷星的操作与使用进行了简单介绍,那么当数据收集完成后,如何将其导出、筛选以及初步分析值得我们进一步探索。解析 1、数据导出:登录问卷星网页→分析&下载→查看..._问卷星导出数据表格筛选怎么弄?
文章浏览阅读1.4k次。我们都知道,考研是为了能让自己在学术领域上得到更深造诣,那么要如何才能够在读研期间真正学习到知识、真正体现读研价值,导师无疑是至关重要的一环!1.科研能力研究生的科研能力是在导师的指导下形成的,如果导师的科研能力不行,仅靠自己要想在某方面有所建树就会比较困难。另外,报考前应该尽量对导师的科研项目和科研经费有一些了解。看看导师的科研经费是否充足,科研课题是否比较多,是否比较前沿。2.科研方..._选导师发短信的格式怎么比较礼貌
文章浏览阅读1.2k次。Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar,一般有三种思路来完成。_android mprogress_horizontal
文章浏览阅读1.2w次。[b][size=medium]zookeeper的身份认证有4种方式[/size][/b](1)world: 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的 (2)auth: 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过ker..._zookeeper 权限信息放哪里
文章浏览阅读8.7k次,点赞2次,收藏8次。SpringMVC——核心技术:异常处理(@ExceptionHandler、@ControllerAdvice)_spring @exceptionhandler message
文章浏览阅读3.6k次。实验五 文件系统1 实验简介本实验要求在模拟的I/O系统之上开发一个简单的文件系统。用户通过create, open, read等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0至L − 1。2 I/O系统实际物理磁盘的结构是多维的:有柱面、磁头、扇区等概念。I/O系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为..._i/o磁盘实验报告