0%

库管理

克隆库

1
2
git clone https://github.com/php/php-src.git
git clone --depth=1 https://github.com/php/php-src.git # 只抓取最近的一次 commit

历史管理

查看历史

1
2
git log --pretty=oneline filename # 一行显示
git show xxxx # 查看某次修改

标签功能

1
2
3
4
5
6
7
8
git tag # 显示所有标签
git tag -l 'v1.4.2.*' # 显示 1.4.2 开头标签
git tag v1.3 # 简单打标签
git tag -a v1.2 9fceb02 # 后期加注标签
git tag -a v1.4 -m 'my version 1.4' # 增加标签并注释, -a 为 annotated 缩写
git show v1.4 # 看某一标签详情
git push origin v1.5 # 分享某个标签
git push origin --tags # 分享所有标签

回滚操作

1
2
git reset 9fceb02 # 保留修改
git reset 9fceb02 --hard # 删除之后的修改

取消文件的修改

1
2
git checkout -- a.php #  取消单个文件
git checkout -- # 取消所有文件的修改

删除文件

1
2
git rm a.php  # 直接删除文件
git rm --cached a.php # 删除文件暂存状态

移动文件

1
git mv a.php ./test/a.php

查看文件修改

1
2
git diff          # 查看未暂存的文件更新 
git diff --cached # 查看已暂存文件的更新

暂存和恢复当前staging

1
2
3
4
5
git stash # 暂存当前分支的修改
git stash apply # 恢复最近一次暂存
git stash list # 查看暂存内容
git stash apply stash@{2} # 指定恢复某次暂存内容
git stash drop stash@{0} # 删除某次暂存内容

修改 commit 历史纪录

1
git rebase -i 0580eab8

分支管理

创建分支

1
2
git branch develop # 只创建分支
git checkout -b master develop # 创建并切换到 develop 分支

合并分支

1
2
3
4
git checkout master # 切换到 master 分支
git merge --no-ff develop # 把 develop 合并到 master 分支,no-ff 选项的作用是保留原分支记录
git rebase develop # rebase 当前分支到 develop
git branch -d develop # 删除 develop 分支

克隆远程分支

1
2
git branch -r # 显示所有分支,包含远程分支
git checkout origin/android

修复develop上的合并错误

  1. 将merge前的commit创建一个分之,保留merge后代码
  2. 将develop reset --force到merge前,然后push --force
  3. 在分支中rebase develop
  4. 将分支push到服务器上重新merge

强制更新到远程分支最新版本

1
2
git reset --hard origin/master
git submodule update --remote -f

Submodule使用

克隆带submodule的库

1
git clone --recursive https://github.com/chaconinc/MainProject

clone主库后再去clone submodule

1
2
3
git clone https://github.com/chaconinc/MainProject
git submodule init
git submodule update

Git设置

Git的全局设置在~/.gitconfig中,单独设置在project/.git/config下。

忽略设置全局在~/.gitignore_global中,单独设置在project/.gitignore下。

设置 commit 的用户和邮箱

1
2
git config user.name "xx"
git config user.email "xx@xx.com"

或者直接修改config文件

1
2
3
[user]
name = xxx
email = xxx@xxx.com

查看设置项

1
git config --list

设置git终端颜色

1
2
3
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto

常用语法

登录数据库

mysql -h localhost -uroot -p

导出数据库

mysqldump -uroot -p db > db.sql

导入数据库

mysql -uroot -p db < db.sql

// or

mysql -uroot -p db -e “source /path/to/db.sql”

开启远程登录

grant all privileges on ss.* to ‘root’@’%’ indentified by ‘passoword’ with grant option;

// or

update user set Host=”%” and User=”root”

// 注意%是不包含localhost的

flush privileges;

创建用户

CREATE USER ‘test’@’localhost’ IDENTIFIED BY ‘password’;

grant all privileges on . to test@’localhost’ identified by ‘test’;

创建表

CREATE SCHEMA testdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

赋予数据库权限

GRANT ALL ON testdb.* TO ‘test’@’localhost’;

查看表结构

desc 表名;

修改表名

alter table t_book rename to bbb;

添加列:

alter table 表名 add column 列名 varchar(30);

删除列:

alter table 表名 drop column 列名;

清空mysql表中的记录有以下两种方法:

delete from 表名; 不删除id?没实验

truncate table 表名; 删除主键id

复制表结构

create table b select * from users where 0;

create table a like users;

create table b select * from users limit 0;

复制表

create table c select * from users;

删除表名为MyClass 的表

drop table MyClass; //删除表名为MyClass 的表

SELECT

SELECT * FROM table LIMIT 5;

select * from issu_info limit 7,6; 从第8条开始取,取6条

SELECT name,LENGTH(name)

