首页

二、学习基础智能合约

前端达人

第一讲 介绍

1、 智能合约是什么?

智能合约并非现实中常见的合同,而是存在区块链上,可以被触发执行的一段程序代码,这些代码实现了某种预定的规则,是存在于区块链执行环境中的“自治代理”。智能合约需要被触发,代码才会执行,不被触发他的状态将会始终保持一个状态,并且部署后的智能合约将不可被修改。智能合约语言的语法和js脚本语言很像,因此有过js开发经验的小伙伴们学习起来会很快。

2、 编程工具的介绍。

我们都知道“预先善其事、必先利其器”的道理,现实中织布是需要织布机才能完成织布,同样的我们的智能合约学习也是要有编程工具的使用的。我们本套课程都将以 remix 为编程工具进行讲解课程。remix 就是我们手里的织布机,能织出什么布就看我们这些使用 remix 的程序员了。
地址为(http://remix.ethereum.org/)可以直接在浏览器中开发,很方便,只要有一个 google chrome 谷歌浏览器就可以开发了。

remix 有几个主要的常用面板,分别是文件面板、编译器、运行器、以及占用最大一部分的文本编辑器组成。

文件面板:我们可以在这个面板进行创建文件、选择文件等管理文件的操作。
编译器:我们可以将sol文件进行编译,编译不通过将不能执行合约,并且可以得到code.json以及abi.json。我们可以将他们在支持sol语言的公链上运行。
运行器:可以将sol智能合约部署在eth链上,并且能对合约的方法进行调用等操作。
文本编辑器:我们的代码就是写在这个位置的,后面基本大部分时间你将面对的是这个页面。

3、 我的第一个智能合约程序

下面的智能合约是我们第一个合约程序,因此我们命名为 “FirstContract.sol” 文件名

pragma solidity ^0.6.0;

// first contract
contract FirstContract {
    // first method
    function firstMethod() public pure returns (string memory) {
        return 'I am first method !!!';
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

上面代码很多小伙伴应该不是很懂什么意思,不懂没关系,我来给大家一行一行讲解。
pragma solidity ^0.6.0;
这一行是说明使用solidity 0.6.0版本写的,可以运行在0.6.0到0.7.0之间的版本上。
contract FirstContract {
这一句是定义一个叫 FirstContract 名称的合约。
function firstMethod() public pure returns (string memory){
这一行是定义一个方法叫做 firstMethod, 该方法有返回值,类型是 string 类型的。
return ‘I am first method !!!’;
这一行是这个方法将会返回 “I am first method !!!”。

看起来可能还是会有小伙伴们有不明白的地方,但是我们先只教这么多,关于什么是string,string 就是字符串的意思,字符串你就可以当作是任意的abcde这些字母等还有标点符号写在了单引号或者双引号中。这就是字符串最通俗易懂的解释了,小伙伴们,大家可以动手试试自定义一些字符串让他返回。

第二讲 智能合约结构

在solidity中,合约有点类似面向对象语言中的类,每个合约中包含状态变量、函数、函数变量、函数修饰器、事件、结构、和枚举类的声明,合约也可以继承其他的合约。大家可能对类和类中的结构的概念没有什么了解,我简单给大家举个例子。一个类可以比作是汽车,汽车里面的油就是变量,然后油门、刹车等就是函数,我们踩油门相当于调用类中的函数,汽车动起来,油减少,相当于变量值改变了。

我们来根据上面的描述写一个汽车的合约。先使用remix 创建一个CarContract1.sol文件,然后设定一个CarContract1名字的合约。汽车有了,还要有一个油箱,设定一个变量_gasoline,作为油箱。然后我们再给汽车加一个油门,写一个startUp函数作为油门。现在有了油箱但是不知道有多少油,再加gatGasoline函数作为一个仪表盘。咱们只有油箱没有油汽车也跑不了,在加一个加油的接口,给汽车加油,使用addGasoline函数进行加油。下面就是我们完整的小汽车的代码。

CarContract1.sol

pragma solidity ^0.6.0;

contract CarContract1 {
    uint256 _gasoline;

    function startUp() public {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
    }

    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }

    function addGasoline(uint256 gasoline) public {
        _gasoline = _gasoline + gasoline;
    }

} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

1、 状态变量

小汽车合约中的_gasoline就是我们定义的状态变量,类型是 uint256 类型。 该变量是存储在链上的,也就是说他的数据是被保存起来的,每次改动都会记录下来。因此我们在进行调用 addGasoline 函数时,会给这个小汽车加油成功,_gasoline 的值会变化,同样的我们调用 startUp 函数时,_gasoline 的值也会变化。

2、 函数

在CarContract1小汽车中,startUp()、getGasoline()、addGasoline(uint256 gasoline) 都是函数。这些函数有的是没有参数的,又叫无参函数,比如:startUp()、getGasoline()。有的是有参数的,就叫有参函数,比如:addGasoline(uint256 gasoline)。这些函数,有的有返回值,有的没有返回值,根据具体场景来定,一般call操作都是有返回值的,call操作不会改变合约状态。只有send操作,才会进行改变合约的状态。

3、 函数变量
我们都知道加不同的型号汽油会有不一样的效果,我们来给汽车换下不同的型号汽油,在汽车上我们放置一个桶名字是_bucket,用来装另一个型号的汽油。如果我们自己的两个容器里面有一个是空的,我们可以直接进行转换汽油。但是我们自己的两个容器中都有油的时候,两个容器很明显不能进行交换汽油,这个时候我们需要向隔壁的老李借一个桶 __tempBucket,这样三个容器就能进行转换油箱里面的汽油和桶里面的汽油进行对换了,换完以后把桶还回去。

我们进行在进行造一个新的小汽车名字是CarContract2,增加一个桶,设定变量为_bucket,作为桶。还需要记录当前汽车的油的型号。设定变量 _gasolineType 为当前油类型,默认是 1类型。设定一个函数 changeGasolineType,进行交换汽油类型,在设定一个函数进行查看当前汽车的类型 getGasolineType 。至此我们小汽车升级成功。

CarContract2.sol

pragma solidity ^0.6.0;

contract CarContract2 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;

    function startUp() public {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
    }

    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }

    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }

    function changeGasolineType() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");

        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }

        _gasolineType = -1 * _gasolineType;
    }

    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }

} 
  • 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

上面的小汽车2代正式出炉,我来给大家讲下做了那些升级,首先我们的changeGasolineType内部定义了 __tempBucket 变量,该变量就是函数变量,是临时创建的并且不会被记录在链上的变量,也就是我们用完就还给隔壁老李了,还回去的时候桶是空的。

4、 函数修饰器

我们的小汽车还是很简单,我们在给他加一点东西,规定小汽车要想启动必须关闭车门。

下面我们再一次修改我们的小汽车,加一个_doorStatus状态变量作为我们的车门状态。再加连个函数getDoorStatus()、changeDoorStatus(),用来控制开门/关门并且查看门的状态。并且加入一个whenDoorClose()作为我们的判断器。

pragma solidity ^0.6.0;

contract CarContract3 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;

    bool _doorStatus;

    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;

    }

    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
    }

    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }

    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }

    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");

        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }

        _gasolineType = -1 * _gasolineType;
    }

    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }

    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }

    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }
} 
  • 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

上面我们的3代小汽车已经完成了,whenDoorClose() 就是我们定义的函数修饰器 使用modifier 来定义的。

5、 事件

每次都到没有油了才去加油,我们加一个功能,当行驶时油量低于5的时候我们要进行预警。

我们加入一个 gasolineAlarm 事件,该事件有一个参数,当前的油量。这样我们在启动的函数中加入这个事件的调用,判断本次使用后的油量是否小于等于5,是的话进行调用该事件

pragma solidity ^0.6.0;

contract CarContract4 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;

    bool _doorStatus;

    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;

    }

    event gasolineAlarm(uint256 gasoline);

    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
        if (_gasoline <= 5) {
            emit gasolineAlarm(_gasoline);
        }
    }

    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }

    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }

    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");

        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }

        _gasolineType = -1 * _gasolineType;
    }

    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }

    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }

    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }
} 
  • 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

我们已经更新到第四代小汽车了,四代小汽车的gasolineAlarm 就是我们定义的事件,事件是会在虚拟机上记录一条日志的,我么可以通过查询日志的方式得到事件内容。

6、 结构

我们的汽车感觉成熟了,这个时候我们要给我们的汽车打上一些特性,比如颜色,比如车轮数,比如车门数等等。

我们在小汽车里面加入CarInfo结构体,里面可以定义color颜色,wheelNum 车轮数等等,然后我们加入设置和获取的函数:setCarInfo()、getCarInfo(), 这样我们的小汽车就有了一些参数了。

pragma solidity ^0.6.0;

contract CarContract5 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    bool _doorStatus;

    struct CarInfo {
        string color;
        uint8 wheelNum;
    }

    CarInfo _carInfo;

    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;

    }

    event gasolineAlarm(uint256 gasoline);

    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
        if (_gasoline <= 5) {
            emit gasolineAlarm(_gasoline);
        }
    }

    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }

    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }

    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");

        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }

        _gasolineType = -1 * _gasolineType;
    }

    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }

    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }

    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }

    function setCarInfo(string memory color, uint8 wheelNum) public {
        _carInfo.color = color;
        _carInfo.wheelNum = wheelNum;

        //_carInfo = CarInfo(color, wheelNum);

    }

    function getCarInfo() public view returns(string memory color, int wheelNum) {
        color = _carInfo.color;
        wheelNum = _carInfo.wheelNum;
    }
} 
  • 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
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

