技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、Nodejs、Python、区块链等设计与开发。
主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。
🍅文末获取源码联系🍅
🍅文末获取源码联系🍅
🍅文末获取源码联系🍅
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
《区块链开发专栏》
《区块链系统学习案例专栏》⛺️心若有所向往,何惧道阻且长
一、技术范围与主要内容
本项目为基于以太坊区块链的"航班延误保险系统"示例,实现了去中心化的航班保险购买与自动理赔流程:
- 智能合约: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)
- 功能:生成电子保单、处理理赔请求
- 关键点 :
- 继承自
FlightDelayInsurance和UserManagement - 保单唯一标识:
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))
}
}