经过两周的课程设计,终于完成了整个报告的书写。有必要总结一下书写的顺序等,对毕业论文会有帮助。

1,写作逻辑

目录
第一章 选题论证 2
第二章 信息系统分析 3
一.食品溯源管理信息系统需求分析 3
1.1总体需求分析 3
1.2用户角色分析 5
1.3食品溯源系统前后台需求分析 5
二.系统可行性分析 5
2.1技术可行性 5
2.2.管理可行性 6
2.3经济可行性 6
三.项目开发进度安排 6
3.1项目开发进度安排 6
3.2项目所需硬件资源 7
四.农产品相关食品溯源系统分析 7
五.食品溯源系统设计 15
5.1食品溯源跟踪系统架构设计 16
5.2系统功能模块设计 18
5.3智能合约设计 22
5.4新系统处理流程设计 22
5.5输入输出设计 25
5.6数据库设计 26
六.食品溯源系统实现 31
附录 38*

总的顺序就是:选题论证–需求分析–可行性分析(技术、经济、管理)–系统分析(业务流程图、BPR前后数据流程图、数据字典)–系统设计(总体设计、模块化设计、输入输出设计、数据库设计(概念、逻辑、数据表))–系统实现

2,我实现的部分

6.2.1安装Django
需要python、pycharm、anaconda环境,下载最新版3.2.5

图6-2 Django版本信息
6.2.2创建myblog项目
通过startproject myblog命令创建myblog项目配置文件夹。
CGl(Common Gateway Interface,通用网关接口),定义客户端与Web服务器的交流方式的一个程序。例如正常情况下客户端发送过来一个请求,根据HTTP协议Web服务器将请求的内容解析出来,经过处理会后,再将返回的内容封装好。涉及到TCP连接、HTTP原始请求和相应格式都是由一个软件来完成,这个程序就是CGl。
WSGI (Python Web Server Gateway Interface,WSGI) Web服务器网关接口,是为Python语言定义的Web服务器和Web应用,WSGl为了解决Web服务器与客户端之间的通信问题而产生的。并且WSGI是基于现存的CGl标准而设计的,同样是一种程序。
ASGI尝试保持在一个简单的应用接口的前提下,提供允许数据能够在任意时候、被任意应用进程发送和接受的抽象。它同样描绘了一个新的,兼容HTTP请求响应以及 WebSocket 数据帧的序列格式。
创建项目时自动生成db.sqlite3文件,这是python内置的数据库,无需下载可以直接使用。
6.2.3通过runserver访问服务
在setting文件中已经导入了系统的一些APP,因此可以利用Django模板直接访问项目后台。同时导入了URL,后续项目所有地址都可以通过URL访问。

图6-3 后台配置admin

6.2.4 后台管理界面
可以通过后台管理界面进行账户注册,密码设置,登录。

图6-4 食品溯源系统后台登录
6.3数据库实现
6.3.1 Models与ORM映射实现
Django中的models通常一个Model对应数据库的一张数据表, Django中Model以类的形式表现,它包含一些基本字段以及数据的一 些行为。其实很类似Java的ORM映射框架,它的好处是隐藏了数据访问的细节,不需要编写SQL语句而是继承models.Model创建模型类。
在应用根目录下创建models.py,并引入models模块创建类,继承models.Model,该类即使一张数据表中类的创建字段,定义的语法为属性名=models.字段类型
模型准确且唯一的描述了数据。它包含储存的数据的重要字段和行为。-般来说。每一个模型都映射一张数据库表。因此只需要操作python中的模型层就会自动映射到数据库中的表、记录和字段中,完成了整个数据库的操作。这种方式的缺点在于,它的灵活性不如直接操作数据库方便;它的优点在于,不需要掌握SQL语句,只需要掌握python语法也能够完成相关操作。
●每个模型都是一个 Python的类,这些类都继承django.db.models .Model
●模型类的每个属性都相当于一个数据库的字段。
●利用这些,Django 提供了一个自动生成访问数据库的API。

6.3.2连接sqlite数据库
在pycharm中点击右侧database连接数据库,在blog_article中进行数据库的操作。成功连接sqlite数据库界面如图所示。

图6-5 sqlite 数据库连接成功界面

图6-6 后台展示数据库表信息
连接数据库的关键代码如下,在setting.py中导入了sqlite,后期如果要是用SQL,oracle数据库可以在这里进行修改。

图6-7 连接数据库的关键代码截图

6.4 数据结构算法设计
ORM命令部分代码截图如下,实现基本的增、删、改、查操作。

图6-8 ORM命令代码截图
6.5系统使用说明书
6.5.1登录界面
登录界面如图所示,初始登录名称为admin2,;初始登录密码为admin2。

图6-9 登录界面
6.5.2 Django后台管理界面使用(增、删、查)
通过http://127.0.0.1:8000/admin/blog/article/进入后台管理界面,可以直接增加信息

图6-10 增加节点名
在主界面可以查询所有数据信息,并且执行删除操作。

图6-11 查询和删除操作界面
注:在setting.py文件中可以修改代码为LANGUAGE_CODE = ‘zh-hans’,Django界面将自动展示中文界面。

6.5.3 调用挖矿和显示区块链
标准的一个区块需要获取时间,hash加密,格式化日期和加密算法。每一个区块除了储存自己的信息还包含上一个区块的pre_hash。
在此处为了展示更加直观,用到了json。dict与json的区别:1, dict python内置数据结构,因此有很多内置函数2, json 格式比dict要丰富3,获取数据的方式不同: dict[key] 可以获取 value 而json通过 json : json.key获取值