FROM world

WHERE LENGTH(name)=5 AND region=’Europe’

between

SELECT name, population

FROM world

WHERE population BETWEEN 1000000 AND 1250000

like

SELECT name FROM world

WHERE name LIKE ‘%a’ OR name LIKE ‘%l’

and

SELECT name, area, population

FROM world

WHERE area > 50000 AND population < 10000000

and not

SELECT name,population,area FROM world

WHERE (area>3000000 or population>250000000) and not (area>3000000 and population>250000000)

in

SELECT name, population/area

FROM world

WHERE name IN (‘China’, ‘Nigeria’, ‘France’, ‘Australia’)

case when … then …else…end

SELECT name,

CASE WHEN continent=’Oceania’ THEN ‘Australasia’

ELSE continent END

FROM world

WHERE name LIKE ‘N%’

多个when

SELECT name,

CASE WHEN continent in (“Europe”,”Asia”) THEN “Eurasia”

WHEN continent in (“North America”,”South America”,”Caribbean”) THEN “America” ELSE continent END

FROM world WHERE name LIKE “A%” OR name LIKE “b%”

ORDER BY .. DESC 由大到小排序

SELECT winner,yr,subject FROM nobel

where winner like ‘Sir%’ ORDER BY yr DESC, winner

复合查询

SELECT DISTINCT yr

FROM nobel

WHERE subject=’Medicine’

AND yr NOT IN(SELECT yr FROM nobel

WHERE subject=’Literature’)

AND yr NOT IN (SELECT yr FROM nobel

WHERE subject=’Peace’)

Round

ROUND(7253.86, 0) -> 7254

ROUND(7253.86, 1) -> 7253.9

ROUND(7253.86,-3) -> 7000

CONCAT 将字符连在一起

SELECT CONCAT(region,name)

FROM bbc

select name,CONCAT(ROUND(100*population/(select population from world where name = ‘Germany’),0),’%’) from world

where continent = ‘Europe’

ALL

SELECT name

FROM world

WHERE gdp >ALL(SELECT gdp

FROM world

WHERE gdp>0 and continent=’Europe’)

每一个地区中面积最大的国家,引进x,y做对比

SELECT continent, name, area FROM world x

WHERE x.area >= ALL

(SELECT y.area FROM world y

WHERE y.continent=x.continent

AND area>0)

列出每个大洲和国家的名字第一个字母顺序排列。

SELECT continent,name FROM world x

WHERE x.name = (SELECT y.name FROM world y

WHERE y.continent= x.continent order by name limit 1

)

计算函数

SUM, COUNT, MAX and AVG

distinct去重

SELECT DISTINCT region FROM bbc

ORDER BY

ASC or DESC for ascending (smallest first, largest last) //小,大

GROUP BY 相同分为一组

SELECT continent, COUNT(name)

FROM world

GROUP BY continent

having

可以筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。

SELECT continent, SUM(population)

FROM world

GROUP BY continent

HAVING SUM(population)>500000000

JOIN … ON 多表关联查询

SELECT games.yr, city.country

FROM games JOIN city

ON (games.city = city.name)

SELECT goal.player,goal.teamid,game.stadium,game.mdate

FROM game JOIN goal ON (game.id=goal.matchid) WHERE goal.teamid = ‘GER’

CASE WHEN

SELECT name, population

,CASE WHEN population<1000000

THEN ‘small’

WHEN population<10000000

THEN ‘medium’

ELSE ‘large’

END

FROM bbc

LEFT JOIN … ON … 可以包含左表空值

SELECT games.yr, city.country

FROM games LEFT JOIN city

ON (games.city = city.name)

INSERT

INSERT INTO games(yr,city)

VALUES (2012,’London’);

INSERT SELECT

INSERT INTO games(yr,city)

SELECT yr+12, city FROM games;

UPDATE 更新已经存在的

UPDATE games SET city=’Paris’ WHERE yr = 2004;

DELETE

DELETE FROM games WHERE yr=2000;

CREATE并存入

CREATE TABLE games

(yr INT NOT NULL PRIMARY KEY

,city VARCHAR(20)

);

INSERT INTO games(yr,city) VALUES (2004,’Athens’);

INSERT INTO games(yr,city) VALUES (2008,’Beijing’);

INSERT INTO games(yr,city) VALUES (2012,’London’);

SELECT * FROM games;

auto-increment 自动存入

CREATE TABLE Persons

(

P_Id int NOT NULL AUTO_INCREMENT,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

PRIMARY KEY (P_Id)

)

PRIMARY KEY

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

PRIMARY KEY (Id_P)

)

FOREIGN KEY

CREATE TABLE Orders

(

Id_O int NOT NULL,

OrderNo int NOT NULL,

Id_P int,

PRIMARY KEY (Id_O),

FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

)