我们的5代小汽车加入了CarInfo就是结构体,结构体中不能进行设置初值,我们能把一类的属性等进行分类的放在结构体中,可以充当我们的数据模型。

7、 枚举类

我们的小汽车想要开门,需要打开车锁,车锁是一种状态,开/关。

我们加入枚举类DoorSwitch,定义两个状态open,close 。在定义whenDoorSwitch函数修饰器,进行判断。

pragma solidity ^0.6.0;

contract CarContract6 {
    uint256 _gasoline;
    uint256 _bucket;
    int _gasolineType = 1;
    bool _doorStatus;

    enum DoorSwitch{ open, close }

    DoorSwitch _doorSwitch;

    struct CarInfo {
        string color;
        uint8 wheelNum;
    }

    CarInfo _carInfo;

    modifier whenDoorClose() {
        require(!_doorStatus, "door is not close");
        _;

    }

    modifier whenDoorSwitch() {
        if (!_doorStatus) {
            require(_doorSwitch == DoorSwitch.open, "door switch is close");
        }
        _;
    }

    event gasolineAlarm(uint256 gasoline);

    function startUp() public whenDoorClose {
        require(_gasoline >= 1, "gasoline is not haved");
        _gasoline = _gasoline - 1;
        if (_gasoline <= 5) {
            emit gasolineAlarm(_gasoline);
        }
    }

    function getGasoline() public view returns(uint256 gasoline) {
        return _gasoline;
    }

    function addGasoline(uint256 gasoline) public {
        _gasoline += gasoline;
    }

    function changeGasoline() public {
        require(_gasoline != 0 || _bucket != 0, "can not change");

        if (_gasoline == 0) {
            _gasoline = _bucket;
            _bucket = 0;
        } else if (_bucket == 0) {
            _bucket = _gasoline;
            _gasoline = 0;
        } else {
            uint256 __tempBucket = _gasoline;
            _gasoline = _bucket;
            _bucket = __tempBucket;
        }

        _gasolineType = -1 * _gasolineType;
    }

    function getGasolineType() public view returns(int gasolineType) {
        return _gasolineType;
    }

    function getDoorStatus() public view returns(bool doorStatus) {
        return _doorStatus;
    }

    function changeDoorStatus() public {
        _doorStatus = ! _doorStatus;
    }

    function setCarInfo(string memory color, uint8 wheelNum) public {
        _carInfo.color = color;
        _carInfo.wheelNum = wheelNum;

        //_carInfo = CarInfo(color, wheelNum);
    }

    function getCarInfo() public view returns(string memory color, int wheelNum) {
        color = _carInfo.color;
        wheelNum = _carInfo.wheelNum;
    }

    function setDoorSwitch(DoorSwitch doorSwitch) public {
        _doorSwitch = doorSwitch; 
    }
} 
  • 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
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

我们已经更新到6代小汽车了,在6代小汽车中我们加入了DoorSwitch车门的开关,使用的就是枚举定义的,在实际项目中枚举定义的话,一般使用在状态和类型的定义上,方便进行管理。

到此我们的小汽车已经完成了,经历了6代的更新,相信大家对于本节课程有空了一定的了解了。智能合约包含的状态变量、函数、函数变量、函数修饰器、事件、结构、枚举类都已经在制作和升级小汽车中使用了。

第三讲 数据类型

在solidity中有专门的数据类型,什么是数据类型呢,我们可以认为数字是类型,是否是类型,地址是类型等。在solidity中存在以下常用的类型,uint/int、bool、 address、 mapping、bytes、string、fixed/ufixed 常用的类型。

pragma solidity ^0.6.0;

