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

技术范围: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))
    }
}
相关推荐
kida_yuan6 天前
【以太来袭】4. Geth 原理与解析
区块链
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意8 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码8 天前
嵌入式学习路线
学习
毛小茛8 天前
计算机系统概论——校验码
学习
babe小鑫8 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms8 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下8 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。8 天前
2026.2.25监控学习
学习
im_AMBER8 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode