基于区块链的航班延误保险系统的设计与实现(源码+文档)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、Nodejs、Python、区块链等设计与开发。

主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。

🍅文末获取源码联系🍅

🍅文末获取源码联系🍅

🍅文末获取源码联系🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
《区块链开发专栏》
《区块链系统学习案例专栏》

⛺️心若有所向往,何惧道阻且长

项目演示衔接https://www.bilibili.com/video/BV11qyqBZEe1/?share_source=copy_web&vd_source=e69b77ddfb8292c5076e23cb71c075d8

一、技术范围与主要内容

本项目为基于以太坊区块链的"航班延误保险系统"示例,实现了去中心化的航班保险购买与自动理赔流程:

  • 智能合约:Solidity(Hardhat 管理)
  • 前端框架:Vue 2 + Element UI
  • 区块链交互:Web3.js 实现前端与智能合约的通信
  • 开发工具:npm 管理依赖、TypeChain 生成类型定义
  • 核心功能:用户管理、航班管理、保险购买、延误检测、自动理赔

二、运行环境与开发工具

运行环境

  • 操作系统:Windows 10+ / macOS / Linux
  • Node.js:建议 14.x 或更高版本
  • 本地区块链 :Ganache(RPC地址:HTTP://127.0.0.1:7545)
  • 浏览器:Chrome/Edge(需安装 MetaMask 插件)

开发工具

  • 合约开发:Hardhat、Solidity 0.8.x、TypeScript
  • 前端开发:Vue CLI、Element UI、Web3.js
  • 测试工具:Hardhat Test、Mocha

三、系统功能详解

1)用户管理(UserManagement)

  • 功能:用户注册、查询用户信息
  • 关键点 :
    • 基于以太坊地址的用户身份管理
    • 链上存储用户名和注册状态
    • 发出 UserRegistered 事件记录注册行为

2)航班管理(FlightManagement)

  • 功能:添加航班、更新实际起飞时间、延误检测、查询航班信息
  • 关键点 :
    • 航班信息包含:航班号、计划起飞时间、实际起飞时间、到达时间
    • 延误判定逻辑:实际起飞时间超过计划起飞时间 4 小时以上
    • 仅航空公司(airlineV)可更新实际起飞时间
    • 支持查询所有航班和按航班号查询

3)航班延误保险(FlightDelayInsurance)

  • 功能:购买机票、购买保险、退保、预存赔偿金
  • 关键点 :
    • 继承自 FlightManagement 合约
    • 用户必须先购买机票才能购买保险
    • 保险购买时间限制:购票后 30 分钟内
    • 保险公司需预存赔偿金(10 ETH)
    • 用户可在赔偿金预存前退保
    • 维护用户保险映射和保险账户列表

4)理赔管理(Claims)

  • 功能:生成电子保单、处理理赔请求
  • 关键点 :
    • 继承自 FlightDelayInsuranceUserManagement
    • 保单唯一标识:keccak256(航班号 + 乘客地址)
    • 自动理赔逻辑:
      • 航班延误超过 4 小时:赔偿金转给乘客,保费转给保险公司
      • 航班未延误:保费和赔偿金均返还给保险公司
    • 仅平台(platformS)可生成保单和处理理赔

四、功能页面展示


五、部分代码展示

下面给出项目中若干关键代码片段(简化后便于阅读):

1. UserManagement.sol(用户注册示例)

solidity 复制代码
function register(string memory _name) public {
    require(!users[msg.sender].registered, "User is already registered");
    users[msg.sender] = User({
        name: _name,
        userAddress: msg.sender,
        registered: true
    });
    emit UserRegistered(msg.sender, _name);
}

function getUser(address _user) public view returns (string memory, bool) {
    return (users[_user].name, users[_user].registered);
}

2. FlightManagement.sol(航班管理与延误检测)

solidity 复制代码
function addFlight(string memory _flightNumber, uint256 _scheduledDepartureTime, uint256 _arrivalTime) public {
    require(bytes(_flightNumber).length > 0, "Invalid flight number");
    require(_scheduledDepartureTime > 0 && _arrivalTime > 0, "Invalid times");
    require(flights[_flightNumber].scheduledDepartureTime == 0, "Flight already exists");

    flights[_flightNumber] = Flight(_flightNumber, _scheduledDepartureTime, 0, _arrivalTime, false);
    flightNumbers.push(_flightNumber);
    emit FlightAdded(_flightNumber, _scheduledDepartureTime, _arrivalTime);
}

