项目文档(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)

  • 审核发布内容与举报
  • 监控交易与收益
  • 热门排行榜分析
  • 抽奖策略 / 投票权重配置
  • 数据大屏(访问量、交易额、增长趋势)
业务模块图-9ab4955b

四、系统架构(Architecture)

总体架构图

架构图-62b6ad24

技术栈

后端:

  • 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
技术栈图-284f704d

项目代码结构

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周 - 基础架构搭建详细设计文档