CREATE INDEX

CREATE INDEX index_name

ON table_name (column_name)

在表上创建一个唯一的索引。

CREATE UNIQUE INDEX index_name

ON table_name (column_name)

DROP INDEX

ALTER TABLE table_name DROP INDEX index_name

ALTER 修改,增加表的列

ALTER TABLE games ADD season VARCHAR(6);

UNIQUE约束

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

UNIQUE (Id_P)

)


update

清空表

清空mysql表中的记录有以下两种方法:

delete from 表名; 不删除id?没实验

truncate table 表名; 删除主键id

导出建表语句

show create table tablename;

复制表结构

create table b select * from users where 0; //复制表结构

create table a like users; //复制表结构

create table b select * from users limit 0; //复制表结构

create table c select * from users; //复制表的sql

排序

ORDER BY .. DESC 由大到小排序

SELECT winner,yr,subject FROM nobel

where winner like ‘Sir%’ ORDER BY yr DESC, winner

复合查询

SELECT DISTINCT yr

FROM nobel

WHERE subject=’Medicine’

AND yr NOT IN(SELECT yr FROM nobel

WHERE subject=’Literature’)

AND yr NOT IN (SELECT yr FROM nobel

WHERE subject=’Peace’)

Round

ROUND(7253.86, 0) -> 7254

ROUND(7253.86, 1) -> 7253.9

ROUND(7253.86,-3) -> 7000

CONCAT 将字符连在一起

SELECT CONCAT(region,name)

FROM bbc

select name,CONCAT(ROUND(100*population/(select population from world where name = ‘Germany’),0),’%’) from world

where continent = ‘Europe’

distinct去重

SELECT DISTINCT region FROM bbc

having

having 可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。

SELECT continent, SUM(population)

FROM world

GROUP BY continent

HAVING SUM(population)>500000000

JOIN … ON 多表关联查询

SELECT games.yr, city.country

FROM games JOIN city

ON (games.city = city.name)

mysql设置权限命令

GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION;

flush privileges;刷新权限

创建聚合索引

CREATE INDEX index_name

ON table_name ( column1, column2,…);

查询索引

SHOW INDEX FROM table_name

常用代码

交互

alert();

prompt();
result = prompt(title[, default]);
浏览器会显示一个带有文本消息的模态窗口,还有 input 框和确定/取消按钮。

confirm
result = confirm(question);
confirm 函数显示一个带有 question 和两个按钮的模态窗口:确定和取消。
点击确定返回 true,点击取消返回 false。

多个条件:“else if”

if (year < 2015) {
  alert( 'Too early...' );
} else if (year > 2015) {
  alert( 'Too late' );
} else {
  alert( 'Exactly!' );
}

三元运算符 ‘?’

let result = condition ? value1 : value2
计算条件结果,如果结果为真,则返回 value1,否则返回 value2。

逻辑运算符:|| (或), && (与), ! (非)。

while

while (condition) {
  // 代码
  // 所谓的“循环体”
}

“do…while” 循环
do {
  // 循环体
} while (condition);
循环首先执行循环体,然后检查条件,当条件为真时,重复执行循环体。

“for” 循环

for (begin; condition; step) {
  // ... loop body ...
}

通过示例来了解这部分的含义。下述循环运行从 i 等于 0 到 3(但不包括 3)的 alert(i):
for (let i = 0; i < 3; i++) { // 结果为 0、1、2
  alert(i);
}

跳过
for 循环的任何部分都可以被跳过。

let i = 0; // 我们已经声明并分配了
for (; i < 3; i++) { // "begin" 部分不再需要
  alert( i ); // 0, 1, 2
}

也可以移除 step 部分:
let i = 0;
for (; i < 3;) {
  alert( i++ );
}

实际上我们可以删除所有内容,从而创建一个无限循环:
for (;;) {
  // 无限循环
}
请注意 for 的两个 ; 必须存在,否则会出现语法错误。

continue; break;

跳到标签
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
    let input = prompt(`Value at coords (${i},${j})`, '');
    // 如果是空字符串或已取消,则中断这两个循环。
    if (!input) break outer; // (*)
    // 做些有价值的事
  }
}

“switch” 语句

switch(x) {
  case 'value1':  // if (x === 'value1')
    ...
    [break]

  case 'value2':  // if (x === 'value2')
    ...
    [break]

  default:
    ...
    [break]
}

函数声明

function showMessage(text = "no text given") {
  alert( 'Hello everyone!' );
  return;
}

命名技巧
showMessage(..)     // 显示信息
getAge(..)          // 返回 age (gets it somehow)
calcSum(..)         // 计算求和并返回结果
createForm(..)      // 创建表格 (通常会返回它)
checkPermission(..) // 检查权限并返回 true/false

