[TOC]
# 1. 需求分析与架构设计
**我们要基于 原生Fabric-SDK-Go 实现一个简单的学历征信系统(web项目),状态数据库使用 `CouchDB` 来实现**。
## 1.1 需求分析
现在是一个信息化的高科技时代,许许多多的企业必须紧跟时代步伐,不断创新,才能发展壮大;而企业的发展必然离不开人才队伍的建设,也可以说创新是企业发展的动力,而人才却是企业发展的根本,所以现在各企业对于人才队伍建设十分看重,而对于人才的素质及受教育情况的要求更是重中之重。
对学历信息的查询,要么成本较高,要么比较麻烦,甚至还有一些假冒网站让人防不胜防;传统应用是将数据保存在数据库中来实现,但是现在出现的数据库由于故障或者被删、被黑造成的数据丢失的情况更是屡见不鲜,所以传统数据库并不能真正意义上确保数据的完整性及安全性。
基于这些情况,我们设计并开发了一个 `基于区块链技术的实现的学历信息征信系统`,实现了在线对学历信息的查询功能,由于区块链技术本身的特点,无须考虑数据被破坏的问题,而且杜绝了对于信息造假的情况,保证了学历信息的真实性。由于篇幅原因,我们对学历信息征信系统的应用场景进行修改及简化,实现的业务逻辑包括添加信息、修改信息、查询信息、查询详情信息等操作,实际情况下的的业务逻辑需要根据实际需求场景做出相应的调整。
由于系统需要保证人才受教育情况真实性,所以对于系统的用户而言,不可能由用户自己添加相应的学历信息,而是由具有一定权限的用户来完成添加或修改的功能。但普通用户可以通过系统溯源功能来确定信息的真伪。所以我们将系统用户的使用角色分为两种:
1. 普通用户
2. 管理员用户
普通用户具有对数据的查询功能 ,但实现查询之前必须经过登录认证:
- 用户登录:系统只针对合法用户进行授权使用,所以用户必须先进行登录才能完成相应的功能。
- 查询实现:查询分为两种方式实现
- 根据证书编号与姓名查询:根据用户输入的证书编号与姓名进行查询。
- 根据身份证号码查询:根据用户输入指定的身份证号码进行查询,此功能可以实现溯源。
管理员用户除具有普通用户的功能之外,额外添加了两个功能:
- 添加信息:可以向系统中添加新的学历信息。
- 修改信息:针对已存在的学历信息进行修改。
## 1.2 架构设计
我们在 [从零到壹构建基于 Fabric-SDK-Go 的Web项目实战](https://github.com/kevin-hf/kongyixueyuan) 中已经完成了一个完整的基于 `fabric-sdk-go` 的应用示例,所以我们现在使用之前的应用架构,不同的是在此应用中需要编写实现完整的链码并通过业务层调用链码中的各个函数,以实现对数据状态的操作。界面为了方便用户操作使用,仍然使用Web浏览器的方式实现。而且在此应用中我们将 `Hyperledger Fabric` 默认的状态数据库由 `LevelDB` 替换为 `CouchDB` 来实现
![架构](./img/projectArch.png)
对于 `Fabric Network`结构如下图所示:
![networkArch](./img/networkArch.png)
## 1.3 数据模型设计
由于需要向分类账本中保存数据,所以必须设计相关的结构体用于声明要保存的数据结构,用于方便的在应用中处理数据。
`Education` 结构体设计如下表所示:
| 名称 | 数据类型 | 说明 |
| -------------- | ------------- | -------------------------------- |
| ObjectType | string | |
| Name | string | 姓名 |
| Gender | string | 性别 |
| Nation | string | 民族 |
| EntityID | string | 身份证号(记录的Key) |
| Place | string | 籍贯 |
| BirthDay | string | 出生日期 |
| Photo | string | 照片 |
| EnrollDate | string | 入学日期 |
| GraduationDate | string | 毕(结)业日期 |
| SchoolName | string | 所读学校名称 |
| Major | string | 所读专业 |
| QuaType | string | 学历类别(普通、成考等) |
| Length | string | 学制(两年、三年、四年、五年) |
| Mode | string | 学习形式(普通全日制) |
| Level | string | 层次(专科、本科、研究生、博士) |
| Graduation | string | 毕(结)业(毕业、结业) |
| CertNo | string | 证书编号 |
| Historys | []HistoryItem | 当前edu的详细历史记录 |
为了能够从当前的分类状态中查询出详细的历史操作记录,我们在 `Education` 中设计了一个类型为`HistoryItem` 数组的 `Historys` 成员,表示当前状态的历史记录集。
`HistoryItem` 结构体设计如下表所示:
| 名称 | 数据类型 | 说明 |
| --------- | --------- | ---------------------- |
| TxId | string | 交易编号 |
| Education | Education | 本次历史记录的详细信息 |
## 1.4 网络环境
### 1.4.1 设置环境
在`GOPATH`的`src`文件夹中新建一个目录如下:
```shell
$ mkdir -p $GOPATH/src/github.com/kongyixueyuan.com/education
$ cd $GOPATH/src/github.com/kongyixueyuan.com/education
```
创建文件夹fixtures
```shell
$ mkdir fixtures
```
修改`fixtures` 文件夹的所属关系为当前用户
```shell
$ sudo chown -R kevin:kevin ./fixtures
```
> 提示: kevin 为安装 Ubuntu 16.04 系统时创建的用户
进入 `fixtures` 目录
```shell
$ cd fixtures
```
为了构建区块链网络,使用 `docker` 构建处理不同角色的虚拟计算机。 在这里我们将尽可能保持简单。如果确定您的系统中已经存在相关的所需容器,或可以使用其它方式获取,则无需执行如下命令。否则请将 `fixtures` 目录下的 `pull_images.sh` 文件添加可执行权限后直接执行。
```shell
$ chmod 777 ./pull_images.sh
$ ./pull_images.sh
```
> 提示:`pull_images.sh` 文件是下载 Fabric 环境所需容器的一个可执行脚本,下载过程需要一段时间(视网速情况而定),请耐心等待。另:请确定您的系统支持虚拟技术。
**将生成好的证书文件,创始块文件,通道文件,锚节点更新文件拷贝到此文件夹下**
### 1.4.2 配置docker-compose.yml文件
在 `fixtures` 目录下创建一个 `docker-compose.yml` 文件并编辑
```shell
$ vim docker-compose.yml
```
1. 将 `network下的basic` 修改为 `default`
```yaml
version: '2'
networks:
default:
services:
```
2. 编辑 orderer 部分
```yaml
orderer.kevin.kongyixueyuan.com:
image: hyperledger/fabric-orderer
container_name: orderer.kevin.kongyixueyuan.com
environment:
- ORDERER_GENERAL_LOGLEVEL=debug
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_LISTENPORT=7050
- ORDERER_GENERAL_GENESISPROFILE=kongyixueyuan
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/genesis.block
- ORDERER_GENERAL_LOCALMSPID=kevin.kongyixueyuan.com
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
- ORDERER_GENERAL_TLS_ENAB