function updateActualDepartureTime(string memory _flightNumber, uint256 _actualDepartureTime) public {
    require(msg.sender == airlineV, "Only airline V can update departure time");
    require(flights[_flightNumber].scheduledDepartureTime > 0, "Flight does not exist");
    require(flights[_flightNumber].actualDepartureTime == 0, "Departure time already updated");

    flights[_flightNumber].actualDepartureTime = _actualDepartureTime;
    // 延误判定:超过4小时
    if (_actualDepartureTime > flights[_flightNumber].scheduledDepartureTime + 4 * 3600) {
        flights[_flightNumber].delayed = true;
        emit DelayDetected(_flightNumber, _actualDepartureTime - flights[_flightNumber].scheduledDepartureTime);
    }
    emit DepartureTimeUpdated(_flightNumber, _actualDepartureTime);
}

3. FlightDelayInsurance.sol(购买保险示例)

solidity 复制代码
function buyInsurance(string memory _flightNumber) public payable {
    require(tickets[msg.sender][_flightNumber].purchased, "User must have purchased a ticket for this flight first");
    require(block.timestamp - tickets[msg.sender][_flightNumber].purchaseTime <= 1800, "Insurance cannot be purchased more than 0.5 hours after purchasing the ticket");
    require(msg.value == premium, "Incorrect premium amount");
    
    insurances[msg.sender][_flightNumber] = Insurance({
        flightNumber: _flightNumber,
        purchased: true,
        deposited: false
    });
    pushAccount(msg.sender);
    accountInsurances[msg.sender].push(_flightNumber);
    emit InsurancePurchased(msg.sender, _flightNumber, msg.value);
}

function depositCompensation(address _user, string memory _flightNumber) public payable {
    require(msg.sender == insuranceCompanyC, "Only insurance company C can deposit compensation");
    require(insurances[_user][_flightNumber].purchased, "User has not purchased insurance for this flight yet");
    require(!insurances[_user][_flightNumber].deposited, "The compensation has been pre-deposited and cannot be pre-deposited again.");
    require(msg.value == compensation, "Compensation amount is incorrect");
    
    insurances[_user][_flightNumber].deposited = true;
    emit CompensationDeposited(_user, _flightNumber, msg.value);
}

4. Claims.sol(理赔处理示例)

solidity 复制代码
function claimInsurance(string memory _flightNumber, address _passenger) public {
    require(msg.sender == platformS, "Only platform S can process claims");
    bytes32 flightKey = keccak256(abi.encodePacked(_flightNumber, _passenger));
    Policy storage policy = policies[flightKey];
    require(policy.passenger == _passenger, "Not the policy holder");
    require(policy.claimed == false, "Already claimed");

    if (checkIfDelayed(_flightNumber)) {
        // 航班延误超过4小时 - 赔付
        policy.claimed = true;
        payable(_passenger).transfer(policy.compensation); // 赔偿金转给乘客
        payable(insuranceCompanyC).transfer(policy.premium); // 保费转给保险公司
        emit ClaimProcessed(flightKey, _passenger, policy.compensation);
    } else {
        // 航班未延误 - 退款给保险公司
        policy.claimed = true;
        payable(insuranceCompanyC).transfer(policy.premium);
        payable(insuranceCompanyC).transfer(policy.compensation);
        emit ClaimProcessed(flightKey, _passenger, 0);
    }
}

5. 部署脚本(deploy.ts)

typescript 复制代码
import { ethers } from "hardhat";
import { Claims } from "../typechain-types";

