以下资料都来自于 https://facebook.github.io/react/docs

快速上手

本文源码

github

代码预览调试平台
1
codepen

codepen.io

JSX

  • 在js中直接写html对象
  • html代码的顶层必须是开闭封口的
  • {formatName(xxx)}的方式实现模板功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import React from 'react';
import ReactDOM from 'react-dom';

function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Harper',
  lastName: 'Perez'
};

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);

ReactDOM.render(
  element,
  document.getElementById('root')
);

js手写输出dom

  • 直接用api输出
    1
    
    React.createElement
  • 之后的讨论都是基于jsx api的方式不多做讨论
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React from 'react';
import ReactDOM from 'react-dom';

const element = React.createElement(
    'h1', 
    {
        className : 'greeting'
    },
    'Hello, world! - createElement'
);

ReactDOM.render(
    element,
    document.getElementById('root')
);

组件

  • 创建
    1
    
    class
    的方式从
    1
    
    Component
    继承
  • 引入后可jsx调用
    1
    
    <Welcome name="Sara" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import React from 'react';
import ReactDOM from 'react-dom';


class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}
const element = <App />;
ReactDOM.render(
  element,
  document.getElementById('root')
);

state

  • 这是有状态的组件
  • 在载入组件后创建定时器,将要销毁组件前删除定时器,养成这个习惯
  • 修改state要用
    1
    
    setState
    方法
  • 1
    
    this
    表示组件本身
  • 每次
    1
    
    state
    的改变都会调用
    1
    
    render
    来重绘组件
  • 1
    
    setState
    的同时读取状态,需要通过对象
    1
    
    prevState
    来读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import React from 'react';
import ReactDOM from 'react-dom';


class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      date: new Date(),
      count : 0
    };
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {

    this.setState((prevState, props) => ({
        date: new Date(),
        count: prevState.count + 1
      }));

    // this.setState({
    //   date: new Date(),
    //   count: 
    // });
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
        <h2>count : {this.state.count}</h2>
      </div>
    );
  }
}


ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

event事件

  • 构造时绑定
    1
    
    constructor
    ,
    1
    
    bind(this)
  • 元素代入
    1
    
    onClick={(e) => this.handleClick2(e)}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import React from 'react';
import ReactDOM from 'react-dom';


class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  handleClick2() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
        <div>
            <button onClick={this.handleClick}>
                {this.state.isToggleOn ? 'ON' : 'OFF'}
            </button>
            <button onClick={(e) => this.handleClick2(e)}>
                {this.state.isToggleOn ? 'ON' : 'OFF'}
            </button>
        </div>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

条件render

  • 元素属性
    1
    
    props
    的方式传入参数
  • 1
    
    render
    的时候根据属性值条件渲染
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import React from 'react';
import ReactDOM from 'react-dom';

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

function LoginButton(props) {
  return (
    <button onClick={props.onClick}>
      Login
    </button>
  );
}

function LogoutButton(props) {
  return (
    <button onClick={props.onClick}>
      Logout
    </button>
  );
}

class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;

    let button = null;
    if (isLoggedIn) {
      button = <LogoutButton onClick={this.handleLogoutClick} />;
    } else {
      button = <LoginButton onClick={this.handleLoginClick} />;
    }

    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />
        {button}
      </div>
    );
  }
}

ReactDOM.render(
  <LoginControl />,
  document.getElementById('root')
);

1
render &&
操作符

  • 1
    
    &&
    只有满足左边的 才会执行右边
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Mailbox(props) {
  const unreadMessages = props.unreadMessages;
  return (
    <div>
      <h1>Hello!</h1>
      {unreadMessages.length > 0 &&
        <h2>
          You have {unreadMessages.length} unread messages.
        </h2>
      }
    </div>
  );
}

const messages = ['React', 'Re: React', 'Re:Re: React'];
ReactDOM.render(
  <Mailbox unreadMessages={messages} />,
  document.getElementById('root')
);

1
 isLoggedIn ? a : b ; render
三目运算符

  • 1
    
    isLoggedIn ? 'currently' : 'not'
1
2
3
4
5
6
7
8
render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
    </div>
  );
}
  • 1
    
    ( xxx )
    方式包含jsx
1
2
3
4
5
6
7
8
9
10
11
12
render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      {isLoggedIn ? (
        <LogoutButton onClick={this.handleLogoutClick} />
      ) : (
        <LoginButton onClick={this.handleLoginClick} />
      )}
    </div>
  );
}

