项目文档(Project Overview)
一、项目简介(What is CanvasChain?)
CanvasChain 是一个面向创作者与收藏者的数字创意交易平台。 它让任何创意内容(插画 / UI 设计 / 摄影 / 文案 / 代码 / 3D 模型)都可以被发布、拍卖、收藏、交易,并通过虚拟 NFT 的方式进行确权。
你可以把 CanvasChain 理解为: “创意作品的淘宝 + NFT 确权 + 数字拍卖行 + 盲盒抽卡 + 社区投票中心” 的组合平台。
它不仅是一个交易网站,而是一整套完整的创意生态系统,提供:
- 创意发布 → 搜索 → 排行
- 拍卖 → 实时竞价 → 自动结算
- 钱包 → 扣费 → 收益分成
- 盲盒 → 抽奖 → 开箱动画
- 投票 → 排行榜 → 年度最佳评选
- 后台运营 → 审核 → 报表 → 数据大屏
CanvasChain 的目标是为创作者提供更自由的创作变现渠道,也为收藏者提供内容发现与投资的空间。
二、CanvasChain 的核心价值(Why)
🎨 对创作者(Creators)
- 发布自己的作品(图片、视频、音乐、插画、代码片段等)
- 自动生成虚拟 NFT(作品的唯一数字所有权)
- 通过拍卖、盲盒、组合售卖方式获得收入
- 钱包实时记录收益与提现
- 参与年度最佳评选,提高曝光度
💎 对收藏者(Collectors)
- 浏览多类型创意内容,发现优秀作品
- 参与实时拍卖与竞价战争
- 抽盲盒获得稀有作品
- 查看作品历史交易、稀有度、投票权重
- 参与年度最佳评选与社区治理
🛠 对平台管理者(Admins)
- 内容审核、创意分类管理
- 交易监控、反作弊(恶意出价、刷票)
- 收益结算、平台抽成
- 查看完整的大数据报表:访问量、成交额、活跃度
- 自定义投票算法 / 抽奖概率 / 抽成比例
三、核心功能(Features)
1. 创意中心(Artwork)
- 创意内容发布 / 编辑 / 删除
- 多级缓存(Caffeine + Redis)加速访问
- 全文搜索(ElasticSearch)
- 排行榜(按浏览、销售、投票)
2. 拍卖系统(Auction)
- 英式拍卖(逐价竞拍)
- 荷兰拍卖(价格递减)
- 密封竞价(匿名出价)
- WebSocket 实时竞价
- Redis + Lua 保障竞价原子性与高并发
3. 盲盒系统(BlindBox)
- 多种稀有度权重的抽奖
- 动画开箱
- 防重复开箱(幂等)
- 盲盒库存与补货任务
4. 订单系统(Order)
- 创意购买、拍卖成交、盲盒订单
- 支付 / 取消 / 退款 / 结算
- 多服务调用下的分布式一致性(Seata 支持)
5. 钱包系统(Wallet)
- 充值、提现(可接第三方或模拟)
- 余额锁定(下单预扣)
- 原子扣费(Redis Lua)
- 收益结算(创作者收益 + 平台扣税)
6. 投票系统(Vote)
- 每用户每日限票
- 权重投票(粉丝数、历史评分)
- 防刷票机制(Redis 限制)
- 年度最佳作品评选任务
7. 消息通知(Notification)
- 拍卖实时出价提醒(WebSocket)
- 盲盒抽奖结果(SSE)
- 系统消息(邮件可选)
8. 后台管理系统(Admin Panel)
- 审核发布内容与举报
- 监控交易与收益
- 热门排行榜分析
- 抽奖策略 / 投票权重配置
- 数据大屏(访问量、交易额、增长趋势)
四、系统架构(Architecture)
总体架构图
技术栈
后端:
- Java 17 + Spring Boot 3
- Spring Cloud Alibaba(Gateway / Nacos / Sentinel / Seata)
- MyBatis Plus
- Redis / Redisson
- RabbitMQ
- ElasticSearch
- XXL-Job
- SkyWalking
前端:
- Vue3 + Vite
- Pinia
- TailwindCSS
- TypeScript
- WebSocket / SSE
基础设施:
- MySQL 8.0
- Docker / docker-compose
- Nginx
项目代码结构
canvas-chain/
├── canvas-chain-common/ # 通用模块
│ ├── pom.xml
│ ├── src/main/java/
│ │ ├── entity/
│ │ │ ├── User.java # 用户
│ │ │ ├── Artwork.java # 创意作品
│ │ │ ├── Auction.java # 拍卖
│ │ │ ├── BlindBox.java # 盲盒
│ │ │ ├── Transaction.java # 交易
│ │ │ ├── Vote.java # 投票
│ │ │ ├── NFT.java # NFT 虚拟资产
│ │ │ └── Wallet.java # 钱包
│ │ ├── dto/
│ │ ├── enums/
│ │ │ ├── AuctionStatus.java
│ │ │ ├── TransactionType.java
│ │ │ └── ArtworkCategory.java
│ │ ├── util/
│ │ │ ├── RedisUtil.java
│ │ │ ├── MqUtil.java
│ │ │ ├── IdGenerator.java # NFT ID 生成
│ │ │ └── PriceCalculator.java # 价格计算
│ │ ├── exception/
│ │ └── config/
│ │ ├── RedisConfig.java
│ │ ├── MqConfig.java
│ │ └── BloomFilterConfig.java
│ │
│ └── resources/
│ └── sql/
│ └── init.sql # 初始化脚本
│
├── canvas-chain-gateway/ # API 网关
│ ├── pom.xml
│ └── src/main/java/
│ ├── filter/
│ │ ├── SentinelFilter.java
│ │ ├── AuthFilter.java
│ │ └── RateLimitFilter.java
│ ├── config/
│ └── handler/
│ └── GlobalExceptionHandler.java
│
├── canvas-chain-user-service/ # 用户服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ │ ├── UserController.java
│ │ └── AuthController.java
│ ├── service/
│ ├── mapper/
│ ├── entity/
│ └── config/
│
├── canvas-chain-artwork-service/ # 创意服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ ├── mapper/
│ ├── entity/
│ ├── es/
│ │ └── ArtworkSearchService.java # ElasticSearch 搜索
│ ├── cache/
│ │ └── ArtworkCacheManager.java # 缓存管理
│ └── mq/
│ ├── ArtworkEventSender.java
│ └── ArtworkEventListener.java
│
├── canvas-chain-auction-service/ # 拍卖服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ │ └── AuctionController.java # 竞价接口
│ ├── service/
│ │ ├── AuctionService.java
│ │ ├── BidService.java # 出价逻辑
│ │ └── AuctionStrategyService.java
│ ├── mapper/
│ ├── entity/
│ ├── mq/
│ │ ├── BidEventSender.java
│ │ ├── AuctionSettlementListener.java
│ │ └── PriceNotificationSender.java
│ ├── websocket/
│ │ └── AuctionWebSocketServer.java # 实时竞价推送
│ ├── strategy/
│ │ ├── EnglishAuctionStrategy.java # 英式拍卖
│ │ ├── DutchAuctionStrategy.java # 荷兰式拍卖
│ │ └── SealedBidStrategy.java # 密封竞价
│ └── lua/
│ └── bid_lock.lua # 竞价加锁脚本
│
├── canvas-chain-blindbox-service/ # 盲盒服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ │ ├── BlindBoxService.java
│ │ └── LotteryService.java # 抽奖逻辑
│ ├── mapper/
│ ├── entity/
│ ├── mq/
│ │ ├── BoxOpenedEventSender.java
│ │ └── LotteryResultListener.java
│ ├── strategy/
│ │ └── PrizeDistribution.java # 奖品分配策略
│ └── animation/
│ └── BoxOpeningEffect.java # 开箱动画数据
│
├── canvas-chain-order-service/ # 订单/交易服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ │ ├── OrderService.java
│ │ ├── CombinedAuctionService.java # 聚合拍卖
│ │ ├── TransactionService.java
│ │ └── SettlementService.java # 结算逻辑
│ ├── mapper/
│ ├── entity/
│ ├── mq/
│ │ ├── OrderEventSender.java
│ │ ├── PaymentListener.java
│ │ └── SettlementProcessor.java
│ ├── feign/
│ │ ├── WalletServiceClient.java
│ │ └── UserServiceClient.java
│ └── seata/
│ ├── OrderTxService.java # Seata 事务
│ └── WalletTxService.java
│
├── canvas-chain-wallet-service/ # 钱包服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ │ ├── WalletService.java
│ │ ├── RechargeService.java
│ │ ├── WithdrawService.java
│ │ └── BalanceLockService.java # 余额锁定
│ ├── mapper/
│ ├── entity/
│ ├── mq/
│ │ ├── RechargeEventListener.java
│ │ └── WithdrawEventListener.java
│ └── lua/
│ ├── balance_deduct.lua # 扣费原子操作
│ └── balance_lock.lua # 余额锁定
│
├── canvas-chain-vote-service/ # 投票服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ │ ├── VoteService.java
│ │ ├── VotingRuleService.java # 投票规则
│ │ └── AnnualAwardService.java # 年度最佳计算
│ ├── mapper/
│ ├── entity/
│ ├── mq/
│ │ └── VoteEventListener.java
│ └── strategy/
│ └── WeightedVotingStrategy.java
│
├── canvas-chain-nft-service/ # NFT 虚拟资产服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ │ ├── NFTService.java
│ │ ├── NFTMintingService.java # 铸造逻辑
│ │ ├── NFTTransferService.java # 转移逻辑
│ │ └── MetadataService.java # 元数据管理
│ ├── mapper/
│ ├── entity/
│ ├── mq/
│ │ ├── NFTMintedEventSender.java
│ │ └── NFTTransferredListener.java
│ └── blockchain/
│ └── MockBlockchainService.java # 模拟上链
│
├── canvas-chain-notification-service/ # 通知服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ ├── service/
│ │ ├── NotificationService.java
│ │ ├── SSEService.java # 服务端推送
│ │ └── EmailService.java
│ ├── mq/
│ │ └── NotificationListener.java # MQ 监听通知事件
│ └── websocket/
│ └── NotificationWebSocket.java
│
├── canvas-chain-job-service/ # 定时任务服务
│ ├── pom.xml
│ └── src/main/java/
│ ├── job/
│ │ ├── AuctionFinalizerJob.java # 拍卖结算
│ │ ├── HotArtworkJob.java # 热门创意更新
│ │ ├── RevenueSettlementJob.java # 收益清算
│ │ ├── AnnualAwardCalculationJob.java # 年度最佳计算
│ │ ├── BlindBoxRefreshJob.java # 盲盒库存刷新
│ │ ├── DataCleanupJob.java # 过期数据清理
│ │ └── ReportGenerationJob.java # 报表生成
│ └── config/
│ └── XxlJobConfig.java
│
├── canvas-chain-admin/ # 后台管理系统
│ ├── pom.xml
│ └── src/main/java/
│ ├── controller/
│ │ ├── DashboardController.java # 数据大屏
│ │ ├── AuditController.java # 内容审核
│ │ └── ReportController.java # 数据报表
│ ├── service/
│ ├── mapper/
│ └── entity/
│
├── canvas-chain-frontend/ # 前端 (Vue3)
│ ├── src/
│ │ ├── views/
│ │ │ ├── Showcase.vue # 创意展厅
│ │ │ ├── AuctionHall.vue # 拍卖大厅
│ │ │ ├── BlindBoxGallery.vue # 盲盒开箱
│ │ │ ├── VotingSquare.vue # 投票广场
│ │ │ ├── UserCenter.vue # 个人中心
│ │ │ └── Dashboard.vue # 数据大屏
│ │ ├── components/
│ │ │ ├── AuctionBidPanel.vue # 竞价面板
│ │ │ ├── BoxOpeningAnimation.vue # 开箱动画
│ │ │ ├── RealTimePrice.vue # 实时价格
│ │ │ └── LiveBidList.vue # 实时竞价列表
│ │ ├── api/
│ │ ├── store/
│ │ └── utils/
│ │ ├── websocket.js # WebSocket 连接
│ │ └── sse.js # SSE 连接
│ └── package.json
│
├── docker-compose.yml # 容器编排
│ # MySQL、Redis、RabbitMQ、Nacos、Sentinel、
│ # Seata Server、XXL-Job、Skywalking、ElasticSearch、
│ # Nginx(网关)
│
├── docs/
│ ├── architecture.md # 架构文档
│ ├── database-design.md # 数据库设计
│ ├── api-docs.md # API 文档
│ └── deployment-guide.md # 部署指南
│
└── README.md
VibeCoding 导航:⬅️ 02-计划书 | 01-项目文档(Project Overview) | ➡️ 02-CanvasChain 第1周 - 基础架构搭建详细设计文档
💬 评论