1. 项目背景与意义
随着文化创意产业的快速发展,越来越多的文创作品需要通过线上渠道进行展示与交易。然而,传统电商平台往往缺乏对文创作品的艺术性展示支持,难以满足创作者与收藏者之间的深度互动需求。本项目“艺展集”旨在构建一个集线上展览、作品交易、创作者入驻于一体的文创作品平台,为文创产业数字化升级提供技术支撑。
从实际意义来看,该平台一方面帮助独立创作者降低作品推广门槛,通过虚拟展厅和作品详情页充分展示创作理念与工艺细节;另一方面为收藏者和爱好者提供便捷的浏览、检索与交易渠道,促进文创作品的流通与价值实现。同时,平台积累的作品数据与交易数据也可为文创市场趋势分析提供参考。
2. 技术栈选型
本平台采用前后端分离架构,后端基于 SpringBoot 构建 RESTful API,前端使用 Vue.js 配合 Element UI 实现管理后台与用户界面,数据存储选用 MySQL 与 Redis 组合。
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | SpringBoot 2.7 | 快速构建独立服务,简化配置与部署 |
| 持久层 | MyBatis-Plus | 简化 CRUD 操作,支持分页与条件构造器 |
| 数据库 | MySQL 8.0 | 存储用户、作品、订单、展览等核心业务数据 |
| 缓存 | Redis | 缓存热点作品数据与登录会话,提升响应速度 |
| 安全认证 | Spring Security + JWT | 实现用户认证与接口权限控制 |
| 文件存储 | 阿里云 OSS | 存储作品图片、展览封面等静态资源 |
| 前端框架 | Vue.js + Element UI | 构建响应式管理后台与用户端页面 |
3. 系统功能模块设计
平台整体划分为用户管理、作品管理、线上展览、订单交易、评论互动和后台管理六大核心模块。
- 用户管理:支持创作者与收藏者两种角色注册登录,维护个人资料与实名认证信息。
- 作品管理:创作者可上传作品图片、填写作品描述、设置售价与库存,支持草稿与上架状态切换。
- 线上展览:管理员可创建主题展览,将多件作品组织为虚拟展厅,按展区进行展示与导览。
- 订单交易:收藏者可下单购买作品,支持购物车、订单状态流转与支付回调处理。
- 评论互动:用户可对作品发表评论与评分,创作者可回复,形成互动闭环。
- 后台管理:管理员可审核作品、管理展览、处理订单退款与用户举报。
4. 数据库设计
数据库共设计六张核心业务表,分别为用户表、作品表、展览表、展览作品关联表、订单表和评论表。
| 表名 | 主要字段 | 说明 |
|---|---|---|
| user | id, username, password, role, avatar, phone | 存储用户账号信息与角色标识 |
| artwork | id, user_id, title, description, price, cover_url, status | 存储作品基本信息与上下架状态 |
| exhibition | id, title, description, cover_url, start_time, end_time | 存储线上展览主题与时间信息 |
| exhibition_artwork | id, exhibition_id, artwork_id, sort_order | 维护展览与作品的关联关系 |
| orders | id, order_no, user_id, artwork_id, amount, status, create_time | 记录订单交易信息与状态流转 |
| comment | id, artwork_id, user_id, content, rating, create_time | 存储用户评论与评分数据 |
5. 核心代码实现
5.1 作品实体类
@Data @TableName("artwork") public class Artwork { @TableId(type = IdType.AUTO) private Long id; private Long userId; private String title; private String description; private BigDecimal price; private String coverUrl; private Integer status; private LocalDateTime createTime; }5.2 作品查询接口
@RestController @RequestMapping("/api/artwork") public class ArtworkController { @Resource private ArtworkService artworkService; @GetMapping("/list") public Result<Page<ArtworkVO>> list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, @RequestParam(required = false) String keyword) { Page<ArtworkVO> result = artworkService.queryArtworkPage(page, size, keyword); return Result.success(result); } @GetMapping("/{id}") public Result<ArtworkDetailVO> detail(@PathVariable Long id) { return Result.success(artworkService.getArtworkDetail(id)); } }5.3 作品服务实现类
@Service public class ArtworkServiceImpl implements ArtworkService { @Resource private ArtworkMapper artworkMapper; @Override public Page<ArtworkVO> queryArtworkPage(Integer page, Integer size, String keyword) { Page<Artwork> pageParam = new Page<>(page, size); LambdaQueryWrapper<Artwork> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Artwork::getStatus, 1); if (StringUtils.hasText(keyword)) { wrapper.like(Artwork::getTitle, keyword); } wrapper.orderByDesc(Artwork::getCreateTime); Page<Artwork> artworkPage = artworkMapper.selectPage(pageParam, wrapper); return convertToVO(artworkPage); } @Override public ArtworkDetailVO getArtworkDetail(Long id) { Artwork artwork = artworkMapper.selectById(id); if (artwork == null) { throw new BusinessException("作品不存在"); } ArtworkDetailVO vo = new ArtworkDetailVO(); BeanUtils.copyProperties(artwork, vo); return vo; } private Page<ArtworkVO> convertToVO(Page<Artwork> artworkPage) { Page<ArtworkVO> voPage = new Page<>(artworkPage.getCurrent(), artworkPage.getSize()); List<ArtworkVO> voList = artworkPage.getRecords().stream().map(item -> { ArtworkVO vo = new ArtworkVO(); BeanUtils.copyProperties(item, vo); return vo; }).collect(Collectors.toList()); voPage.setRecords(voList); voPage.setTotal(artworkPage.getTotal()); return voPage; } }5.4 订单创建接口
@PostMapping("/create") public Result<OrderVO> createOrder(@RequestBody @Valid OrderCreateDTO dto) { Long userId = SecurityUtils.getCurrentUserId(); OrderVO orderVO = orderService.createOrder(userId, dto); return Result.success(orderVO); }5.5 订单服务实现
@Service public class OrderServiceImpl implements OrderService { @Resource private OrderMapper orderMapper; @Resource private ArtworkMapper artworkMapper; @Override @Transactional(rollbackFor = Exception.class) public OrderVO createOrder(Long userId, OrderCreateDTO dto) { Artwork artwork = artworkMapper.selectById(dto.getArtworkId()); if (artwork == null || artwork.getStatus() != 1) { throw new BusinessException("作品不存在或已下架"); } Orders order = new Orders(); order.setOrderNo(generateOrderNo()); order.setUserId(userId); order.setArtworkId(artwork.getId()); order.setAmount(artwork.getPrice()); order.setStatus(0); orderMapper.insert(order); OrderVO vo = new OrderVO(); BeanUtils.copyProperties(order, vo); return vo; } private String generateOrderNo() { return "YZJ" + System.currentTimeMillis() + RandomUtil.randomNumbers(4); } }6. 总结
本项目基于 SpringBoot 构建了“艺展集”文创作品线上展览与交易平台,通过合理的模块划分与数据库设计,实现了作品展示、线上展览、订单交易等核心业务闭环。技术选型上兼顾开发效率与系统稳定性,为文创产业线上化提供了可落地的实践方案。后续可进一步引入推荐算法与支付分账能力,持续完善平台生态。