list 和 key

  • 如果是呈现一个
    1
    
    list
    的组件,列表中的元素必须有
    1
    
    key
  • 1
    
    key
    必须是在当前列表中唯一的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React from 'react';
import ReactDOM from 'react-dom';

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number,index) => 
    <li key={index} >
      {number}
    </li>
    );
  return (
    <ul>{listItems}</ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers}/>, document.getElementById('root'));

在jsx中使用
1
map()
函数方法

  • 外嵌
1
2
3
4
5
6
7
8
9
10
11
12
function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    <ListItem key={number.toString()}
              value={number} />
  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}
  • 内嵌
1
2
3
4
5
6
7
8
9
10
11
function NumberList(props) {
  const numbers = props.numbers;
  return (
    <ul>
      {numbers.map((number) =>
        <ListItem key={number.toString()}
                  value={number} />
      )}
    </ul>
  );
}

表单

  • 输入框 提交按钮 组合应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import React from 'react';
import ReactDOM from 'react-dom';

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value.toUpperCase()});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

ReactDOM.render(
  <NameForm />, document.getElementById('root'));
  • 1
    
    textarea
    控件用
    1
    
    value
    属性插入数据
1
<textarea value={this.state.value} />
  • 1
    
    select
    控件
1
2
3
4
5
6
<select value={this.state.value} >
  <option value="grapefruit">Grapefruit</option>
  <option value="lime">Lime</option>
  <option value="coconut">Coconut</option>
  <option value="mango">Mango</option>
</select>

处理
1
form input state
多输入

  • 1
    
    [xxx]
    的方式动态设置
    1
    
    key
    名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import React from 'react';
import ReactDOM from 'react-dom';


class Reservation extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isGoing: true,
      numberOfGuests: 2
    };

    this.handleInputChange = this.handleInputChange.bind(this);
  }

  handleInputChange(event) {
    const target = event.target;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    const name = target.name;

    this.setState({
      [name]: value
    });
  }

  render() {
    return (
      <form>
        <label>
          Is going:
          <input
            name="isGoing"
            type="checkbox"
            checked={this.state.isGoing}
            onChange={this.handleInputChange} />
        </label>
        <br />
        <label>
          Number of guests:
          <input
            name="numberOfGuests"
            type="number"
            value={this.state.numberOfGuests}
            onChange={this.handleInputChange} />
        </label>
      </form>
    );
  }
}

ReactDOM.render(
  <Reservation />, document.getElementById('root'));

##

1

##

1

##

1

##

1

##

1

##

1

Read More

搭建环境

参考文

https://facebook.github.io/react/docs/installation.html

方式一 官方命令cli (推荐 可快速上手)

  • 安装
    1
    
    create-react-app
1
2
3
4
5
npm install -g create-react-app
create-react-app my-app

cd my-app
npm start

一切顺利可以看到浏览器

1
http://localhost:3000/

  • 目录说明
1
2
3
4
5
6
7
8
9
10
11
12
13
├── README.md               说明
├── package.json            npm 配置
├── build                   发布目录
├── public                  资源模板目录
│   ├── favicon.ico
│   └── index.html          模板页
└── src                     源码目录
    ├── App.css
    ├── App.js              app组件
    ├── App.test.js
    ├── index.css
    ├── index.js            index启动
    └── logo.svg
  • 命令说明

打开

1
package.json
看下scripts

1
2
3
4
5
6
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
}

npm start 启动开发环境 npm run build 编译模式 目标目录

1
build
npm run test 测试 npm run eject 切换DIY模式,原来是
1
react-script
包装好的

方式二 手动配置webpack

  • 1
    
    npm init
    初始项目
1
2
3
mkdir react-webpack
cd react-webpack
npm init
  • npm 包安装
1
npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-es2015 babel-preset-react react react-dom webpack-dev-server webpack
  • 创建
    1
    
    webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var webpack = require('webpack');
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common'); // 合并重复代码到 common.js 文件中

