• 基于WEB的学历信息征信系统设计与实现


    目录

    1. 需求分析与架构设计 1
      1.1 需求分析 1
    2. 普通用户 2
    3. 管理员用户 2
      1.2 架构设计 2
      1.3 数据模型设计 4
      1.4 网络环境 5
      1.5 测试网络环境 8
      2 SDK与链码实现 10
      2.1 创建 config.yaml 文件 10
      2.2 声明结构体 15
      2.3 编写链码 16
      2.4 SDK实现 21
      2.4.1 创建SDK 21
      2.4.2 编写测试代码 22
      2.5 安装dep工具 23
      2.6 链码安装及实例化 27
      2.6.1 使用Fabric-SDK安装及实例化链码 27
      2.6.2 在main中调用 28
      2.6.3 测试 28
      3 业务层实现 29
      3.1 事件处理 29
      3.2 业务层调用链码实现添加状态 30
      3.3 调用链码实现根据证书编号与名称查询状态 33
      3.4 调用链码实现根据身份证号码查询状态 34
      3.5 调用链码实现修改/添加信息状态 35
      4 控制层实现 39
      4.1 设置系统用户 39
      4.2 处理响应 40
      4.3 处理请求 40
      4.4 指定路由 44
      5 视图层实现 45
      5.1 目录结构 45
      5.2 照片上传 46
      6 交互演示 48
      6.1 启动Web服务 48
      6.2 访问页面 49

    1.1 需求分析
    现在是一个信息化的高科技时代,许许多多的企业必须紧跟时代步伐,不断创新,才能发展壮大;而企业的发展必然离不开人才队伍的建设,也可以说创新是企业发展的动力,而人才却是企业发展的根本,所以现在各企业对于人才队伍建设十分看重,而对于人才的素质及受教育情况的要求更是重中之重。
    对学历信息的查询,要么成本较高,要么比较麻烦,甚至还有一些假冒网站让人防不胜防;传统应用是将数据保存在数据库中来实现,但是现在出现的数据库由于故障或者被删、被黑造成的数据丢失的情况更是屡见不鲜,所以传统数据库并不能真正意义上确保数据的完整性及安全性。
    基于这些情况,我们设计并开发了一个 基于区块链技术的实现的学历信息征信系统 ,实现了在线对学历信息的查询功能,由于区块链技术本身的特点,无须考虑数据被破坏的问题,而且杜绝了对于信息造假的情况,保证了学历信息的真实性。由于篇幅原因,我们对学历信息征信系统的应用场景进行修改及简化,实现的业务逻辑包括添加信息、修改信息、查询信息、查询详情信息等操作,实际情况下的的业务逻辑需要根据实际需求场景做出相应的调整。
    由于系统需要保证人才受教育情况真实性,所以对于系统的用户而言,不可能由用户自己添加相应的学历信息,本文转载自http://www.biyezuopin.vip/onews.asp?id=15094而是由具有一定权限的用户来完成添加或修改的功能。但普通用户可以通过系统溯源功能来确定信息的真伪。所以我们将系统用户的使用角色分为两种:
    1.普通用户
    2.管理员用户
    普通用户具有对数据的查询功能 ,但实现查询之前必须经过登录认证:
    用户登录:系统只针对合法用户进行授权使用,所以用户必须先进行登录才能完成相应的功能。
    查询实现:查询分为两种方式实现
    根据证书编号与姓名查询:根据用户输入的证书编号与姓名进行查询。
    根据身份证号码查询:根据用户输入指定的身份证号码进行查询,此功能可以实现溯源。
    管理员用户除具有普通用户的功能之外,额外添加了两个功能:
    添加信息:可以向系统中添加新的学历信息。
    修改信息:针对已存在的学历信息进行修改。

    /**
      @Author : hanxiaodong
    */
    package service
    
    import (
    	"github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
    	"fmt"
    	"time"
    	"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
    )
    
    type Education struct {
    	ObjectType	string	`json:"docType"`
    	Name	string	`json:"Name"`		// 姓名
    	Gender	string	`json:"Gender"`		// 性别
    	Nation	string	`json:"Nation"`		// 民族
    	EntityID	string	`json:"EntityID"`		// 身份证号
    	Place	string	`json:"Place"`		// 籍贯
    	BirthDay	string	`json:"BirthDay"`		// 出生日期
    	EnrollDate	string	`json:"EnrollDate"`		// 入学日期
    	GraduationDate	string	`json:"GraduationDate"`	// 毕(结)业日期
    	SchoolName	string	`json:"SchoolName"`	// 学校名称
    	Major	string	`json:"Major"`	// 专业
    	QuaType	string	`json:"QuaType"`	// 学历类别
    	Length	string	`json:"Length"`	// 学制
    	Mode	string	`json:"Mode"`	// 学习形式
    	Level	string	`json:"Level"`	// 层次
    	Graduation	string	`json:"Graduation"`	// 毕(结)业
    	CertNo	string	`json:"CertNo"`	// 证书编号
    
    	Photo	string	`json:"Photo"`	// 照片
    
    	Historys	[]HistoryItem	// 当前edu的历史记录
    }
    
    type HistoryItem struct {
    	TxId	string
    	Education	Education
    }
    
    type ServiceSetup struct {
    	ChaincodeID	string
    	Client	*channel.Client
    }
    
    func regitserEvent(client *channel.Client, chaincodeID, eventID string) (fab.Registration, <-chan *fab.CCEvent) {
    
    	reg, notifier, err := client.RegisterChaincodeEvent(chaincodeID, eventID)
    	if err != nil {
    		fmt.Println("注册链码事件失败: %s", err)
    	}
    	return reg, notifier
    }
    
    func eventResult(notifier <-chan *fab.CCEvent, eventID string) error {
    	select {
    	case ccEvent := <-notifier:
    		fmt.Printf("接收到链码事件: %v\n", ccEvent)
    	case <-time.After(time.Second * 20):
    		return fmt.Errorf("不能根据指定的事件ID接收到相应的链码事件(%s)", eventID)
    	}
    	return nil
    }
    
    
    • 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

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    35-Docker-常用命令详解-docker ps
    基于STM32智能环境系统
    mysql迁移以及迁移后配置文件的编写
    机器学习建模高级用法!构建企业级AI建模流水线 ⛵
    Flask详解
    考试必备技能--自制题库
    【Java 学习】方法 和 一些编程案例
    winograd卷积实践
    Android:利用sdk中的build-tools对包进行签名
    【架构与设计】常见微服务分层架构的区别和落地实践
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/126866891