contract Test {
    uint v1 = 1;
    int v2 = -2;
    bool v3 = true;
    address v4 = 0x8a5fa31F2bf83812ECd8E5Ef1878dD12bBaDb40C;
    mapping(uint => uint) v5;
    bytes v6 = "0x123"; 
    string v7 = "asd";
    fixed v8 = 1.3;
    ufixed v9 = 1.2;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

1、 uint/int类型

uint/int 类型都是整型,也就是都是整数。1、2、3、4类似的数没有小数点。区别是uint是没有符号的。看代码中的 v1 就是无符号整数,v2就是有符号整数。默认是0

2、bool

bool 中文是布尔类型,表示是/否的类型。v3就是bool类型,只有两个值 true/false,默认是false

3、address

address是地址类型,存储地址的,账户地址,合约地址等,都可以。

4、mapping

映射类型示例中的代码不是很全,我来解释下,实际上他是一个key-value模型,也就是一个key对应一个value。比如我们说小明,我们就是到小明这个人。就是这个道理。

5、bytes

定长数组,就是说他的长度是固定的,不能改变,设定是多少就是多少。

6、string

字符串类型,可以放字符串,长度是255位二级制数。

7、fixed/ufixed

浮点类型,就是带有小数点的,1.2、1.4、1.9这类数值。也是分为有无符号项。

第四讲 控制语句

在solidity中可以使用以下控制结构,有 if,else,while,for,break,continue,return,? : 我们来以此介绍这些结构。

1、if else语句

大家肯定好奇什么是if else语句。他就是我们说的如果 否者。也就是说如果我怎么样否者我怎么样。注意else只能与if一同使用,大家一起来看下面代码:

pragma solidity ^0.6.0;

contract Test {
    uint256 temp;

    function test1(bool doorSwitch) public {
        if (doorSwitch) {
            temp = 1;
        }
    }

    function test2(bool doorSwitch) public {
        if (doorSwitch) {
            temp = 1;
        }
        temp = 2;
    }

    function test3(bool doorSwitch) public {
        if (doorSwitch) {
            temp = 1;
        } else {
            temp = 2;
        }
    }

    function getTemp() public view returns(uint256){
        return temp;
    }
} 
  • 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

上面代码中我们定义了三个测试方法,以及一个获取temp值的方法。第一个测试方法表示如果我们传进去的doorSwitch是true,门是开的,那么temp就等于1,否者doorSwitch等于false的话temp值不变。第二个测试方法表示如果我们传进去的doorSwitch是true,门是开的,那么temp就先等于1,然后等于2,否者doorSwitch等于false的话temp直接等于2。第三个测试方法表示如果我们传进去的doorSwitch是true,门是开的,那么temp就等于1,否者doorSwitch等于false的话temp等于2。

2、while语句

while 语句是循环语句,表示满足条件就一直循环,一般我么会和break来使用,当达到某种情况进行跳出循环,可以让循环体自动结束循环。

pragma solidity ^0.6.0;

contract Test {
    function test1() public {
        int a = 1;
        while(true) {
            if (a == 5) {
                break;
            }
            a++;
        }
    }

    function test2() public {
        int a = 1;
        while(a != 5) {

            a++;
        }
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

上面两个函数内部都有一个循环,实际上两个循环的效果是一样的,有一些细微的差别,需要根据具体业务场景分析了,不建议使用while 一不小心死循环就不好玩了。

3、for循环

for循环概念直接上代码大家好理解些。

pragma solidity ^0.6.0;

contract Test {
    function test1() public {
        for(uint8 i = 0; i < 10; i ++) {
            ...
        }
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

上面就是一个常用的for循环使用方式,循环10次 “…” 的内容。

4、continue 语句

continue语句是跳过本次循环进入下一次循环,来看代码:

pragma solidity ^0.6.0;

contract Test {
    function test1() public {
        for(uint8 i = 0; i < 10; i ++) {
            if (i == 3) {
                continue;
            }

            ...
        }
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

上面的代码是如果i = 3后跳过这次循环。

5、return 语句

return 是返回的命令当遇到return时就是表示结束了。看代码:

pragma solidity ^0.6.0;

contract Test {
    function test1() public {
        for(uint8 i = 0; i < 10; i ++) {
            if (i == 3) {
                return;
            }

            ...
        }
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

上面的代码可以看出,运行到i = 3时,程序直接结束。

6、 结束

到此我们的控制语句基本学习结束。这些概念每个语言都差不多,所以很重要。多练小伙伴!

结束

学习完上面的课程大家对于智能合约基本已经学习好了,但是还是缺乏使用,只是知道有啥东西,什么时候用不知道,这个时候需要大家进行锻炼了,多写一些小东西练习。

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:csdn
作者:

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


一、Conflux 网页钱包创建

前端达人

相信每一位新加入的小伙伴都有一个疑问,去中心化的钱包到底是什么,如何拥有一个自己钱包,如何使用这个钱包吧,下面我将会为大家讲解如何创建钱包、导入钱包、使用钱包三个方面讲解下。

一、创建钱包

首先大家进入钱包网站登录页面 (大家可以将该网址收藏), 可以看到页面上有两个选择,一个是创建钱包,一个是进入钱包(即导入钱包),我们先讲创建钱包然后在讲如何导入钱包。

我们点击创建钱包,将会弹出下面页面中的密码输入框,这里大家输入一个记得住得的密码(如果记不住写在小本本上藏起来),本教程输入密码为 000000000 然后点击继续。

我们会进入下面的页面,提示大家进行下载Keystore文件,大家点击下载就好了,这里的keystore千万不要丢了,和上面密码一样很重要。在进行导入钱包时,会根据大家的keystore文件以及密码进行计算出大家的私钥,因此很重要,最好备份到U盘中,以及打印一份。

下面是本次教程下载的keystore文件。

{"version":3,"id":"74e5b4a2-4894-4144-837c-61479487a565","address":"ad9af053f4ffed7a061226663ec50ce46736da9a","crypto":{"ciphertext":"eaeced1cd595adb51832c03feca291794eb593270e733776543ea4f095110bfb","cipherparams":{"iv":"73ca3e626b5625817679f43e2a81ec10"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"4e914d37a14cd522dc70dd88e079170481e82d45418cfd34a5c1ccbf8d0a409c","n":8192,"r":8,"p":1},"mac":"16769410e64e4ed4e0b89c43a84a338569696f46cf9ec604b82c87d4e99385ea"}} 
  • 1

我们下载好以后,会进入看到下面的页面弹窗。我们点击进入钱包。

点击进入钱包后,会进入个人的钱包页面,这个钱包中有CFX(测试币)、以及FC(合约币)。会发现都是0余额,很正常,刚刚创建嘛,是0就对了。

到此我们就有了一个钱包了,是不是很简单,温馨提示大家,密码 + keystore文件很重要,不要搞没了,没了就找不回来了。也不要公开,别人拿到了以后,就相当于知道你的钱包了,就可以把你的余额等都转走。

二、导入钱包

上面我们讲解了如何创建钱包,下面我们来讲解下如何导入钱包,已经使用钱包的小伙伴已经发现了吧,当我们刷新浏览器页面时,会直接进入到钱包登录页面,这个时候我们已经创建了钱包,肯定不会在创建一个了,那么我们就看下如何进入钱包(即导入钱包)吧。我们点击进入钱包,

会弹出下面页面,我们继续点击继续按钮

会让我们选择文件,这里直接选择我们在上面创建的钱包时,下载的keystore文件,点击打开

这里会让我们输入密码,就是上面创建钱包时的密码,输入密码后点击进入

是不是进入了大家熟悉的钱包页面啦!

导入钱包是不是很简单,这会知道keystore和密码重要性了吧!!!

三、钱包使用

小伙伴是不是还是很懵,我有了钱包能做什么,我来给大家介绍下钱包如何使用。大家可以看到下面钱包页面上我标注的10个功能序号。我将为大家介绍这10个功能。

功能1,复制钱包公钥地址,这个钱包公钥地址,可以进行公开,这个合约地址就是大家进行接受转账的地址,每个人都有一个唯一的公钥地址。

功能2, 钱包公钥地址二维码,可以使用支持扫码的dapp进行扫码来解析出来你的公钥地址,同样是可以公开的。

功能3, 区块浏览器,可以在该页面查询某个账户地址余额,出块情况,交易hash等等信息。

功能4,钱包私钥,这个私钥很重要,和上面的keystore+密码是一样重要的,可以直接通过私钥,进行进入你的钱包中,因此,不能进行公开。

功能5,cfx发送, 这里点击发送后会让我们输入转出cfx余额,以及发送地址,还有燃油费等信息,大家可以在测试网建两个账号相互转转,挺有意思的。

功能6,cfx接收,这个就是功能1和功能2的集合体。

功能7,申领测试币,可以申请测试币,每次会申请100测试币,大家随便使用,反正上线后会清除的,没啥用。

功能8,fc发送,这个功能可以在两个账户间来回转下,大家不要随便转给别人,不然就找不回来了。这里的fc是真正的可以在上线后也是能用的。

功能9,fc接收,和功能6一样的东西。

功能10,这个是查看合约信息的情况的入口。可以看到总量等信息。

四、钱包转账

我们以CFX钱包账户来进行转账,转给某个社区的小伙伴的账户地址(0x10898FD8a20C28A2F2Ea46428cAfBD2B58c1E363)这个小伙伴是谁我也不知道。我们点击CFX下面的发送按钮。进入下面页面

我们在发送至中填入这个小伙伴地址,发送cfx为10cfx.

点击发送看到下面的弹窗,我们这次不点击那个确定点击下面查看详情

可以看到进入了区块浏览器中了。里面的交易hash是本次交易的hash通过这个可以查找到本次交易情况,发送方就是你本人的公钥地址,接收方是对方的公钥地址,价值就是你转了多少cfx,差不多知道这些信息已经够了。

到此我们钱包课程已经基本介绍结束。

五、结束

感谢小伙伴们阅读本文。有对conflux感兴趣的小伙伴可以添加我微信好友(15832013094),我拉大家进入conflux社区群。一起共同学习进步。


分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:csdn
作者:

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

设计师常用沟通秘籍:金字塔原理

鹤鹤

如何在很短暂的时间把你的建议和想法清晰的传递出去需要非常强的沟通技巧,那么今天和大家一起交流下我使用最多的一个沟通原则-金字塔原则。


什么是金字塔原理

    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01eecb61302dcd11013f4720911215.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
金字塔原理是由Barbara Minto创建的一种结构化思考方式,也是麦肯锡公司在用的重要工具之一。金字塔原理更多是一种逻辑呈现,很多的公司里面都会用到。也就是表达一个观点时候,根据以下三个步骤: 
1.首先从答案部分开始;
2.分组并总结你的支持论点
3.逻辑性的整理出你的支持性观点。
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        我们一起来看看如何在平时项目和设计中运用这个原理。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <br />
    </p>
    <h1 style="outline:0px;margin:0px;padding:0px;text-align:center;">
        <span style="outline:0px;margin:0px;padding:0px;font-size:24px;">先从事情答案开始</span> 
    </h1>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01c10a61302df711013f4720ed8c5d.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        作为产品设计师,我们要以一种结构化的方式与那些忙碌的主管、领导沟通,就必须首先从高管关心的答案开始,然后列出你的论点,<strong style="outline:0px;margin:0px;padding:0px;">通过这种「自上而下」的方式表达出你的想法。</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        今天我们的很多设计师其实逻辑不太好,在产出你的设计方案和设计提案时,往往先讲很多分析,分析完了讲方案。然后得出结论,这个是大多数人的做法,这样做容易出现一个问题就是:有时候如果逻辑之间没有串联性,很容易牛头不对马嘴。举个例子,很多同学在讲作品集时候,很喜欢放一堆推导的过程,什么用户画像,人群特点,痛点等等一堆的观点,但是最后呈现的视觉方案往往和前面推导的过程相差甚远。推导的方向是ABC,结果设计稿是EFG,这样的结果就会显得你逻辑混乱。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/014a5661302e0411013eaf7036bed4.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <strong style="outline:0px;margin:0px;padding:0px;">按照金字塔原则,我们在表达一个观点时候-先从答案开始</strong>,当你主管提出一个问题时,你的回复应该是「我们应该做某事」,观点非常直接明了,只有这样,在你抛出答案后,我们才能提出对应这样做的理由。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01393661302e1311013f47201a7a5d.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        为什么我们要从先答案开始?因为今天你和你主管沟通也好,和产品或者高管沟通也好,你要最大程度上运用好你的时间,这些领导都是大忙人,他们每天的行程非常满,没有办法听你在介绍一个项目从项目背景,人群等等维度去徐徐道来。如果你前面讲一堆他没有关注的内容时候,就会变得尤其不耐烦。所以这也是为什么很多同学在设计提案时候总是让人感觉啰嗦,因为<strong style="outline:0px;margin:0px;padding:0px;">你没有关注到对方想要重点看到的内容,你只是在表达,你觉得好的。</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        所以为了最大限度利用你和一个领导短暂的沟通时间,你首先要做的就是抛出对于这个事情的答案和建议。或许很多时候,<strong style="outline:0px;margin:0px;padding:0px;">领导可能已经心中对于这个事情已经有答案了,如果你们的观点一致,他会快速接受你的建议,继续到下一步,而不需要你从头到尾讲一遍。</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/0112e661302e2211013eaf70e11ab6.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        另一个很大的原因是,<strong style="outline:0px;margin:0px;padding:0px;">很多领导思考问题一般会从大局出发啊,会自上而下去思考,他们会把精力放到更高的点,他们不想太纠结于细节过程,他们在评审一个设计,或者一个产品功能时更多关注答案本身</strong>。然后再逐步了解细节,所以我们一定要学会融入这些主管思维模式。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01f6f061302e3511013eaf70e0c402.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        当你领导问你一个问题该怎么做时候?你直接丢出答案,会更加的有说服力和咨询。而不是开始寻找理由,或者各种犹豫,因为你一上来就回答了别人问你的问题。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <br />
    </p>
    <h1 style="outline:0px;margin:0px;padding:0px;text-align:center;">
        <span style="outline:0px;margin:0px;padding:0px;font-size:24px;">分类并总结出观点</span> 
    </h1>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01358761302e4811013f47202f397d.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        前面我们抛出了我们的答案和观点,那么接下来我们就要分类并且说出能够支持你结论的理由,一般我建议以3个论点去阐述,为什么是3,大家可以看看之前我写的《设计师常用的思考秘籍:三的法则》。阐述的时候,参加会议的人或者领导自然而然的会把你的论点和想法归纳总结,同时也会更容易记住。这样去表述观点,会让你整体的方案更加容易被接受。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/0129f061302e5311013f4720fb9b7d.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        我们来举个例子,你的主管问你,你觉得苹果的设计为什么好?那么你可以先抛出答案:因为苹果的设计很简约,非常易用,让用户感觉很贴心,同时它的设计很好将商业和美完美的结合。具体的表现有三个:
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        第一个简约,苹果的设计非常现代,简单的线条,白雪的设计语言,让苹果系列产品非常具有识别性。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        第二点苹果设计没有过多装饰性设计,每个设计都会让你感觉很贴心,比如根据光线,自动调节屏幕,时钟会随着时间而变化,系统会根据时间调整颜色等等。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        第三点苹果的设计很好的将商业价值最大化。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        那么你从上面几个维度去和领导沟通,就能很有说服力,你上来就给出了答案,同时还分组的阐述了你的论点。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01752861302e6211013eaf70ce9e40.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        再来一个案例,比如可口可乐出了一个新的茶品牌,融合植物、茶淬取物和其他健康成分。所以他品牌设计是个绿色,假如今天你在和领导提案时候,领导问你,为什么要选择绿色作为品牌设计?
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        你是不是可以这样回答他:因为绿色能给人自然,环境,健康的感受,具体表现有以下三个方面:
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        1.从色相情感表中选择绿色也是自然健康的代表,用户会第一时间感知到。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        2.同时绿色也和新鲜环保概念能很好的结合。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        3.我们的配料也是从绿色植物里面提取的。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        当你分组并总结你的论点时候,能更容易把你想法传递出去,并且让人很好的理解,逻辑性的归纳总结你的观点。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01cdd061302e7911013f47202efda1.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        金字塔原理在做设计提案或者作品集时也非常有效,我们会经常去说产品问题有哪些,然后得出我们的设计目标ABC,然后利用金字塔原因,我们根据设计目标A得出设计方案A,根据设计目标B得出设计方案B,根据设计目标C得出设计方案C,这些方案之前有关联关系,有互相映射的关系。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        很多同学容易在这一步出现问题,设计目标是ABC,设计方案却是DEF,完全没有关联性。还记得我之前和大家分享的,<strong style="outline:0px;margin:0px;padding:0px;">今天你在阐述一个观点时候,一般可以基于三个点去表达,第一个点一般是最主要的,根据重要程度,最重要到次要逐步呈现。</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <strong style="outline:0px;margin:0px;padding:0px;"><br style="outline:0px;margin:0px;padding:0px;" />


金字塔原则在生活各处可用

    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/0155af61302e8e11013f4720a158d7.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        比如写作上,很多人问我平时写作有什么方法么,其实很简单就是运用金字塔原理,比如我想写一篇关于鲁班取代设计师文章,那么怎么去写:
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/019a7161302e9a11013eaf7041a5d8.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <strong style="outline:0px;margin:0px;padding:0px;">1.先抛出答案:</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        鲁班不会取代设计师,取代的只是重复性的设计,设计创意和设计理念不会被取代。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <strong style="outline:0px;margin:0px;padding:0px;">2.分组并总结出支持你观点的内容</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        比如观点一,设计理念是机器无法去做的,设计文化,设计历史这些有文化传承的内容,举例说明。观点二,有创意是设计无法取代,比如很多创意广告这些,这些需要大量脑洞等等。观点三,重复性的工作会被去掉,所以设计师要把精力关注到设计创意和设计理念,设计思维层面上。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <strong style="outline:0px;margin:0px;padding:0px;">3.设计总结</strong> 
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        那么根据上面那些观点,得出我今天文章想传递的三个观点:
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        1.鲁班不会取代设计师,反而会减轻设计师压力,帮我们解决重复性设计,我们可以把精力放到更有价值的设计上去。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        2.设计师要把价值放在产品体验上,产品问题,使用不顺畅这些是设计师可以发现,机器无法发掘的,我们需要去洞察用户,做出好的设计驱动业务。
    </p>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        3.重点多花精力在设计理念和设计创意上。
    </p>
    <h1 style="outline:0px;margin:0px;padding:0px;text-align:center;">
        <span style="outline:0px;margin:0px;padding:0px;font-size:24px;">最后</span> 
    </h1>
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;font-size:16px;line-height:32px;text-align:justify;">
        <img src="https://img.zcool.cn/community/01affa61302ea911013f472023a554.png" style="outline:0px;margin:22px auto 0px;padding:0px;max-width:100%;display:inline-block;" /> 
    </p>
了解一个事物的结构,可以帮我们反思并且发现一些问题漏洞。这也是为什么我推荐设计师一定要学会金字塔原则,因为今天 我们在做产品的过程中,首先要建立共识:我们的产品主要解决什么问题?为什么应该如何去解决,怎么判断优先级?我们的解决思路是什么?数据上有什么问题?这些问题都需要我们去提前思考。同时金字塔能够帮你了解更多你不知道的事情,并且得到很多设计验证。 
    <p style="outline:0px;margin-top:0px;margin-bottom:0px;padding:0px;color:#666666;line-height:32px;text-align:justify;">
        <br />
    </p>
    <p style="font-size:16px;box-sizing:border-box;margin-top:0px;margin-bottom:0px;caret-color:#333333;color:#333333;white-space:normal;font-family:-apple-system, BlinkMacSystemFont, &quot;text-align:justify;outline:0px;padding:0px;">
        <span style="box-sizing:border-box;color:#666666;">蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。<br style="box-sizing:border-box;" />


文章来源:站酷   作者:我们的设计日记
    <p style="font-size:16px;box-sizing:border-box;margin-top:0px;margin-bottom:1rem;white-space:normal;color:#525252;font-family:&quot;background-color:#FFFFFF;text-align:justify;">
        分享此文一切功德,皆悉回向给文章原作者及众读者.
    </p>
    <p style="font-size:16px;box-sizing:border-box;margin-top:0px;margin-bottom:1rem;white-space:normal;color:#525252;font-family:&quot;letter-spacing:0.1px;background-color:#FFFFFF;text-align:justify;">
        免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
    </p>
    <p style="font-size:16px;box-sizing:border-box;margin-top:0px;margin-bottom:1rem;white-space:normal;color:rgba(0, 0, 0, 0.84);font-family:&quot;letter-spacing:0.1px;background-color:#FFFFFF;text-align:justify;">
        <strong style="box-sizing:border-box;font-size:14px;font-family:微软雅黑, Arial, Helvetica, sans-serif;color:#323232;"><b style="box-sizing:border-box;widows:1;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="font-family:&quot;font-size:14px;background-color:#FFFFFF;white-space:normal;widows:1;line-height11111111111111111111111111:20px;color:#3e3e3e;box-sizing:border-box !important;"><strong style="box-sizing:border-box;font-family:微软雅黑, Arial, Helvetica, sans-serif;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><a href="http://www.lanlanwork.com/blog/admin" target="_blank" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;">蓝蓝设计</a>(&nbsp;<a href="http://www.lanlanwork.com/" target="_blank" style="box-sizing:border-box;text-decoration:none;color:#0C386E;transition:all 0.5s ease;vertical-align:baseline;padding:0px;margin:0px;text-indent:34px;background-position:0px -60px;">www.lanlanwork.com&nbsp;</a>)是一家专注而深入的<a href="http://www.lanlanwork.com/index.html" target="_blank" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">界面设计公司</a>,为期望卓越的国内外企业提供卓越的UI界面设计、<a href="http://www.lanlanwork.com/bs.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">BS界面设计&nbsp;</a>、&nbsp;<a href="http://www.lanlanwork.com/csjm.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">cs界面设计&nbsp;</a>、&nbsp;<a href="http://www.lanlanwork.com/scjm.html" target="_blank" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">ipad界面设计</a><a href="http://www.lanlanwork.com/csjm.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">&nbsp;</a>、&nbsp;<a href="http://www.lanlanwork.com/baozhuang.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">包装设计&nbsp;</a>、&nbsp;<a href="http://www.lanlanwork.com/icon.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">图标定制&nbsp;</a>、&nbsp;<a href="http://www.lanlanwork.com/yhty.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">用户体验 、交互设计、&nbsp;</a><a href="http://www.lanlanwork.com/web.html" target="_blank" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">网站建设</a><a href="http://www.lanlanwork.com/WEB.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">&nbsp;</a>、<a href="http://www.lanlanwork.com/xz.html" style="box-sizing:border-box;text-decoration:none;color:#886353;transition:all 0.5s ease;padding:0px;margin:0px;background-position:0px -60px;">平面设计服务</a></b></b></b></b></b></b></strong></b></strong></b></strong></b></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></strong></b></b></strong> 
    </p>
    <div style="font-size:16px;">
        <strong style="box-sizing:border-box;font-size:14px;font-family:微软雅黑, Arial, Helvetica, sans-serif;color:#323232;"><b style="box-sizing:border-box;widows:1;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="font-family:&quot;font-size:14px;background-color:#FFFFFF;white-space:normal;widows:1;line-height11111111111111111111111111:20px;color:#3e3e3e;box-sizing:border-box !important;"><strong style="box-sizing:border-box;font-family:微软雅黑, Arial, Helvetica, sans-serif;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><strong style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><b style="box-sizing:border-box;"><br />




</div>



交互设计师该如何高效地分析问题

鹤鹤

一. 明确和理解问题

明确和理解问题就是要看透这个问题的本质是什么,明确要解决这个问题可以用到的资源都有哪些。

理解问题的重要步骤:1.问题痛点梳理;2.产品功能流程图梳理;3、用户画像分析;4.数据分析(热力分析、留存分析、事件流分析)


二. 拆分问题

拆分问题就是问题痛点的出现核心问题,拆分问题涉及的维度的关联性拓展有哪些。

拆分问题的重要步骤:1.用户的核心行为路径分析;2.功能头脑风暴;3.解决方案的探讨


案例:配送管理的业务组件【打印交互组件重构】

【背景】

配送的打印功能主要服务于行政管理人员,每天对配送模块的订单和司机管理,进行打印操作,打印前会频繁配置不同打印需求

【现有问题】

1、满足功能上,体验上缺乏引导,导致用户学习成本较高;

2、历史包袱,随着功能需求不停迭代,功能层级划分混乱,导致用户操作理解时间成本较高;

【前期准备】

理解问题模块—问题的梳理:

交互上:操作复杂,交互组件错误使用,体验感差,难用

功能上:功能臃肿,层级划分混乱,难理解

【理解问题模块—功能流程图梳理】



【解决问题模块—数据分析(热力分析、留存分析、事件流分析)】


1.热力分析(GIO)

配置的需求基本上30天数据反馈可以看出,没必要进行“配置页”为主路径。


这里可得出:是否存在每次打印设置的需求,为以后的交互迭代提供快捷配置的可能性。


2.拆分问题—用户的核心行为路径分析:

主路径:查看列表——批量打印——打印完毕(80%)



特殊:查看列表——批量打印——设置模版——打印完毕(20%)



3.拆分问题—解决方案的探讨:【核心:以人为中心 解决问题】

交互上:操作复杂,体验感差,难用

功能上:功能臃肿,层级划分混乱,难理解


【功能层:功能梳理重组】

【交互层:信息关联】

1.交互关联性更强,现在是联级反馈,解决点击一级内容不知道二级内容的编辑的可视区域;

2.功能信息更直观,布局界面可看出功能逻辑,勾选后及时反馈,解决经常忘记勾选打印的选项;



【方案输出】

方案一:配置页的构想,假设在设置模块有单独承载打印配置的区块,而当前对话框的勾选内容是便捷选项,如需要更深设置,需跳转到打印配置区块

方案二:列表的打印功能添加,全局设置,与当前对话框选择设置进行协助配置,如:列表全局的打印功能设置“不再弹出窗口”设置,点击当前的对话框,是直接打印操作


【可用性测试】

采用行为观察法。


【迭代成果】


       迭代前                                                                      迭代后




蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

文章来源:站酷   作者:麦海欣

分享此文一切功德,皆悉回向给文章原作者及众读者.

免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务



从视觉、交互和技术三个方面浅析2021设计趋势

鹤鹤

一、社会背景  Social Context


2020年因为疫情,让协作、云端、即时通讯、远程会议、AI智能等等,成为了远程办公的必需品。目前,疫情在国内已经获得了控制,后疫情时代已经到来,许多最初没有的习惯,在发现新的工作模式更加有效率后,也即继续保留了下来,这些保留下来的习惯,也将在2021年会更进一步的发展。



1.大厂的变化

在视觉设计层面,个大设计语言陆续推出了新的设计版本,更为突出个各自设计风格,以建立自己的视觉护城河,谷歌发布了 Android 11,Apple发布了 IOS 14,微软持续宣传他的 Fluent UI 设计理念,在国内的办公领域,腾讯文档推出了类似 Fluent UI 设计理念风格,石墨文档依旧保持独特的东方韵味,飞书发布了飞书文档,继承飞书本身简洁的 UI ,以及活泼的插画风格。


谷歌的 Aandroid 11 

基于 Material Design 设计的 Android 11 ,装饰上运用简洁的几何图形,UI 细节上开始趋向圆角的运用,色彩方面选择了更为协调的配色,对比之前版本纯度有所降低,显得更为高级。视频链接:file:///Users/javascript/Desktop/0bf2miadcaaa7eamerkc6fqfaywdgfraamia.f10003.mp4


苹果的 IOS 14

UI 设计延续原有的风格,清晰的字体,大圆角的运用,加上丰富的动态效果,并且新增了许多贴心的新功能,例如悬浮播放视频、主屏幕的Widget。


微软的 Fluent UI

这是微软为跨平台,而提出的设计解决方案。支撑设计概念的关键词有深度、材质、动画、光线等等,这听起来感觉与 Material Densign 特别相似。不过在最终的视觉呈现上微软会更接近于真实世界。例如,透明的毛玻璃效果,或更为立体的图标等。


2.社区中的热门设计

Behance 和 Dribbble 在2020年出现了许多以 3D 插画为主视觉的设计方案,因为技术的发展,设计师借助 Figma 或 Dimensions 就可以轻松的创作所需的 3D 素材。关键的这不是设计方案中的“花瓶”,因为在Mac的最新系统 Big Sur 中,已经开始运用了 3D 的图标,相信在以后的 3D 的运用场景将会不断的被挖掘出来。


2020年初时在Dribbble流行起来的一个风格叫“新拟态”,这是将投影运用到极致后出现的效果,正如作者所说的:让我们想象一下,如果在移动界面设计中,投影的形式发展的更好的话,那将来的界面将会是什么样子的,这是我的愿景”。新拟态在视觉上表现确实很惊艳,为此Aandroid还制作了一个新拟态的12宣传视频,但是主观感觉这应该很难广泛运用到实际产品当中。



二、UI设计 User Interface


1. 设计服务与内容

设计专注于表现内容,这是从包豪斯到现在一直遵循的规则,而这个理念也将会持续下去。设计目标终将是需要把关键信息传达到用户手中,让用户知道自己为什么在这,这里有什么,并且能到哪里去。


技术的发展,形式也一直在发生变化,提升信息传达效率,这已经不单是平面设计专属。学会运用动效,交互或智能推荐等综合的方法,来达到设计目标,会是将来常用的设计手法。


2.更大的圆角


在以前由于屏幕分辨率太低,窗口四角正常会运用直角,因为圆角会出现锯齿或者模糊,影响界面美观。而现如今移动屏幕质量早已超过纸媒的印刷技术,圆角也开始被广泛的运用。另一方面圆角在之前的认知中,是儿童的专属,是更为亲和力的表现形式。而经过几年的发展,这个偏见正在慢慢改变,因为圆角也可以做的很高大上,也能设计的很潮流。


苹果总是第一个吃螃蟹的公司,Mac 的最新系统 Big Sur 整体变得更加圆润,窗口四角从以前的 10px 增加到 20px ,并且全新的控制中心也沿用了 IOS 14 的设计风格和设计布局。值得在一提的是,微软 Win 10 的概念稿中也开始尝试运用起了圆角。所以这个趋势是蛮值得关注的一点。



3.用有含义的插画提升用户体验


设计师常常会陷入形式主义,而忽略了本该表达的内容,特别是在插画上。也许这个道理每位设计师都懂,但为何还是会前仆后继的扑倒在自我满足的陷阱中呢?也许原因中会有一点是,当内容过于直接表达,或者元素过于普通,就很容易让作品变得毫无趣味,这就是矛盾所在了。


那如果设计师既不想脱离内容,又不想设计出乏味的设计,怎么办?这就需要让插画具有含义,而不是沦为纯粹的形式。优秀的插画多承载的信息量,能够远比文字或界面UI来的丰富。



4. 新材料新拟态


包豪斯有个教学目标,“培养感觉清晰,认知准确的设计师”。因此在包豪斯的基础教学中,会让学员研究各种材料的不同属性。在 UI 设计当中,我们也能制作出各种各样的材料,在拟物化的时代就能证明这一点。但在 2020 年初时,当某位设计师发现了一种新材料,并把这种材料运用到了 UI 设计当中,一时间火爆整个社区,这就是上面提到的“新拟态”。 



这世界是充满可能的,所以我相信在未来还会有更多的材料会被发现,或者被以新的方式使用。例如,在 2020 下半年又有一种风格开始回归“毛玻璃”,其中我们所知道的钉钉,在钉钉 6.0 的设计概念中就融入了毛玻璃的效果。在社区中,毛玻璃也被运用到 UI 的各种场景中卡片、弹窗或图标等。实话实说,毛玻璃的材质的确能增加许多品质感。 



5. 自然的界面和运动效果


这里所说的自然,是能让人感到熟悉和安心,是以人为本的设计。王敏老师说过:“科技求真,艺术为美,设计从善,设计可以作为结点,让真善美实现统一。”链接人与产品之间的纽带是 UI 界面,它需要承载不仅是信息内容,还有用户体验,因此,以人为本的设计终会赢得用户的喜爱。


自然运动效果,不是那种大开大合的炫酷效果,而是让界面过渡更为自然合理。想要让界面体验更为自然,那必然要遵循真实世界的物理规则。例如,重力、摩擦力、向心力、浮力等动态效果。



6. 来自未来的风格


科学技术的快速发展,让我们感觉未来近在咫尺,但又十分迷茫不知何去何从。我相信承载UI的媒介,必然不仅仅是现在我们所使用的各种设备。VR、AR 或全息影像等技术发展,将使得UI设计会有更多的可能性。赛博朋克2077也许真的离我们不远,那种满世界无处不在屏读的社会,怎样的设计才能真正满足需求呢?这是我们需要长期思考的问题。



7. 深色模式


在2020年各大厂都推出了暗色调模式,这已成了如今APP的标配。除了深色模式外,以后还会在可视性、场景和现实成本等因素方面,更近一步的打磨。




三、插画风格  Illustration


1.更具装饰性的平面插画风格


虽然在 2020 年不管是社区,还是实际项目,许多设计师都开始热衷于 3D 插画,就连苹果微软也不例外。但是 Google 却继续坚守自己的设计风格,扁平的装饰性插画,例如 Android 11 就运用简单的几何图形进行装饰,相关的插画也是更多运用的扁平风格,这种坚持必然会有其重要的原因。


装饰性插画在各种屏幕的适配性更广泛,并且在绘制成本和实现成本方面也会更有优势。在屏幕媒介还没发生颠覆性改变前,我认为扁平的装饰性插画在未来将还会大放异彩。 


2.情感化的插画设计


后疫情时代的远程办公,我们需更加考虑如何缓解合作的疏离感。如何拉近人与人之间的协作,打破远程的空间桎梏,让合作更具沉浸感。这时情感化的设计就能充分体现它的价值,例如,这几年开始火的 emoji 头像,或者各种表情包,它们让沟通的双方产生情感共鸣,而不是面对着冷冰冰的屏幕。


3. 插画的组件化与创新


皮克斯运用技术的创新,提升了质量和效率,从而改变了整个动画的历史。对于我们来说,未来的插画需求会越来越多,并且还要求独特的创新性,这就需要有更优的解决方案。


Ant Design 的 HiTu 在 SEE Conf 的时候提出了解放图形化生产力,那就是将插画各部件组件化,这有效的提升插画效率。然而在插画库的维护方面,还需要设计的创新。因为效率的提升,让设计师能有更多时间,专注于更有创造性的工作,然后将新的创意理念融入部件,最终完善整个插画组件库。 





四、交互方式  IInteraction


1. 多屏协同办公


凯文凯利在《必然》里讨论了关于未来的生活方式,他认为我们的未来环境会充满各种屏幕,它将会在各种事物的表面出现,屏读会从我们起床开始到晚上睡觉,一直出现在我们视野中。如今的人们每人都有各种各样设备,因此,多屏协同办公是必然的趋势,不管你是与人合作,还是独立工作。


万物互联已经是很久的话题了。在 2020 年华为的鸿蒙系统,发布了跨设备进行的分布式交互,实现了多屏协同。我感觉,这将是很重要的一步。 



2. 秒验身份认证


身份认证是信息安全最关键的一步。我们通常会用身份 ID 加密码进行登录,并且为了验证你不是机器人,还会加上人工输入验证码,如果再有其他的设置选项,那我们的登录交互就会被拉的很长,有时还会出现登录失败的情况。在如今浮躁的社会,许多用户也许在前几步就已经失去了耐心。 


移动设备拥有有丰富的传感器,并且精度也在逐年的提高。随着指纹、面部、虹膜等等技术成本的降低,这些技术也开始越来越普及化。如今使用新的识别技术,很轻松就能完成各种身份认证。 




3. 单手交互的挑战


当年乔帮主一直坚持的单手操作,而如今,手机屏幕逐渐越来越大,单手操作已是一种奢望。为此,各手机品牌想方设法的改变交互方式,为的就是能实现单手操作,并且为此作为宣传的噱头。iPhone 轻点两下 home 键或向下轻滑虚拟 home 键,就能让整个内容向下移动半屏,从而方便单手操作顶部功能。 


想达到目标的第一步,就是办法让拇指能触及到功能。但我们还需要进一步思考的是,拇指本身的灵活性并不高,并且也只能是单点触控,那怎样的交互形式能满足日益复杂的交互需求呢? 





4. 折叠屏

屏幕可拓展,将会是移动办公的重要转折点。不管是需要长篇编辑的文字,还是画板无限大的表格,或者是需要强大美化功能的演示,这都需要足够大的屏幕才能有更优的体验。折叠屏的出现让手机能代替平板,满足更多使用场景。折叠屏目前由于成本的原因,在大众眼中还属于新事物。但我相信成本在未来不会是问题,更重要的问题是,屏幕形式的变化,对于交互来说将会有哪些影响,并且如何挖掘其中真正的潜力。



五、技术升级  Iechnology


1. 关注隐私保护


自 MIUI12 隐私功能发布后,APP 访问隐私频次大幅下降,这使得应用的行为越来越规范,也因此获得了用户、国家相关机构和媒体的认可。 



在凯文·凯利的《必然》中描述了这样的一个未来景象,我们的各种状态将会被设备所跟踪,大到你的地理位置,小到你的心跳,你所经历的一切都将被上传到网上,设备能通过对过往的分析,给你推荐各种商品或服务。这很美好,但同时也存在许多风险。在《窃听风云》的电影情节中,就是由于先进的窃听技术,造成了各种无法预估的灾难。所以这是一把双刃剑,在技术进步的同时,我们也需要时时刻刻关注隐私的保护。 




2. 智能自动化办公


在 2019 的 Google I/O 大会上,Google Lens 展示的 AR 点菜功能可以智能识别用户扫描的菜单并将美食网站上的相关推荐直接呈现在屏幕上。当识别到小票信息时,可快速提取小票上的金额,且可自动弹起计算器快速帮助用户计算人均消费,节省人工计算的时间成本。 



在办公场景下,如何帮助用户减少无谓的工作,让更多精力专注于内容。把排版规范、素材提取、文件管理、功能查找等琐碎的事情,交给人工智能来完成。在以前工业时期有机器的赋能下,人们的生产效率进行了一次飞跃,而下次的效率提升将会是人工智能。 




3. 脑机

是否希望自己学会“量子阅读法”呢?也许 5 分钟实现十万字快速阅读不是梦。Neuralink 发布了 Link V0.9 版的脑机接口,并且已经在动物上进行实验,他们通过把一块微芯片植入猴子的大脑,然后让其通过意念玩电子游戏。虽然这产品在人类普及的概率几乎为零,但是这也算是人类向前迈出了一大步。 



这只是一个开始,未来的设备将不局限于可穿戴,而会是与人体紧密相连。或许可以想象一下,在未来人们会像在医院预约挂号一样,在科技公司楼下排队更新升级身体里的“机械器官”。 



4. 虚拟现实&增强现实


如果要说接下去哪个技术变革,将对我们生活工作产生重大影响,我认为将会是 VR 和 AR。在沟通方面,体验将会变得更为真实。远程沟通常常效率很低,其中很重要的一点是空间的距离感,而空间的距离会产生双方链接的不稳定性,因为双方无法达成眼神、肢体等信息的交流,有时候一个眼神或者动作就能完成的事情,需要反复的语言交流,甚至会陷入各种尴尬的境地。 



除了沟通之外,在工作、生活、学习等领域,VR 和 AR 也将会有更多可能,媒介的属性不再是二维平面,而是三维空间,这使得它能提供更为沉浸式的交互体验。 



5. 5G 运用


依稀记得上大学时 4G 时代的到来,旁边的人都在说网速多快多快,听歌看视频一点都不卡。 


而如今 5G 开始普及,网速也再次提升,但外界对其的评价褒贬不一,其中最为常见的话题就是“5G 对我们的生活将会有什么改变呢?”,有人觉得它只会提高我们每个月的话费,也有人提出 VR/AR 全景直播、高清远程会议、无人机作业、自动驾驶等技术将会更为成熟。


不管如此,5G 在 2020 年度过各种坎坷,最终普及到我们每个人身上。5G 对许多领域都会有质的影响,特别是依赖网络环境的场景。其中就有办公领域,大文件上云、协同办公或远程会议,5G 将会给这些场景提供更好的体验,也会让更多可能变为现实。 



这篇文章是对当下的思考,也希望能对 2021 年的工作带来些许帮助。在这过程中越是总结,越是对未来的趋势感到迷茫,一篇文章并不能囊括所有内容,不足之处也希望理解。在未来或许会有数不尽的黑天鹅,也可能因为技术爆炸,使得新的潮流突然的兴起,未来是无法预测的,所以,就让我们一起拥抱变化吧~


蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

文章来源:站酷   作者:篮子瑶

分享此文一切功德,皆悉回向给文章原作者及众读者.

免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


如何与利益攸关方合作进行医疗设计项目?

鹤鹤

一些有用的建议和工具帮助你与患者、医生、医院管理人员和其他医疗保健利益相关者一起进行设计。

近年来,医疗保健组织开始使用“设计师”方法进行创新,以提高患者和护理人员在设计和提供医疗服务的参与度。然而,将设计方法引入医疗部门也是困难重重:思维方式的差异可能导致双方关系紧张,同时我们仍需要提供更多的证据,证明设计实践会给医疗保健部门带来更多的价值。


1.调整所有人的目标


在处理服务设计项目时,无论是参与式还是共创式,我们需要从一开始确保所有利益相关者的目标和期望一致,以促进合作顺利有效,产生有意义的成果。


所以我们可以用到Expectation Map或者the Alignment Canvas这两个工具可以帮助理解人类的愿景和优先排序,从而使团队对项目的理解同步起来。


这两个工具在项目初期调整成员目标,构想用户对服务的期待,建立同理心,全面地呈现了不同的观点。


这个工具包提供的帆布是个简单的表格,帮助确定每个涉众的价值和目标,突出公共点和交叉点,利用不同角色不同价值的可视化卡片填充画布。


建议

-每个利益相关者可以从卡片中选择自己的价值观或添加价值观,讨论相同点和冲突点,制定共同目标。
-如果项目涉及三个以上的利益相关者,可以采用相同的概念模型来反映所有价值观和共同点。


2.了解项目生态系统


医疗服务中有各类行为者,行为者之间以及行为者与用户之间存在特殊的关系。因此,我们必须清楚当前设计服务的影响人,以及影响程度。


使用利益相关者地图反映不同行为者的角色和责任,以便更清楚地了解你正在设计的服务生态系统。


利益相关者地图不仅有助于可视化服务系统和用户体验中的不同利益相关者,还可以可视化相关者与主要用户的互动程度。这个模版将医疗领域的利益相关者分为三类:医疗经营者,辅助人员和大型病人群体。


建议

-将代表主要用户或利益相关者的行为者卡片放在中心位置。
-将行为者卡片按照利益相关者群体进行分类,并将卡片放在画布的相应区域。
-将那些与主要利益相关者互动程度较高的行为者放在内圈;除了医疗系统外,还要考虑的更广阔的生态系统。


3.反应不同的用户类型


研究项目背景,收集服务生态系统中人们的行为、动机和特点等第一手资料。构建角色有助于更好地了解设计医疗服务中的病人和医生(或其他医疗经营者)的需求、习惯和态度。


为了更好地促进这一阶段的分析,工具包中的角色模板记录了病人和医生简历上的一些具体的医疗信息,如疾病类型和医疗知识。


建议

-对于病人角色,首先选择病人和疾病类型。
-对于医生角色,首先选择医生简历,记录痛点。
-利用卡片,选择与角色互动的环境和行为者,喜欢的互动渠道,价值观和经历的情感。


4.分析经历 构想更好的服务流程


我们都清楚,用户旅程是一个强大的工具,能够绘制服务体验,包括现有服务和待设计的服务。


我们也可以与病人或医疗行业的其他利益相关者共同绘制用户旅程,建立对用户体验的理解。


你也可以直接与利益相关者合作,确定具体痛点和在服务中可能造成摩擦的其他因素。


这套工具所建议的医疗旅程图可以用来分析病人和/或医疗操作者的体验并进行可视化,涉及到体验的所有成分:角色,行为,方式以及在接受或执行医疗服务时所经历的感情变化。


建议

-写出用户旅程地图需要的人物简历。

-卡片用为触发材料,促进病人和医疗相关人员分享经验,讲述故事。

-选择每个动作所经历的情绪,并将其垂直投射在相应的动作上。

-患者的用户旅程可以按照整个治疗过程绘制,有助于理解不同医疗步骤之间和相关部门之间的交叉点,以及可能出现的问题,形成一个全面的体验观。


5.通过评估 确定想法的优先性


在建立背景框架,分析了观点和体验之后,我们开始设计解决方案。让不同的利益相关者参与概念生成,方便作出改变或促进相关方接受新服务。


一旦确定了解决方案,接下来就要挑选最有潜力或最合适的解决方案,这项任务也十分困难,尤其是在复杂的环境中,比如与医疗有关的环境中。

蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

文章来源:站酷   作者:马克笔设计留学

分享此文一切功德,皆悉回向给文章原作者及众读者.

免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


Conflux智能合约——1.入门篇

前端达人

Conflux移植了EVM,兼容以太坊的合约虚拟机,使用solidity作为合约语言。所以,开发需要使用remix进行合约十六进制码的生成。

Conflux合约需要相应的sdk部署到链上,形成智能合约地址,再使用call或send的方法,调用在链上的合约 。

我们使用node.js作为开发环境,需要安装node.js的环境和java sdk。node.js使用express框架,而合约部署需要对应的 js-conflux-sdk(npm install即为最新版)。建立文件夹sol,存放下面的.sol和两个.json文件,其它安装和检查办法略去2000字。

remix下删除所有的原来.sol文件,添加自己的test.sol文件,代码:

pragma solidity ^0.5.0;

contract Counter { uint public count=0; event SelfEvent(address indexed sender, uint current);

    constructor() public {
    } function inc(uint num) public returns (uint){ return count += num;
    } function self() public { emit SelfEvent(msg.sender, count);
    }
} 

然后按图示选择配置,完成编译,分别生成一个abi.json和一个bytecode.json。

将bytecode文件里的bytecode字段保留值,其余内容都删除,另存为code.json。code.json内的内容仅为:“0x60.......”。例如:

"0x6080604052600080553480156100145......5056fea265627a7a72315820b814......0ff600baf64736f6c63430005110032"

写调用合约的代码deploy.js或者call.js。deploy.js 源码:

 // 私钥地址,即所用conflux的钱包私钥,注意保密 const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e'; // 合约地址 const CONTRACT = ''; const { Conflux } = require('js-conflux-sdk'); async function main() { const cfx = new Conflux({ // 节点的地址和端口号,这里用的测试网。实际最好用最新的主网地址 url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
    defaultGasPrice: 100,
    defaultGas: 1000000,
    logger: console,
  }); const account = cfx.Account(PRIVATE_KEY); // create account instance console.log(account.address); // create contract instance const contract = cfx.Contract({
    abi: require('./sol/abi.json'),
    code: require('./sol/code.json'),
  }); // deploy the contract const contractinfo = await contract.constructor()

    .sendTransaction({ from: account,

      gas: 100000000, // if not set gas, will use 'cfx.defaultGas' })
    .confirmed(); console.log(contractinfo.contractCreated);
}
main().catch(e => console.error(e)); 

而call.js源码:

 const { Conflux, util } = require('js-conflux-sdk'); // 这个地址是上面打印出来的 contractAddress 变量,钱包地址及私钥 const contractAddress = '0x2c692d83b1e4781fa9d894924f8a027c401ea9fa'; const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e'; async function main() { const cfx = new Conflux({
    url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
    defaultGasPrice: 100,
    defaultGas: 1000000,
  }); const contract = cfx.Contract({
    address : contractAddress,
    abi: require('./sol/abi.json'),
  }); // 不进行记录。注意,这里的inc就是定义在test.sol中的方法。.sol文件定义合约方法,被外部调用以实现应用目的 console.log("1输出" + await contract.inc(10)); const account = cfx.Account(PRIVATE_KEY); // 进行记录并花费燃油 const balance = await contract.inc(10).sendTransaction({ from: account }).confirmed();

}
main().catch(e => console.error(e)); 

call.js里的inc()就是定义在test.sol中的方法。.sol文件定义合约方法,被外部调用以实现应用目的。

将deploy.js和call.js放置在nodejs的工作目录下。

如果.js中的函数无错,链上节点正常使用,sdk版本匹配,启动node deploy.js或node call.js即可。如果有错误会有明显的error提示。


蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:开源博客

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

超级实用的干货 . 《 部署智能合约到conflux公链 》

前端达人

找到了一位大佬的文章,受到了许多启发


一、准备合约

本节课程教大家如何讲智能合约部署到conflux公链上,首先大家可以看到下面的这个智能合约是不是很简单。我们将会以这个合约演示部署到conflux公链的过程。

pragma solidity ^0.5.0;

contract Counter {
    uint public count=0;
    event SelfEvent(address indexed sender, uint current);

    constructor() public {
    }

    function inc(uint num) public returns (uint){
        return count += num;
    }

    function self() public {
        emit SelfEvent(msg.sender, count);
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

二、conflux的sdk安装

我们使用js-conflux-sdk作为本教程的web教程,交互首先我们需要进行安装nodejs作为我们的运行环境。飞机票一张收下吧,我们安装好nodejs后,就可以来玩我们的sdk了。废话不多说,直接开始撸。

我们使用WIN + R键打开命令行,然后创建一个文件夹(温馨提示切换到非系统盘玩切换方式“D:”就切换到D盘了)使用“mkdir my-project && cd my-project” 创建好项目后自动进入文件夹,然后我们运行“npm init” 进行初始化node项目,这一步会让你确认一些东西,如果你是小白一路回车(Enter键)就好。如果你是前端大神,我也没啥好教的我也不太懂。为了稳定我们使用固定版本号方式安装依赖,我们运行 “npm install js-conflux-sdk@0.9.2” 命令进行安装js-conflux-sdk的0.9.2版本依赖(可以使用“npm uninstall package-name” 命令删除对应依赖)。前置准备到这里基本已经完成。

三、编写调用合约js代码

下面请看我的目录结构跟随我一起来学习,下面的目录结构请不要直接看到了就创建,因为你不知道都是什么意思,看玩我的解释在回头创建。

image

小伙伴应该已经发现了 node_modules、package-lock.json、package.json 这些文件是我们在进行安装 sdk依赖时自动生成的。其他文件目前都没有,我们来按顺序生成他们。

先创建sol这个文件夹,然后创建这三个文件。test.sol就是上面我们的合约代码直接拷入文件中。abi.json和code.json两个文件是通过这个工具 remix 在线生成的。我来说下生成过程。
首先我们将里面的文件全部删除,然后点击这里找到我们的项目目录下的test.sol 文件

我们应该看到下方我框出来的两个按钮了吧,那两个按钮就是abi.json和code.json文件的来源。abi.json我们可以直接复制过去,code.json文件我们要改点东西。

首先我们看到的code文件应该是这样的

{
    "linkReferences": {},
    "object": "608060405260...c63430005110032",
    "opcodes": "PUSH1 0x80 PUSH1 ... 1100 ORIGIN ",
    "sourceMap": "27:337:0 ... 37;;;;;;"
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

代码有省略,太长不好看,我们看到object这个key值了吧,我们把它的值考出来然后在头部加0x 就好了放在code.json文件中。code.js文件中只存放object的内容前面加0x,也就是下面的代码,其他信息都不要,千万记住了。这点很重要!!!!

"0x608060405260...c63430005110032" 
  • 1

就是这样的。然后我们在写另外两个call和deploy两个文件

先写deploy文件

 // 私钥地址
const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e';
// 合约地址
const CONTRACT = '';
const { Conflux } = require('js-conflux-sdk');

async function main() {
  const cfx = new Conflux({
    url: 'http://mainnet-jsonrpc.conflux-chain.org:12537',
    defaultGasPrice: 100,
    defaultGas: 1000000,
  });
  const account = cfx.Account(PRIVATE_KEY); // create account instance
  console.log(account.address); 

  // create contract instance
  const contract = cfx.Contract({
    abi: require('./sol/RC20.abi.json'),
    bytecode: require('./sol/RC20.code.json'),
  });

  const receipt = await contract.constructor()
    .sendTransaction({ from: account })
    .confirmed();
  console.log(receipt.contractCreated); 
}
main().catch(e => console.error(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

打开项目cmd窗口在上面的目录下 运行命令 “node deploy.js”就将合约部署上去了

receipt.contractCreated 这个会打印出合约地址。













蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:csdn
作者:
原文链接:https://blog.csdn.net/pizhi1461/article/details/106967255

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

yarn的安装和使用

前端达人

yarn的简介:

Yarn是facebook发布的一款取代npm的包管理工具。


yarn的特点:

  • 速度超快。
    • Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。
  • 超级安全。
    • 在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。
  • 超级可靠。
    • 使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。

yarn的安装:

  1. 下载node.js,使用npm安装
    npm install -g yarn
    查看版本:yarn --version
  2. 安装node.js,下载yarn的安装程序:
    提供一个.msi文件,在运行时将引导您在Windows上安装Yarn
  3. Yarn 淘宝源安装,分别复制粘贴以下代码行到黑窗口运行即可
    yarn config set registry https://registry.npm.taobao.org -g
    yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g

yarn的常用命令:

  • 安装yarn

    • npm install -g yarn
  • 安装成功后,查看版本号:

    • yarn --version
  • 创建文件夹 yarn

    • md yarn
  • 进入yarn文件夹

    • cd yarn
  • 初始化项目

    • yarn init // 同npm init,执行输入信息后,会生成package.json文件
  • yarn的配置项:

    • yarn config list // 显示所有配置项
    • yarn config get <key> //显示某配置项
    • yarn config delete <key> //删除某配置项
    • yarn config set <key> <value> [-g|--global] //设置配置项
  • 安装包:

    • yarn install //安装package.json里所有包,并将包及它的所有依赖项保存进yarn.lock
    • yarn install --flat //安装一个包的单一版本
    • yarn install --force //强制重新下载所有包
    • yarn install --production //只安装dependencies里的包
    • yarn install --no-lockfile //不读取或生成yarn.lock
    • yarn install --pure-lockfile //不生成yarn.lock
  • 添加包(会更新package.json和yarn.lock):

    • yarn add [package] // 在当前的项目中添加一个依赖包,会自动更新到package.json和yarn.lock文件中
    • yarn add [package]@[version] // 安装指定版本,这里指的是主要版本,如果需要精确到小版本,使用-E参数
    • yarn add [package]@[tag] // 安装某个tag(比如beta,next或者latest)

    //不指定依赖类型默认安装到dependencies里,你也可以指定依赖类型:

    • yarn add --dev/-D // 加到 devDependencies
    • yarn add --peer/-P // 加到 peerDependencies
    • yarn add --optional/-O // 加到 optionalDependencies

    //默认安装包的主要版本里的最新版本,下面两个命令可以指定版本:

    • yarn add --exact/-E // 安装包的精确版本。例如yarn add foo@1.2.3会接受1.9.1版,但是yarn add foo@1.2.3 --exact只会接受1.2.3版
    • yarn add --tilde/-T // 安装包的次要版本里的最新版。例如yarn add foo@1.2.3 --tilde会接受1.2.9,但不接受1.3.0
  • 发布包

    • yarn publish
  • 移除一个包

    • yarn remove <packageName>:移除一个包,会自动更新package.json和yarn.lock
  • 更新一个依赖

    • yarn upgrade 用于更新包到基于规范范围的最新版本
  • 运行脚本

    • yarn run 用来执行在 package.json 中 scripts 属性下定义的脚本
  • 显示某个包的信息

    • yarn info <packageName> 可以用来查看某个模块的最新版本信息
  • 缓存

    • yarn cache
      • yarn cache list # 列出已缓存的每个包 yarn cache dir # 返回 全局缓存位置 yarn cache clean # 清除缓存

npm 与 yarn命令比较:

这里写图片描述


npm 与 yarn相关问题比较:

npm模块的依赖:
  • npm存在一些历史遗留问题,请看下图:
    这里写图片描述

比如说你的项目模块依赖是图中描述的,@1.2.1代表这个模块的版本。在你安装A的时候需要安装依赖C和D,很多依赖不会指定版本号,默认会安装最新的版本,这样就会出现问题:比如今天安装模块的时候C和D是某一个版本,而当以后C、D更新的时候,再次安装模块就会安装C和D的最新版本,如果新的版本无法兼容你的项目,你的程序可能就会出BUG,甚至无法运行。这就是npm的弊端,而yarn为了解决这个问题推出了yarn.lock的机制,这是作者项目中的yarn.lock文件。

yarn.lock文件格式:

这里写图片描述

大家会看到,这个文件已经把依赖模块的版本号全部锁定,当你执行yarn install的时候,yarn会读取这个文件获得依赖的版本号,然后依照这个版本号去安装对应的依赖模块,这样依赖就会被锁定,以后再也不用担心版本号的问题了。其他人或者其他环境下使用的时候,把这个yarn.lock拷贝到相应的环境项目下再安装即可。
注意:这个文件不要手动修改它,当你使用一些操作如yarn add时,yarn会自动更新yarn.lock。

使用yrm工具管理一些npm源

安装

  • yarn global add yrm

查看可用源

  • yrm ls

选择源

  • yrm use yarn

快速删除node_modules

手动删除真的很慢:

  • 安装: npm install rimraf -g
  • 使用:rimraf node_modules

rimraf是node的一个包,可以快速删除node_modules,再也不用等半天了


蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码ben_lanlan,报下信息,会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:csdn

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

npm,cnpm,yarn,tyarn 区别 与安装

前端达人



做前端的应该都用过标题提到的包管理器。简单说一下这4个包管理器的区别。

npm

这应该是最常用的,在某些情况会出现丢包,而且由于某种原因会下载很慢,通常会配置国内镜像。我已经很少用npm了,主要用它下载 cnpm 或 yarn。

cnpm

这个就是npm的国内镜像了。

yarn

它和npm最大区别是,yarn是并行下载的,所以下载速度很快,当然也是要配置国内镜像。

tyarn

这个就是yarn的国内镜像了。淘宝开发的。我主要就是用 tyarn。



一、安装

1.1 安装node.js

下载地址,选择自己的安装位置,一直next即可。

:.msi安装程序会自动添加node.js路径到系统环境配量


image.png

安装完成目录结构:


# 查看版本号
H:\Users\M>npm -v
6.4.1

H:\Users\M>node -v
v10.15.1 

1.2 安装cnpm

打开cmd命令窗口,执行:

npm install -g cnpm --registry=https://registry.npm.taobao.org
# 默认cnpm会会安装在自己的用户下面,并且自动配置了用户环境变量
# 比如我的安装在:H:\Users\M\AppData\Roaming\npm 
# 查看版本号
H:\Users\M>cnpm -v
cnpm@6.0.0 (H:\Users\M\AppData\Roaming\npm\node_modules\cnpm\lib\parse_argv.js)
npm@6.8.0 (H:\Users\M\AppData\Roaming\npm\node_modules\cnpm\node_modules\npm\lib
\npm.js)
node@10.15.1 (D:\Develop\nodejs\node.exe)
npminstall@3.20.2 (H:\Users\M\AppData\Roaming\npm\node_modules\cnpm\node_modules
\npminstall\lib\index.js)
prefix=H:\Users\M\AppData\Roaming\npm
win32 x64 6.1.7601
registry=https://registry.npm.taobao.org 

1.3 安装tyarn

# 国内源 $ cnpm i yarn tyarn -g #  $ tyarn -v 

1.4 安装umi

$ tyarn global add umi
$ umi -v 

1.5安装静态服务

cnpm install -g serve 
0人点赞

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:csdn 与 简书
作者:境与界
链接:https://www.jianshu.com/p/647328be9491
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务



分类

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档