module.exports = {
    entry: {
        "01-helloword": __dirname + "/src/01-helloword.js" // 多文件入口
    },
    devtool: 'source-map',
    output: {
        path: __dirname + "/build",
        filename: "[name].js" // [name] 是entry入口的 key
    },
    plugins: [commonsPlugin],
    module: {
        loaders: [{
            test: /\.js$/,
            loader: 'babel-loader',
            query: {
                presets: ['es2015', 'react'] // es6 react 编译
            }
        }]
    },
    resolve: {
        extensions: ['.js', '.json'] // 默认扩展名
    }
}

src 是源码目录 build 是编译后目标目录

  • 修改
    1
    
    package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "name": "react-webpack",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node_modules/.bin/webpack -d --watch",
    "server": "node_modules/.bin/webpack-dev-server --inline",
    "dist": "node_modules/.bin/webpack -p"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-preset-env": "^1.4.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "react": "^15.5.4",
    "react-dom": "^15.5.4",
    "webpack": "^2.4.1",
    "webpack-dev-server": "^2.4.5"
  }
}

我这里设置了两个scripts npm start 监听方式自动编译开发调试 npm run server localhost:8080本地www服务 npm run dist 产品的方式发布

  • 创建
    1
    
    page\01-helloword.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" href="favicon.ico">
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="../build/common.js"></script>
    <script src="../build/01-helloword.js"></script>
  </body>
</html>
  • 创建
    1
    
    src\01-helloword.js
1
2
3
4
5
6
7
import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render( 
    <h1> Hello, world! </h1>,
    document.getElementById('root')
);
  • 执行
    1
    
    npm start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
> webpack -d --watch

Webpack is watching the files…

Hash: 8a6fd54e01f7bfb59aa4
Version: webpack 2.4.1
Time: 8630ms
                 Asset     Size  Chunks                    Chunk Names
01-helloword-bundle.js  1.99 MB       0  [emitted]  [big]  main
   [5] ./~/react-dom/lib/ReactDOMComponentTree.js 6.27 kB {0} [built]
   [6] ./~/fbjs/lib/ExecutionEnvironment.js 1.06 kB {0} [built]
   [8] ./~/react-dom/lib/ReactInstrumentation.js 601 bytes {0} [built]
  [10] ./~/react-dom/lib/ReactUpdates.js 9.67 kB {0} [built]
  [19] ./~/react/lib/React.js 3.34 kB {0} [built]
  [80] ./~/react-dom/index.js 58 bytes {0} [built]
  [81] ./~/react/react.js 55 bytes {0} [built]
 [111] ./~/react-dom/lib/ReactDOM.js 5.16 kB {0} [built]
 [170] ./~/react/lib/ReactChildren.js 6.19 kB {0} [built]
 [171] ./~/react/lib/ReactClass.js 27.6 kB {0} [built]
 [172] ./~/react/lib/ReactDOMFactories.js 5.53 kB {0} [built]
 [173] ./~/react/lib/ReactPropTypes.js 500 bytes {0} [built]
 [175] ./~/react/lib/ReactPureComponent.js 1.32 kB {0} [built]
 [176] ./~/react/lib/ReactVersion.js 350 bytes {0} [built]
 [181] ./src/01-helloword.js 418 bytes {0} [built]
    + 167 hidden modules
Hash: 86817430d2ff60331187
Version: webpack 2.4.1
Time: 209ms

到这里就完成了环境配置,打开

1
pages\01-helloword.html
后就能看到 hello word!

  • 目录说明
1
2
3
4
5
6
7
8
9
10
11
├── build                           编译生成目录
│   ├── 01-helloword.js
│   └── common.js
├── pages                           访问页面
│   ├── 01-helloword.html
│   └── favicon.ico
├── src                             es6源码
│   └── 01-helloword.js
├── README.md
├── package.json                    npm配置
└── webpack.config.js               webpack配置

调试环境

chrome浏览器安装插件

1
React Developer Tools
1
webpack.config.js
sevtool 设置
1
source-map

Read More

问题

浏览器安全域的限制,不允许直接清除file控件

解决

创建一个新的替换原来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 创建input
createInput : function ()
{
    var _this = this, input = this.toElement('<input type="file" />');

    $(input).attr({
        'class' : 'file-input',
        'name' : 'aws_upload_file',
        'multiple' : this.options.multiple ? 'multiple' : false
    });

    $(input).change(function()
    {
        _this.addFileList(this);
    });

    return input;
}

// 替换原来的
var old_file = $('input[name="aws_upload_file"]');
var new_file = _this.createInput();
old_file.after(new_file);
old_file.remove();