async function main() {
  let claims: Claims;
  let insuranceCompanyC: any;
  let platformS: any;
  let airlineV: any;

  [platformS, insuranceCompanyC, airlineV] = await ethers.getSigners();

  const Claims = await ethers.getContractFactory("Claims");
  claims = await Claims.connect(platformS).deploy(
    platformS.address,
    airlineV.address,
    insuranceCompanyC.address,
    ethers.utils.parseEther("1"), // 1 ETH 保费
    ethers.utils.parseEther("10") // 10 ETH 赔偿金
  );
  
  let pro = { claims: claims.address };
  console.log(JSON.stringify(pro));
  await claims.deployed();
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

6. 前端合约交互(contract.js)

javascript 复制代码
import Web3 from 'web3';
const web3 = new Web3('http://127.0.0.1:7545');
const [platformS, insuranceCompanyC, airlineV, ...accounts] = await web3.eth.getAccounts();

import address from '@/utils/contract-address.json'
import claims from '@/utils/abis/Claims.json'

// 获取合约实例
const claimsContract = new web3.eth.Contract(claims.abi, address.claims);

const Money = {
    premium: 1, // 保险费(单位ETH)
    compensation: 10 // 赔偿金额(单位ETH)
}

// 处理合约异常
const handlerContractError = (error) => {
    const errorMessageRegex = /VM Exception while processing transaction: revert ([^"]+)/;
    const match = JSON.stringify(error).match(errorMessageRegex);
    if (match && match[1]) {
        return match[1];
    } else {
        return error.errorMessage;
    }
}

export { platformS, insuranceCompanyC, airlineV, accounts, web3, Money, claimsContract, handlerContractError }

7. 前端页面示例(航班管理 - flights/index.vue)

javascript 复制代码
// 获取所有航班
async getAllFlights() {
    let ary = []
    const res = await claimsContract.methods.getAllFlights().call()
    for (let i = 0; i < res.length; i++) {
        const item = res[i];
        ary.push({
            flightNumber: item[0],
            scheduledDepartureTime: Number(item[1]),
            actualDepartureTime: Number(item[2]),
            arrivalTime: Number(item[3]),
            delayed: item[4]
        })
    }
    this.flights = ary
},

// 更新实际起飞时间
async updateActualDepartureTime() {
    const { flightNumber, actualDepartureTime } = this.selectedFlight
    try {
        const res = await claimsContract.methods.updateActualDepartureTime(
            flightNumber, 
            actualDepartureTime.getTime() / 1000
        ).send({
            from: airlineV,
            gas: 3000000
        })
        if (res.status === 1n) {
            this.$message.success('更新航班实际起飞时间成功')
            this.getAllFlights()
            this.dialogVisible = false;
        }
    } catch (error) {
        this.$message.error(handlerContractError(error))
    }
}

8. 前端页面示例(保险管理 - insurance/index.vue)

javascript 复制代码
// 处理预存赔偿金操作
async handlePredeposit({ flightNumber, passenger }) {
    try {
        // 调用合约预存赔偿金
        const res = await claimsContract.methods.depositCompensation(passenger, flightNumber).send({
            from: insuranceCompanyC,
            value: web3.utils.toWei(`${Money.compensation}`, 'ether'),
            gas: 3000000
        })
        // 预存成功后生成电子保单
        if (res.status === 1n) {
            await claimsContract.methods.generatePolicy(flightNumber, passenger).send({
                from: platformS,
                gas: 3000000
            })
            this.getAllInsurances()
            this.$message.success('预存赔偿金成功')
        }
    } catch (error) {
        this.$message.error(handlerContractError(error))
    }
}
相关推荐
MicroTech20253 小时前
微算法科技(NASDAQ MLGO)研发基于AI的动态权重学习模型,开启区块链账户关联分析智能新时代
区块链
Web3_Daisy3 小时前
从冷换仓到热追踪:项目方如何在不暴露风险的前提下守住主动权
大数据·人工智能·安全·区块链
17岁的勇气3 小时前
Unity Shader unity文档学习笔记(二十二):雪地几种实现方式(1. 2D贴花式 2.3D曲面细分并且实现顶点偏移)
笔记·学习·unity·shader
三体世界4 小时前
Qt从入门到放弃学习之路(1)
开发语言·c++·git·qt·学习·前端框架·编辑器
hrrrrb4 小时前
【机器学习】无监督学习
人工智能·学习·机器学习
D.....l6 小时前
STM32学习(MCU控制)(DMA and ADC)
stm32·单片机·学习
AI浩6 小时前
自监督 YOLO:利用对比学习实现标签高效的目标检测
学习·yolo·目标检测
黑科技Python13 小时前
生活中的“小智慧”——认识算法
学习·算法·生活