# 自己动手添加些新功能

通过运行前面的HelloBucky项目，以及聊天室Demo的讲解，想必你已经迫不及待想要在项目里增加点新的代码
来熟悉bucky框架。本节设计了一些新的需求，请聪明的你自己动手添加些新功能来满足这些需求，Learning by doing!

### 功能1：用户登陆

在第一节`让Demo跑起来`的时候，实现了一个简单的用户模块，轻松跑起来了HelloBucky项目，包含两个功能：
- 用户注册
- 用户登陆

在第二节我们又通过简洁的代码实现了一个简易聊天程序，包含如下三个基本功能：
- 输入用户名
- 发送消息
- 接收消息并显示在对话框里

那么，作为一个正式的产品，我们希望把用户模块添加到聊天程序里。思考10秒钟之后，直接动手拷贝文件夹？
等等，如果你什么都不做就动手拷贝，那么该如何编辑solution.json。别急，使用bucky命令行工具，
我们可以轻松导入一个XARPackage到已有项目。

1. 拷贝HelloBucky的`src/account`文件夹到minichat的`src/server/`目录下。
2. 拷贝HelloBucky的`test/account`文件夹到minichat的`test/`目录下。
3. 在minichat根目录下执行如下的命令来自动导入src/server项目下的新包：
```
bucky add -package src/server/account/
```
4. 重新构建：
```
bucky build
bucky deploy
```
5. 对account模块做下单元测试：
```
bucky run -main test/account/test_account.js
```

不出意外的话，可以看到测试...失败了！可以看到错误日志：
```
[error],[2017-12-14 16:20:12.264],<@f4346679-a53b-49d1-89f1-a0539ab1dc39@1@2>,rpc call complete with error, pkgid=account, func=account:account::signup, statusCode=502, errcode=13, result= null, node_core.js:10952
```

发起了RPC失败，怎么回事呢？

### Knowledges: 配置并重置

回顾一下HelloBucky的配置过程，`account`包是依赖了mysql资源的，我们在HelloBucky的讲解中配置了mysql的knowledge，但是前面导入
到minichat的时候，忘记了这个配置哦。

编辑`kowledges.json`，配置下account依赖的mysql：
```javascript
"global.mysql.instances": {
        "type": 0,
        "object": {
            "db_account": {
                "schema": "account_db_schema"
            }
        }
    },
    "global.mysql.schemas": {
        "type": 0,
        "object": {
            "account_db_schema": {
                "onCreate": [
                    "CREATE TABLE IF NOT EXISTS `users` (`username` VARCHAR( 100 ) NOT NULL ,`password` VARCHAR( 100 ) NOT NULL, `userinfo` VARCHAR( 256 ), UNIQUE KEY (username)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
                ]
            }
        }
    },
    "global.mysql.configs": {
        "type": 0,
        "object": {}
    }
```

修改了knowleges.json后要重置它：
```
bucky k -reset
```

再次测试：
```
bucky run -main test/account/test_account.js
```

可以看到测试成功了。

### 作业1：使用account模块

我们已经把account模块整合到minichat的后端模块里，发布并测试通过，那么，可以进一步完成需求：
1. 使用account模块在HTML5前端代码里实现注册/登陆功能。
2. 为account模块增加判断用户是否存在的函数并导出。
3. 在minichat模块里对用户进行校验，不存在的用户，忽略其发送的信息。

在这个作业里，你可以充分练习：
1. 修改源代码
2. 一键构建
3. 执行测试

### 功能2：实现一个四则运算机器人

经过上面的练习，想必你已经对`修改->构建->测试`的流程很熟悉了，本节我们将学习添加一个全新模块的过程。

输入下面的命令，进入交互式环境。
```
bucky add -i
```

选择对`src/server`项目操作：
```
◎ init bucky...
◎ install npm packages...

请选择要操作的项目：
────────────────────
1. 新建项目
2. src/server

$请输入序号：2
```

然后，按提示创建calc包：
```
◎ 添加新package到项目src/server....

$请输入package名字：calc
```

接着，选择package类型，由于`示例package`就是一个除法计算的例子，我们直接选择2:
```
选择package类型：
────────────────────
1. 新建package
2. 示例package

$请输入序号：2
```

接着，选择package运行的环境，我们的计算器不需要用到数据库，选择3:
```
请问这个包需要限制在什么运行时(runtime)加载么？
────────────────────
1. 只允许前端（不能使用mysql/redis/mongo驱动）
2. 只允许后端（可以使用mysql/redis/mongo驱动）
3. 没有限制（不能使用mysql/redis/mongo驱动，一般是工具包）

$请输入序号：3
```

然后退出继续创建：
```
$继续添加package？ [y/n]: n
```

完成，可以看到分别添加了源代码和测试目录：
- src/server/calc
- test/calc/

现在，我们构建并测试下：
```
bucky build
bucky deploy
bucky run -main test/calc/test_calc.js
```

可以看到除法计算的结果：
```
---------
test result:
---------
10/2=5
```

calc这个包默认只实现了一个div函数，请实现以下作业：

### 作业2：实现四则运算calc功能，并完成四则运算聊天机器人

1. 在calc模块中完整实现四则运算函数：calc，能计算四则运算，并做错误处理。
2. 编写单元测试代码，并测试。
3. 在minichat模块里自动检测表达式，并计算结果后推送。
4. 在HTML聊天窗口里测试四则运算聊天机器人能力。


