Read More

centos6常用shell

网卡配置

  • 查看ip

    ifconfig

  • 改自动获取

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes

  • 静态

    1)编辑配置文件,添加修改以下内容

    vi /etc/sysconfig/network-scripts/ifcfg-eth0

    BOOTPROTO=static #启用静态IP地址 ONBOOT=yes #开启自动启用网络连接 IPADDR=192.168.21.129 #设置IP地址 NETMASK=255.255.255.0 #设置子网掩码 GATEWAY=192.168.21.2 #设置网关 DNS1=8.8.8.8 #设置主DNS DNS2=8.8.4.4 #设置备DNS IPV6INIT=no #禁止IPV6 :wq! #保存退出

    2)修改完后执行以下命令

    service ip6tables stop #停止IPV6服务 chkconfig ip6tables off #禁止IPV6开机启动 service network restart #重启网络连接 ifconfig #查看IP地址

系统启动加载

vi /etc/rc.d/rc.local

查看端口占用

netstat -ntlp

查询进程

ps -ef grep xxxx

iptables防火墙

vi /etc/sysconfig/iptables service iptables restart /etc/init.d/iptables status

压缩

tar xvf wordpress.tar   解压tar格式的文件  
tar -tvf myfile.tar   查看tar文件中包含的文件  
tar cf toole.tar tool   把tool目录打包为toole.tar文件  
tar cfz xwyme.tar.gz tool   把tool目录打包且压缩为xwyme.tar.gz文件,因为.tar文件几乎是没有压缩过的,MT的.tar.gz文件解压成.tar文件后差不多是10MB  
tar jcvf /var/bak/www.tar.bz2 /var/www/   创建.tar.bz2文件,压缩率高  
tar xjf www.tar.bz2   解压tar.bz2格式  
gzip -d ge.tar.gz   解压.tar.gz文件为.tar文件  
unzip phpbb.zip   解压zip文件,windows下要压缩出一个.tar.gz格式的文件还是有点麻烦的  
bunzip2 file1.bz2   解压一个叫做 ‘file1.bz2′的文件  
bzip2 file1   压缩一个叫做 ‘file1′ 的文件  
gunzip file1.gz   解压一个叫做 ‘file1.gz’的文件  
gzip file1   压缩一个叫做 ‘file1′的文件  
gzip -9 file1   最大程度压缩  
rar a file1.rar test_file   创建一个叫做 ‘file1.rar’ 的包  
rar a file1.rar file1 file2 dir1   同时压缩 ‘file1′, ‘file2′ 以及目录 ‘dir1′  
rar x file1.rar   解压rar包  
unrar x file1.rar   解压rar包  
tar -cvf archive.tar file1   创建一个非压缩的 tarball  
tar -cvf archive.tar file1 file2 dir1   创建一个包含了 ‘file1′, ‘file2′ 以及 ‘dir1′的档案文件  
tar -tf archive.tar   显示一个包中的内容  
tar -xvf archive.tar   释放一个包  
tar -xvf archive.tar -C /tmp   将压缩包释放到 /tmp目录下  
tar -cvfj archive.tar.bz2 dir1   创建一个bzip2格式的压缩包  
tar -xvfj archive.tar.bz2   解压一个bzip2格式的压缩包  
tar -cvfz archive.tar.gz dir1   创建一个gzip格式的压缩包  
tar -xvfz archive.tar.gz   解压一个gzip格式的压缩包  
zip file1.zip file1   创建一个zip格式的压缩包  
zip -r file1.zip file1 file2 dir1   将几个文件和目录同时压缩成一个zip格式的压缩包  
unzip file1.zip   解压一个zip格式压缩包  

目录操作

  • 切换工作路径 cd
  • 显示目录内容 ls
  • 复制文件或目录,复制目录时,加上-r选项表示递归复制 cp
  • 重命名/移动文件或者目录 mv
  • 删除文件或目录,删除目录时,加上-r选项表示递归,加上-f选项表示强制删除并且不提醒 rm
  • 创建目录,递归创建加上-p选项 mkdir
  • 创建空文件,或者更新时间戳 touch
  • 列出目录树 tree

Read More

升级gcc

  1. 下载源码包
1
2
wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.0/gcc-4.8.0.tar.bz2
tar -jxvf  gcc-4.8.0.tar.bz2
  1. 下载编译所需依赖库