PS:当 JavaScript 准备运行脚本或代码块时,它首先在其中查找函数声明并创建函数。我们可以将其视为“初始化阶段”.
因此,声明为函数声明的函数可以比定义的更早调用。

pow(x,n)

将 x 与自身相乘 n 次,然后返回结果。

函数表达式

let sayHi = function() {
  alert( "Hello" );
};

回调函数&匿名函数

function ask(question, yes, no) {
  if (confirm(question)) yes()
  else no();
}

ask(
  "Do you agree?",
  function() { alert("You agreed."); },
  function() { alert("You canceled the execution."); }
);

箭头函数

let func = function(arg1, arg2, ...argN) {
  return expression;
}

let sum = (a, b) => a + b;
/* 箭头函数更短:
let sum = function(a, b) {
  return a + b;
};*/

let double = n => n * 2; 只有一个参数,那么括号可以省略
let sayHi = () => alert("Hello!"); 没有参数,括号应该是空的

编码风格

![avatar](https://raw.githubusercontent.com/fankcoder/fankcoder.github.io/master/static/code-style-js.png

Figure brackets(大括号)

if (condition) {
  // do this
  // ...and that
  // ...and that
}

“for…in” 循环

为了使用对象所有的属性,就可以利用 for..in 循环。这跟 for(;;) 是完全不一样的东西。
let user = {
  name: "John",
  age: 30,
  isAdmin: true
};

for(let key in user) {
  // keys
  alert( key );  // name, age, isAdmin
  // 属性键的值
  alert( user[key] ); // John, 30, true
}

Symbol 是唯一标识符的基本类型

Symbol 使用 Symbol() 创建的,调用带有一个可选的描述。

let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false

Symbol 总是不同的值,即使它们有相同的名称。如果我们希望同名 Symbol 相等,那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话创建)一个以 key 作为名称的全局 Symbol。Symbol.for 的多次调用完全返回相同的 Symbol。

方法中的 “this”

对象方法需要访问对象中的存储的信息来完成其工作。为了访问该对象,方法中可以使用 this 关键字。
let user = {
  name: "John",
  age: 30,
  sayHi() {
    alert(this.name);
  }
};
user.sayHi(); // John
this 的值就是在点之前的这个对象,即调用该方法的对象

构造函数

构造函数在技术上是常规函数。不过有两个约定:
他们首先用大写字母命名。
它们只能用 "new" 操作符来执行。这样的调用意味着在开始时创建空的 this,并在最后返回填充的对象。

例如:
function User(name) {
  this.name = name;
  this.isAdmin = false;
}
let user = new User("Jack");
alert(user.name); // Jack
alert(user.isAdmin); // false

当一个函数作为 new User(...)执行时,它执行以下步骤:
一个新的空对象被创建并分配给 this。
函数体执行。通常它会修改 this,为其添加新的属性。返回 this 的值。

字符串

字符串可以包含在单引号、双引号或反引号中.
单引号和双引号本质上是一样的。但是,反引号允许我们将任何表达式嵌入到字符串中,包括函数调用.
反引号的另一个优点是它们允许字符串跨行

alert( `My\n`.length );   //length 属性有字符串长度

let str = `Hello`;
alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (an empty string)

数组

let arr = new Array();
let arr = [];

push 在末端添加一个元素.pop 从末端取出一个元素.

shift取出数组的第一个元素并返回它.unshift在数组的前端添加元素

性能push/pop 方法运行的比较快,而 shift/unshift 比较慢。

遍历
let fruits = ["Apple", "Orange", "Plum"];

// 迭代数组元素
for (let fruit of fruits) {
  alert( fruit );
}

let arr = ["Apple", "Orange", "Pear"];

for (let i = 0; i < arr.length; i++) {
  alert( arr[i] );
}

alert( arr.length );

delete

元素被删除,但数组长度不变

splice

arr.splice(index[, deleteCount, elem1, ..., elemN])
索引,删除个数,替换。并且返回删除的元素

slice

arr.slice(start, end)
它从所有元素的开始索引 "start" 复制到 "end" (不包括 "end") 返回一个新的数组。

concat

arr.concat(arg1, arg2...)

查询数组

这些是在数组中查询某些内容的方法。

indexOf/lastIndexOf 和 includes
arr.indexOf、arr.lastIndexOf 和 arr.includes 方法与字符串操作具有相同的语法,只不过这里是对数组元素而不是字符进行操作:

arr.indexOf(item, from) 从索引 from 查询 item,如果找到返回索引,否则返回 -1。
arr.lastIndexOf(item, from) — 和上面相同,只是从尾部开始查询。
arr.includes(item, from) — 从索引 from 查询 item,如果找到则返回 true。