获取上一个区块的hash值(传入的是上一个区块的信息)
def get_block_hash(self, block):
block_str = json.dumps(block, sort_keys=True).encode(‘UTF-8’)
return hashlib.sha256(block_str).hexdigest()

Hash值难度运算
def valid_proot(self,hash,difficulty):
if hash==None or hash[:difficulty] != ‘0000’:
return False
else:
return True

搭建简单的前端界面,并发送一些数据,后台进行区块的获取和接收

图6-12 区块链交易信息输入界面
通过点击“查看所有区块信息”,可以看到所有的区块信息,包括index,nonce,pre_hash,timestramp,transaction信息。通过后台代码已经进行hash加密,格式化日期和加密算法。

图6-13 索引为1的区块信息

图6-14 格式化时间戳的索引为2的区块信息


图6-15 引用他人的动物农产品溯源流程示意图

3,核心部分代码

from time import time
import json
import hashlib


# 定义一个工具类, 里面实现区块链数据结构的相关方法
class BlockChain(object):

    def __init__(self):
        # 创建一个列表,用来存储区块信息
        self.blockchain = []
        # 每个区块有多笔交易,因此还需要一个交易列表
        self.current_transactions = []
        # 创建第一个区块(创世区块)
        self.new_block()

    # __str__ 双下划线开始和结束的方法称为魔法方法,每一个魔法方法都有一个功能
    def __str__(self):  # java to string
        return f'blockchain:{self.blockchain}'  # 默认返回的是str类型

    # 创建区块的方法(索引,时间戳,交易列表,None,上一个区块的hash)
    def new_block(self):
        # dict与json的区别
        # 1: dict python内置数据结构,因此有很多内置函数
        # 2: json 格式比dict要丰富: [{},{},{},{key:[{},{},{}]}]....
        # 3: 获取数据的方式不同: dict[key] ==> value  json : json.key
        block = {
            'index': len(self.blockchain),
            'timestramp': time(),
            'transaction': self.current_transactions,
            'nonce': -1,
            'pre_hash': None if len(self.blockchain) == 0 else self.get_block_hash(self.blockchain[-1])
        }
        hash = None
        while not self.valid_proot(hash,4):
            block['nonce'] = block['nonce'] + 1
            hash = self.get_block_hash(block)
        # 把当前区块添加到区块链中
        self.blockchain.append(block)
        self.current_transactions = []  # 空列表
        return block

    # 获取上一个区块的hash值(传入的是上一个区块的信息)
    def get_block_hash(self, block):
        block_str = json.dumps(block, sort_keys=True).encode('UTF-8')
        return hashlib.sha256(block_str).hexdigest()

    # 获取前端的交易信息, 注意: 一个区块有多笔交易 one - to many
    def new_transaction(self, sender, receive, amount):
        # 向交易列表,追加一条交易信息
        self.current_transactions.append({
            'sender': sender,
            'receive': receive,
            'amount': amount
        })

    def valid_proot(self,hash,difficulty):
        if hash==None or hash[:difficulty] != '0000':
            return False
        else:
            return True


if __name__ == "__main__":
    bc = BlockChain()
    # 直接显示区块链信息,第一次创建只有创世区块
    print(bc.blockchain)

    for i in range(3):
        bc.new_block()

 print('目前区块的信息为:',bc.blockchain)

4,心得体会

本系统开发的语言选择的是pycharm开发环境以及内置的sqlite数据库以及Django框架。
本学期学习了java的课程,我对中间件、面向对象思想有了更进一步的思考,趁着课程设计的机会,我大胆地尝试了“新鲜”的区块链技术和python结合搭建学校食堂农产品食品的溯源的管理信息系统。
不得不承认,对于第一次接触区块链技术的我来说这是一件费时费力的事情,最后在设计的系统界面美化和整体交互上有不足,只是搭建出了最核心的框架结构。但是这个过程是独特的,一方面,我通过网易云课堂我学习了前沿的技术,对学习过的知识有了新的思考,并将这些思考和配置环境的经验和解决方法同步在了自己的CSDN博客,方便自己温故,也为将来遇到同样困境的朋友留下经验。另一方面,在这个过程中我阅读了很多区块链食品溯源的相关论文,利用Xmind对论文进行了结构分解,帮助我更好地理解每一篇论文,也对于MIS课程上学的系统分析设计,以及数据结构、数据库课程有了更深一步的实践认识。
在系统实现时,我配置了python和java的环境,在用何种方法实现的问题上纠结了许久,最后在参考Github上他人的区块链溯源项目后,结合自己的能力,最终选择了python实现基于区块链的食品溯源系统。
在整个论文写作和系统实现过程中遇到了许多困难,因为编程经验不足走了不少弯路,通过不断地向老师,同学请教,虽然最终结果仍然需要许多优化改善,但是最终顺利完成了课程设计。
正如开头所说,这次课程设计比我想象的难了不少,这是我自找的“麻烦事”,但是整个过程我都有很高的自我效能感,也觉得值得这么做,在过程中时刻提醒自己:道阻且长,任重而道远。

更多推荐

菜鸟日记day3(结束篇):用Python实现基于区块链的食堂农产品溯源管理信息系统大作业