1
2
3
cd gcc-4.8.0
./contrib/download_prerequisites
cd ..
  1. 建立编译输出目录
1
mkdir gcc-build-4.8.0
  1. 进入此目录,执行以下命令,生成makefile文件
1
2
cd  gcc-build-4.8.0
../gcc-4.8.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
  1. 编译
1
2
后面的是核心数,编译速度会比较快
make -j4
  1. 安装
1
sudo make install
  1. 切换GCC到新版
确定新安装的GCC的路径,一般默认在/usr/local/bin下。可以先updatedb,然后locate gcc-4.8 tail找一下
1
ls /usr/local/bin | grep gcc

添加新GCC到可选项,倒数第三个是名字,倒数第二个参数为新GCC路径,最后一个参数40为优先级,设大一些之后就自动使用新版了

1
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/i686-pc-linux-gnu-gcc 40

Read More

前言

安装

1
npm install -g gitbook-cli  

需要nodejs环境

命令 - 本地编译

1
gitbook build

命令 - 本地WEB服务方式

1
gitbook serve

命令 - 初始化

1
gitbook init

这将会生成一个标准项目

1
SUMMARY.md
文件

1
2
3
# Summary

* [Introduction](README.md)

这里存放了目录与文件的对应关系

1
book.json
配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
    "title" : "课程产品研发管理系统 - API接口说明",
    "author" : "",
    "description" : "规范API设计",
    "language" : "zh-hans",
    "links" : {
        "gitbook" : false,
        "sidebar" : {
            "IT黑马" : "http://www.itheima.com/"
            }
    },
    "plugins": [
        "-sharing"
    ]
}

其他命令

1
2
3
4
gitbook build: 会生成相应的 HTML 文件供分发。
gitbook pdf: 生成 PDF 文件
gitbook epub: 生成 epub 文件
gitbook mobi: 生成 mobi 文件

Read More

编写备份sh

/opt/backup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
cd /bak/bakmysql
echo "You are in bakmysql directory"
mv bakmysql* /bak/bakmysqlold
echo "Old databases are moved to wditcast folder"
Now=$(date +"%d-%m-%Y")
File=bakmysql-wditcast-$Now.sql
mysqldump -uroot -p'abc123' --databases wditcast > $File
echo "Your database backup successfully completed"
SevenDays=$(date -d -7day  +"%d-%m-%Y")
if [ -f /bak/bakmysqlold/bakmysql-wditcast-$SevenDays.sql ]
then
rm -rf /bak/bakmysqlold/bakmysql-wditcast-$SevenDays.sql
echo "You have delete 7days ago bak file "
else
echo "7days ago bak file not exist "
fi

wditcast 改成你的数据库名字

设置可执行权限

1
chmod 755 /opt/backup.sh

设置任务

1
2
3
4
vi /etc/crontab
0 1 * * * root /opt/backup.sh

/sbin/service crond restart

这里设置为每天凌晨1点自动备份

Read More

查询指定端口的进程ID

1
sudo lsof -i :9000

根据ID杀进程

1
sudo kill -9 716

改hosts

1
2
sudo vi /private/etc/hosts
:wq!

开机启动项

/System/Library/StartupItems /Library/StartupItems

显示隐藏文件

1
2
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder

隐藏隐藏文件

1
2
defaults write com.apple.finder AppleShowAllFiles -bool false  
killall Finder

Read More

前言

yog2的模板是在swig.js的基础上扩展的

YOG2 会重写 html, head, body 标签用于搭建资源加载的总体框架,并且添加了 require, widget, script 标签用于处理静态资源和后端组件。

extends 继承

  • 母模板 layout.tpl
1
  • 应用模板 index.tpl
1

extends 关键字 可以继承 layout.tpl

block 定义一个块

parent 将父模板中同名块注入当前块中

include

1

raw

停止解析标记中任何内容,所有内容都将输出 参数: file父模板相对模板 root 的相对路径

for

遍历对象和数组 参数:x 当前循环迭代名in: 语法标记 y: 可迭代对象。

1

if

条件语句,参数:

接受任何有效的 JavaScript条件语句

1

autoescape

改变当前变量的自动转义行为 参数: on当前内容是否转义 type: 转义类型,js 或者 html,默认 html

1

set

设置一个变量,在当前上下文中复用

1

Read More