mysql> show databases;
--------------------
| Database |
--------------------
| information_schema |
| website |
--------------------
mysql> create database website;
Query OK, 1 row affected (0.04 sec)
mysql> create database if not exists website;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE database if not exists website character set utf8;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> drop database if exists website;
Query OK, 0 rows affected (0.00 sec)
mysql> use website;
Database changed
display: 指定 HTML 元素的盒子类型
flex-direction: 指定弹性盒子中子元素的排列方式
flex-wrap: 设置当弹性盒子的子元素超出父容器时是否换行
flex-flow: flex-direction 和 flex-wrap 两个属性的简写
justify-content: 设置弹性盒子中元素在主轴(横轴)方向上的对齐方式
align-items: 设置弹性盒子中元素在侧轴(纵轴)方向上的对齐方式
align-content: 修改 flex-wrap 属性的行为,类似 align-items,但不是设置子元素对齐,而是设置行对齐
order: 设置弹性盒子中子元素的排列顺序
align-self: 在弹性盒子的子元素上使用,用来覆盖容器的 align-items 属性
flex: 设置弹性盒子中子元素如何分配空间
flex-grow: 设置弹性盒子的扩展比率
flex-shrink: 设置弹性盒子的收缩比率
flex-basis: 设置弹性盒子伸缩基准值
/*边框的宽度*/
border-width:3px;
/*上边框的宽度*/
border-top-width:3px;
/*右边框的宽度*/
border-right-width:3px;
/*下边框的宽度*/
border-bottom-width:3px;
/*左边框的宽度*/
border-left-width :3px;
/*边框的颜色*/
border-color: #eee;
/*上边框的颜色*/
border-top-color: #eee;
/*右边框的颜色*/
border-right-color: #eee;
/*下边框的颜色*/
border-bottom-color: #eee;
/*左边框的颜色*/
border-left-color: #eee;
/*边框的样式*/
border-style: solid;
/*上边框的样式*/
border-top-style: solid;
/*右边框的样式*/
border-right-style: solid;
/*下边框的样式*/
border-bottom-style: solid;
/*左边框的样式*/
border-left-style: solid;
// 今天开始
strtotime('today');
// 今天结束
strtotime('today 23:59:59');
// 昨天开始
strtotime('yesterday');
// 昨天结束
strtotime('yesterday 23:59:59');
// 本周开始
strtotime('last Monday');
// 本周结束
strtotime('sunday 23:59:59');
// 本月开始
strtotime(date("Y-m-01"));
// 本月结束
strtotime(date("Y-m-t"));
PHP默认时区是UTC,在使用PHP获取系统时间,会发现时间不对,所以需要把时区设置为北京时区UTC。
打开php.ini文件:
查找date.timezone,找到date.timezone =”UTC”,
将其改为date.timezone ="PRC",若date.timezone左边有分号,要将该分号去掉。
<?php
echo "当前时间:" . date("Y-m-d H:i:s")
?>
<?php
date_default_timezone_set('PRC');
echo date("Y-m-d H:i:s");
?>
match用来在一个字符串中查找匹配的子串,并返回一个包含匹配结果的数组。match()方法可以接收一个参数,这个参数可以是正则表达式对象或者一个字符串。
var str = 'HTML(小括号)的全称为[中括号]超文本【中文中括号】标记语言,是一种{花括号}标记语言。'
var reg1 = /\((. ?)\)/g // () 小括号
var reg2 = /\[(. ?)\]/g // [] 中括号
var reg3 = /\【(. ?)\】/g // 【】中文大括号
var reg4 = /\{(. ?)\}/g // {} 花括号
str.match(reg1) // ['(小括号)']
str.match(reg2) // ['[中括号]']
str.match(reg3) // ['{花括号}']
str.match(reg4) // ['【中文中括号】']
var str = 'HTML(小括号)的全称为[中括号]超文本【中文中括号】标记语言,是一种{花括号}标记语言。'
var reg1 = /(?<=\()(. ?)(?=\))/g // () 小括号
var reg2 = /(?<=\[)(. ?)(?=\])/g // [] 中括号
var reg3 = /((?<=\【)(. ?)(?=\】))/g // 【】中文大括号
var reg4 = /(?<=\{)(. ?)(?=\})/g // {} 花括号,大括号
str.match(reg1) // ['小括号']
str.match(reg2) // ['中括号']
str.match(reg3) // ['中文中括号']
str.match(reg4) // ['花括号']
distinct可以去除select查询结果中的重复行。
select distinct username from user;
group by能够将select查询结果按照指定列分组,并对每组进行聚合运算。
select * from user group by username;
用户在登录时,数据传输过程中如果密码使用的是明文,那么在报文被拦截之后是可以直接获取传输的数据,所以明文密码在传输时被拦截是十分危险,因此在传输密码前前端需要对密码进行加密。
npm install js-md5
import md5 from 'js-md5'
// 密码
let password="123456"
// 盐值
let solt = 'yanzhi'
// 普通的md5加密
md5(password)
// 双重md5加密
md5(md5(password))
// md5加盐solt加密算法
md5(solt password)
md5(password solt)
md5(solt password solt)
md5(md5(password) solt)
md5(solt md5(password))
通过扩展运算符,在对象最后一个命名参数以...为前缀,则它将成为一个由剩余参数组成的对象,所以将要删除的属性结构出来,剩余的通过...带上新的参数名,则新的参数名就是新的对象
// 删除user对象下的qq和电话属性字段
let user = {
name: 'shenghao',
age: 13,
sex: '男',
province: '广东省',
cidy: '广州市',
address: '天河区',
qq: '365121369',
phone: '15000000000',
}
let { qq, phone, ...info } = user
通过对象解构后info值是:
{
"name": "shenghao",
"age": 13,
"sex": "男",
"province": "广东省",
"cidy": "广州市",
"address": "天河区"
}
1、beforeCreate:这个阶段实例已经初始化,只是数据观察与事件机制尚未形成,不能获取DOM节点(没有data,没有el)
使用场景:因为此时data和methods都拿不到,所以通常在实例以外使用
2、created:实例已经创建,仍然不能获取DOM节点(有data,没有el)
使用场景:模板渲染成html前调用,此时可以获取data和methods,so 可以初始化某些属性值,然后再渲染成视图,异步操作可以放在这里
1、beforeMount:是个过渡阶段,此时依然获取不到具体的DOM节点,但是vue挂载的根节点已经创建(有data,有el)
2、mounted:数据和DOM都已经被渲染出来了 使用场景:模板渲染成html后调用,通常是初始化页面完成后再对数据和DOM做一些操作,需要操作DOM的方法可以放在这里
1、beforeUpdate:检测到数据更新时,但在DOM更新前执行
2、updated:更新结束后执行
使用场景:需要对数据更新做统一处理的;如果需要区分不同的数据更新操作可以使用$nextTick
1、beforeDestroy:当要销毁vue实例时,在销毁前执行
2、destroyed:销毁vue实例时执行
// 实例化对象
const speakMsg = new SpeechSynthesisUtterance()
// 设置在说话时将合成的文本内容。
speakMsg.text = speech;
// 设置话语的语言。 例如:“zh-cn”表示中文
speakMsg.lang = "zh-CN";
// 设置将在其中发言的音量。区间范围是0到1,默认是1
speakMsg.volume = 1;
// 设置说话的速度。默认值是1,范围是0.1到10,表示语速的倍数,例如2表示正常语速的两倍
speakMsg.rate = 1;
// 设置说话的音调(音高)。范围从0(最小)到2(最大)。默认值为1
speakMsg.pitch = 10;
//音高:0-1
// 方法调用
window.speechSynthesis.speak(speakMsg)
先将两个数组合并再通过Set()去重
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [4, 5, 6, 7, 8]
let result = [...new Set(arr1.concat(arr2))]
console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8]
先合并和排序,然后通过reduce参数进行对比,判断上一个和当前元素不相同时,就push到新的数组中。
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [4, 5, 6, 7, 8]
let arr = [...arr1, ...arr2].sort()
let result = [arr[0]]
arr.reduce((pre, now) => {
if (pre !== now) {
result.push(now)
}
return now
})
console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8]
将数组转成JSON对象,数组每个元素都作为对象的键和值,如果元素相同,则对象键和值会覆盖,达到去重效果,接着再使用Object.values提取对象的值返回一个新的数组。
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [4, 5, 6, 7, 8]
let obj = {}
arr1.forEach((item) => {
obj[item] = item
})
arr2.forEach((item) => {
obj[item] = item
})
let result = Object.values(obj)
console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8]
两个数组进行for循环嵌套,然后判断元素是否相等,如果相等就push到新的数组中。
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [4, 5, 6, 7, 8]
let intersection = []
for (let i = 0; i < arr1.length; i ) {
for (let j = 0; j < arr2.length; j ) {
if (arr1[i] === arr2[j]) {
intersection.push(arr1[i])
}
}
}
console.log(intersection) // [4, 5]
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [4, 5, 6, 7, 8]
console.log(arr1.filter((item) => arr2.includes(item))) // [4, 5]
先合并和排序,然后通过reduce参数进行对比,判断上一个和当前元素相同时push到新的数组中。
let arr1 = [1, 2, 3, 4, 5]
let arr2 = [4, 5, 6, 7, 8]
let arr = arr1.concat(arr2).sort()
let intersection = []
arr.reduce((pre, now) => {
if (pre === now) {
intersection.push(now)
}
return now
})
console.log(intersection) // [4, 5]
json_decode()函数将json字符串$json解析为php数组"$decoded_json"。第二个参数"true"表示返回的结果为数组而不是对象。
<?php
$json = '{"name": "shenghao", "age": 3, "city": "广州"}';
// 第二个参数用于返回数组代替对象
$decoded_json = json_decode($json, true);
// 返回结果为数组:
Array( 'name' => 'shenghao', 'age' => 3, 'city' => '广州');
?>
json_encode()用于对变量进行JSON编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE 。
<?php
$arr = Array( 'name' => 'shenghao', 'age' => 3, 'city' => '广州');
$encoded_json = json_encode($arr);
// 返回结果为json:
{"name":"shenghao","age":3,"city":"广州"}
?>
1、提示:指令v-if和v-for不能用在同一个标签上,否则性能会消耗很大。
2、原因:如果写在同一标签,会先对所有数据进行以下操作,就是一边循环一边执行v-if,循环中多次对 DOM 元素进行添加或删除,这样会造成大量的性能消耗
3、优先级:v-for 优先级 高于v-if
<div v-for="(item, index) in dataList" :key="index">
<div v-if="item.status">
{{item.name}}
</div>
</div>
4、解决办法
1.不要把v-for和v-if 写在同一个标签上,而是新建div引入v-for包裹v-if
2.使用v-show代替v-if
v-show指令是操作css样式display属性,用来控制DOM元素显示和隐藏。
v-if指令是对页面上DOM节点的添加与删除
从效果上来看是一样,都是设置DOM元素的展示隐藏。但是它们的性质是不一样,一个是设置display属性值,一个是操作DOM元素添加和删除。它们之间可以同时使用是没有冲突。
<!-- v-if指令 -->
<div v-if="status"></div>
<!-- v-if指令 -->
<div v-show="show"></div>
<!-- v-if和v-show指令 -->
<div v-if="status" v-show="show"></div>
创建:新的标签(元素节点) = document.createElement("标签名")
删除:父节点.removeChild(子节点);
插入:insertBefore(新插入的节点,参照物节点) 往某个节点的前面插入一个新的节点
追加:appendChild(新的节点的名) 当前对象追加一个子节点
1.行内绑定:在标签上写οnclick=“事件名”
<button onclick="handleClick">Click Me</button>
2.在script中绑定
document.getElementById("标签").onclick=function(){
/* 函数体 */
}
3.绑定事件监听函数
绑定事件的第三种方法是用addEventListener()或者attachEvent()来绑定事件监听函数
元素选择器.addEventListener(事件名(click,keydown...), 回调函数, true捕获/false冒泡);
移除事件监听
document.getElementById("选择的标签").removeEventListenner('click')
let date = new Date(); // 获取中国标准时间
date.getFullYear(); / /获取完整的年份(4位)
date.getMonth(); // 获取当前月份(0-11,0代表1月)
date.getDate(); // 获取当前日(1-31)
date.getDay(); // 获取当前星期(0-6,0代表星期天)
date.getTime(); // 获取当前时间的时间戳
date.getHours(); // 获取当前小时数(0-23)
date.getMinutes(); // 获取当前分钟数(0-59)
date.getSeconds(); // 获取当前秒数(0-59)
date.getMilliseconds(); //获取当前毫秒数(0-999)
date.toLocaleDateString(); // 获取当前日期
date.toLocaleTimeString(); // 获取当前时间
date.toLocaleString(); // 获取当前日期与时间
date.setFullYear(); // 设置年份信息 获取该年份当前月日时分秒的时间戳
date.setMonth(); // 设置月份信息 获取该月份当前年日时分秒的时间戳 (0-11,0代表1月)
date.setDate(); // 设置日信息 获取该日当前年月时分秒的时间戳
date.setHours(); // 设置小时信息 获取该小时当前年月日分秒的时间戳
date. setMinutes(); // 设置分信息 获取该分当前年月日时秒的时间戳
date.setSeconds(); // 设置秒信息 获取该秒当前年月日时分的时间戳
判断navigator.clipboard是否为undefined,因为navigator.clipboard对象只能在安全网络环境中才能使用,比如在localhost或者https中才能正常使用,直接用ip地址和http访问出现undefined,所以需要表单元素来实现。
HTML部分
<body>
<button id="copy">复制</button>
<div id="text">你好啊</div>
</body>
JavaScript部分
<script>
var copy = document.getElementById('copy')
copy.onclick = function copy(e) {
var text = document.getElementById('text')
if (navigator.clipboard && window.isSecureContext) {
return navigator.clipboard.writeText(text.innerHTML)
} else {
let input = document.createElement('input')
document.body.appendChild(input)
input.value = text.innerHTML
input.focus()
input.select()
if (document.execCommand('copy')) {
document.execCommand('copy')
}
input.blur()
document.body.removeChild(input)
}
}
</script>
图片不存在会触发onerror事件,我们通过触发该事件后进行以下方式处理。
1、把图片元素隐藏
<img src="图片地址" onerror="this.style.display='none'" />
2、替换成默认图片
<img src="图片地址" onerror="this.src='默认图片的地址'" />
先确定某一日期,再转换成时间戳,然后通过date函数根据时间戳来获取该月的第一天和最后一天
1、默认时间
$date = "2022-06-30";
2、开始时间
date("Y-m-01", strtotime($date));
3、结束时间
date("Y-m-t", strtotime($date));
1、行内样式表
<div style="width: 100px; height: 100px">style属性的设置</div>
2、内部样式表
<div class="box">类标签设置</div>
3、外部样式表
<!-- CSS链接样式 -->
<link type="text/css" rel="styleSheet" href="/css.css" />
<!--CSS导入式 -->
<link type="text/css" rel="styleSheet" href="/css.css" />
<style type="text/css">
@import url("/css.css");
</style>
1、校验手机号码
// 正则
const regex = /^1[3456789]d{9}$/;
2、校验邮箱地址
// 正则
const regex = /^w ([- .]w )*@w ([-.]w )*.w ([-.]w )*$/;
3、校验身份证号码
// 身份证号码为15位或18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
const regex =
/^[1-9]d{5}(19|20)d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])d{3}[0-9Xx]$/;
4、校验密码强度
// 正则
const regex = /^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]{6,20})$/;
5、校验 URL 地址
// 正则
const regex = /^(http|https)://([w-] .) [w-] (:d )?(/S*)?$/;
6、校验 IP 地址
const regex =
/^([01]?d{1,2}|2[0-4]d|25[0-5]).([01]?d{1,2}|2[0-4]d|25[0-5]).([01]?d{1,2}|2[0-4]d|25[0-5]).([01]?d{1,2}|2[0-4]d|25[0-5])$/;
7、校验中文名
// 正则
const regex = /^[u4e00-u9fa5]{2,4}$/;
8、校验首位不为零的数字
// 正则
const regex = /^[1-9]d*$/;
9、校验只允许字母和数字
// 正则
const regex = /^[A-Za-z0-9] $/;
1、声明页数和页码
let page=1 let size=10 let dataList []
2、通过数组slice方法截取
dataList.slict((page-1)*size, (page-1)*size size)
起始位置:(page-1)*size
终止位置: (page-1)*size size)
根据数组索引位置截取来实现翻页效果
当page=1截取的位置是0到9
当page=2截取的位置是10到19
当page=3截取的位置是20到29
上传背景图片并拖拽调整图片,找到适合部分然后裁剪作为个人用户头像背景图。
// 拖拽图片
function onmousedown(ev: any) {
ev.preventDefault()
let oevent = ev || event
let distanceX = oevent.clientX //鼠标点击位置
let distanceY = oevent.clientY //鼠标点击位置
//dX和dY是鼠标在pic内的相对位置
//在移动后,设置图片的外边距,利用负外边距移动图片
...
//导入模块是require 类似于import java.io
const http = require('http')
//创建httpserver服务
http
.createServer(function (request, response) {
//告诉浏览器将以text-plain去解析hello server
response.writeHead(200, { 'Content-type': 'text/plain' })
//输出内容给浏览器
response.end('hello server!!!')
})
.listen(8888)
console.log('你启动的服务是:http://localhost:8888')
//监听端口8888
//启动运行服务器node httpserver.js
//浏览器访问http://localhost:8888
通过ES6 Set方法去重,再判断去重后的数组长度是否等于1
let arr = [23, 23, 23, 23, 23, 23, 23];
let item = [...new Set(arr)];
if(item.length === 1){
console.log("true")
}else{
console.log("false")
}
1、快速创建HTML基础代码
输入!后按Tab键
2、快速复制一行
快捷键: shift alt 下箭头/上箭头 或者 ctrl c 然后 ctrl v
3、撤销还原快捷键
Ctrl Z: 撤销,Ctr Y:还原
4、单文件查询和多文件查询
快捷键:Ctrl F:单文件查询 Shift Ctr F:多文件查询
...
pointer-events: none; 是看得到却摸不着,点击不到,点击会穿透触发到下层元素的css属性。
<div style="pointer-events: none;"></div>
双鱼座是十二宫最后一个星座,他集合了所有星座的优缺点于一身,同时受水象星座的情绪化影响,使他们原来复杂的性格又添加了更复杂的一笔。双鱼座的人最大的优点是有一颗善良的心,他们愿意帮助别人,甚至是牺牲自己。
水瓶座的人很聪明,他们最大的特点是创新,追求独一无二的生活,个人主义色彩很浓重的星座。他们对人友善又注重隐私。水瓶座绝对算得上是”友谊之星“,他喜欢结交每一类朋友,但是确很难与他们交心,那需要很长的时间。他们对自己的家人就显得冷淡和疏远很多了。
摩羯座是十二星座中最有耐心,为事最小心、也是最善良的星座。他们做事脚踏实地,也比较固执,不达目的是不会放手的。他们的忍耐力也是出奇的强大,同时也非常勤奋。他们心中总是背负着很多的责任感,但往往又很没有安全感,不会完全地相信别人。
射手座崇尚自由,勇敢、果断、独立,身上有一股勇往直前的劲儿,不管有多困难,只要想,就能做,你的毅力和自信是难以击倒的。射手男酷爱自由,讨厌被束缚,射手女性格简单直接,不耍心计,可是任性。
天蝎座精力旺盛、占有欲极强,对于生活很有目标,不达到目的誓不罢休,复仇心理重,记仇会让自己不顾一切报复曾经伤害过你的人。天蝎男自我主义色彩很强烈,天蝎女的自我保护意识很强,不容易接近。
天秤座常常追求平等、和谐,擅于察言观色,交际能力很强,因此真心朋友不少,因为你也足够真诚,但是最大的缺点就是面对选择总是犹豫不决。天秤男容易在乎自己而忽略别人,天秤女就喜欢被陪伴的感觉。
处女座虽然常常被黑,但你还是依然坚持追求自己的完美主义,因为在你看来,生活不能将就,追求的完美更不能将就,有目标才有进步,当然也需要鼓励。处女男的毅力很强,能坚持,处女女的求知欲很强。
狮子座有着宏伟的理想,总想靠自己的努力成为人上人,你向往高高在上的优越感,也期待被仰慕被崇拜的感觉,有点儿自信有点儿自大。狮子男的大男人气息很重,爱面子,狮子女热情阳光,对朋友讲义气。
巨蟹座的情绪容易敏感,也缺乏安全感,容易对一件事情上心,做事情有坚持到底的毅力,为人重情重义,对朋友、家人都特别忠实,巨蟹男是一等一的好男人,顾家爱家人,巨蟹女充满母性光环,非常有爱心。
双子座喜欢追求新鲜感,有点儿小聪明,就是耐心不够,往往做事都是三分钟热度,难以坚持,但是你的可爱性格会让很多人都喜欢跟你做朋友。双子男表面很花心,其实深情,而双子女就喜欢求新和求变。
金牛座很保守,喜欢稳定,一旦有什么变动就会觉得心里不踏实,性格也比较慢热,但你是理财高手,对于投资理财都有着独特的见解。金牛男的性格有点儿自我,而金牛女就喜欢投资自己,想要过得更好。
白羊座有一种让人看见就觉得开心的感觉,因为总是看起来都是那么地热情、阳光、乐观、坚强,对朋友也慷概大方,性格直来直往,就是有点小脾气。白羊男有大男人主义的性格,而白羊女就是女汉子的形象
应用场景Set用于数据重组,Map用于数据储存
Set:
(1)成员不能重复
(2)只有键值没有键名,类似数组
(3)可以遍历,方法有add, delete,has
Map:
(1)本质上是健值对的集合,类似集合
(2)可以遍历,可以跟各种数据格式转换
forEach更多的用来遍历数组
for in 一般常用来遍历对象或json
for of数组对象都可以遍历,遍历对象需要通过和Object.keys()
for in循环出的是key,for of循环出的是value