在数字化时代背景下,非物质文化遗产的保护与传承面临着新的机遇与挑战。传统的手工记录、线下展示和单一销售模式已难以满足现代社会的需求。为此,我们设计并实现了一个集文化展示与商业运营于一体的综合性平台——"非遗文化数字生态平台"。该平台基于成熟的SSM(Spring+SpringMVC+MyBatis)技术栈构建,旨在通过数字化手段解决非遗文化传播渠道有限、商业化困难以及管理效率低下等核心问题。
系统架构与技术栈
该平台采用标准的三层架构设计,确保了系统的高内聚、低耦合特性。Spring框架作为核心容器,负责管理所有业务组件的生命周期和依赖关系,通过声明式事务管理确保数据操作的原子性和一致性。SpringMVC作为Web层框架,采用经典的MVC模式处理前端请求,利用拦截器机制实现统一的权限验证和日志记录。MyBatis作为数据持久层框架,通过灵活的XML配置实现SQL与Java代码的分离,提供了强大的动态SQL功能。
技术栈配置如下:
<dependencies>
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- SpringMVC依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
前后端数据交互采用JSON格式,保证了数据传输的高效性和兼容性。系统使用Maven进行依赖管理,确保项目构建的一致性和可重复性。
数据库设计亮点
数据库设计是系统稳定性的基石。本平台采用MySQL作为数据存储引擎,设计了21张业务表来支撑完整的业务流程。以下重点分析几个核心表的设计亮点:
购物车表(gouwuche)的设计优化
CREATE TABLE `gouwuche` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`feiyixinxiid` int(10) unsigned NOT NULL COMMENT '非遗产品信息id',
`feiyibianhao` varchar(50) NOT NULL COMMENT '非遗产品编号',
`feiyimingcheng` varchar(255) NOT NULL COMMENT '非遗产品名称',
`fenlei` int(10) unsigned NOT NULL COMMENT '分类',
`xiaoshoujiage` decimal(18,2) NOT NULL COMMENT '销售价格',
`goumaishuliang` int(11) NOT NULL COMMENT '购买数量',
`xiaoji` decimal(18,2) NOT NULL COMMENT '小计',
`goumairen` varchar(50) NOT NULL COMMENT '购买人',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`),
KEY `gouwuche_feiyixinxiid_index` (`feiyixinxiid`),
KEY `gouwuche_fenlei_index` (`fenlei`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='购物车'
设计亮点分析:
- 冗余字段优化查询性能:表中包含了
feiyibianhao(产品编号)、feiyimingcheng(产品名称)等冗余字段,虽然违反了第三范式,但显著减少了多表关联查询,提升了购物车页面的加载速度。 - 计算字段预存:
xiaoji(小计)字段通过xiaoshoujiage * goumaishuliang计算得出并直接存储,避免了每次查询时的重复计算。 - 复合索引策略:为
feiyixinxiid和fenlei字段分别建立索引,优化了按产品ID和分类查询的性能。
订单信息表(dingdanxinxi)的事务安全设计
CREATE TABLE `dingdanxinxi` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dingdanbianhao` varchar(50) NOT NULL COMMENT '订单编号',
`dingdanxinxi` text NOT NULL COMMENT '订单信息',
`zongjijine` decimal(18,2) NOT NULL COMMENT '总计金额',
`shouhuoren` varchar(50) NOT NULL COMMENT '收货人',
`dianhua` varchar(50) NOT NULL COMMENT '电话',
`dizhi` varchar(255) NOT NULL COMMENT '地址',
`beizhu` text NOT NULL COMMENT '备注',
`zhuangtai` varchar(255) NOT NULL COMMENT '状态',
`xiadanren` varchar(50) NOT NULL COMMENT '下单人',
`iszf` varchar(10) NOT NULL DEFAULT '否' COMMENT '是否支付',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单信息'
事务完整性保障:
- 金额精度控制:使用
decimal(18,2)类型存储金额,确保财务计算的精确性。 - 状态机设计:
zhuangtai字段明确标识订单生命周期(待支付、已支付、已发货、已完成等),便于业务流程跟踪。 - 支付状态隔离:独立的
iszf字段专门记录支付状态,与订单状态解耦,支持更灵活的支付流程。

核心功能实现
1. 购物车与订单管理子系统
购物车功能采用Session与数据库双存储策略,为用户提供无缝的购物体验。核心控制器代码如下:
@Controller
@RequestMapping("/cart")
public class CartController extends BaseController {
@Autowired
private FeiyixinxiService productService;
@Autowired
private GouwucheService cartService;
/**
* 添加商品到购物车
*/
@RequestMapping("/add")
@ResponseBody
public JSONObject addToCart(HttpServletRequest request) {
JSONObject result = new JSONObject();
try {
Integer productId = Integer.valueOf(request.getParameter("feiyixinxiid"));
Integer quantity = Integer.valueOf(request.getParameter("goumaishuliang"));
String username = getCurrentUser();
// 检查商品库存
Feiyixinxi product = productService.findById(productId);
if (product.getKucun() < quantity) {
result.put("success", false);
result.put("message", "库存不足");
return result;
}
// 构建购物车项
Gouwuche cartItem = new Gouwuche();
cartItem.setFeiyixinxiid(productId);
cartItem.setFeiyibianhao(product.getBianhao());
cartItem.setFeiyimingcheng(product.getMingcheng());
cartItem.setFenlei(product.getFenlei());
cartItem.setXiaoshoujiage(product.getXiaoshoujiage());
cartItem.setGoumaishuliang(quantity);
cartItem.setXiaoji(product.getXiaoshoujiage().multiply(new BigDecimal(quantity)));
cartItem.setGoumairen(username);
cartService.insert(cartItem);
result.put("success", true);
result.put("message", "添加成功");
} catch (Exception e) {
result.put("success", false);
result.put("message", "系统错误:" + e.getMessage());
}
return result;
}
}

2. 管理员权限控制系统
系统采用基于角色的访问控制(RBAC)模型,管理员实体类设计如下:
@Table(name = "admins")
public class Admins implements Serializable {
@GeneratedValue(generator = "JDBC")
@Id
@Column(name = "id", insertable = false)
private Integer id;
@Column(name = "username")
private String username;
@Column(name = "pwd")
private String pwd;
@Column(name = "addtime")
private String addtime;
@Column(name = "role")
private String role;
@Column(name = "shopname")
private String shopname;
// Getter和Setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? "" : username.trim();
}
// 其他getter/setter方法...
}
管理员列表查询功能采用动态条件构建,支持多字段搜索:
@Controller
public class AdminsController extends BaseController {
@Autowired
private AdminsService service;
@RequestMapping("/admins_list")
public String list() {
if (!checkLogin()) {
return showError("尚未登录", "./login.do");
}
String order = Request.get("order", "id");
String sort = Request.get("sort", "desc");
Example example = new Example(Admins.class);
Example.Criteria criteria = example.createCriteria();
String where = " 1=1 ";
where += getWhere();
criteria.andCondition(where);
if (sort.equals("desc")) {
example.orderBy(order).desc();
} else {
example.orderBy(order).asc();
}
int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page"));
page = Math.max(1, page);
List<Admins> list = service.selectPageExample(example, page, 12);
assign("list", list);
assign("orderby", order);
assign("sort", sort);
assign("where", where);
return "admins_list";
}
/**
* 构建动态查询条件
*/
public String getWhere() {
String where = " ";
if (!Request.get("username").equals("")) {
where += " AND username LIKE '%" + Request.get("username") + "%' ";
}
if (!Request.get("role").equals("")) {
where += " AND role = '" + Request.get("role") + "' ";
}
return where;
}
}

3. 非遗产品分类管理
分类系统采用树形结构设计,支持无限级分类扩展:
@Service
public class FeiyifenleiService extends BaseService<Feiyifenlei> {
@Autowired
private FeiyifenleiMapper mapper;
/**
* 获取分类树形结构
*/
public List<Map<String, Object>> getCategoryTree() {
List<Feiyifenlei> allCategories = mapper.selectAll();
return buildTree(allCategories, 0);
}
private List<Map<String, Object>> buildTree(List<Feiyifenlei> categories, Integer parentId) {
List<Map<String, Object>> tree = new ArrayList<>();
for (Feiyifenlei category : categories) {
// 假设有parent_id字段表示父级分类ID
if (category.getParentId().equals(parentId)) {
Map<String, Object> node = new HashMap<>();
node.put("id", category.getId());
node.put("name", category.getFenleimingcheng());
node.put("children", buildTree(categories, category.getId()));
tree.add(node);
}
}
return tree;
}
}

4. 订单状态流转机制
订单状态管理采用状态模式设计,确保业务流程的严谨性:
@Service
public class DingdanxinxiService extends BaseService<Dingdanxinxi> {
/**
* 更新订单状态
*/
public boolean updateOrderStatus(Integer orderId, String newStatus, String operator) {
Dingdanxinxi order = findById(orderId);
if (order == null) {
return false;
}
// 状态流转验证
if (!isValidStatusTransition(order.getZhuangtai(), newStatus)) {
return false;
}
order.setZhuangtai(newStatus);
update(order);
// 记录状态变更日志
saveStatusLog(orderId, order.getZhuangtai(), newStatus, operator);
return true;
}
private boolean isValidStatusTransition(String currentStatus, String newStatus) {
// 定义允许的状态转换规则
Map<String, List<String>> transitionRules = new HashMap<>();
transitionRules.put("待支付", Arrays.asList("已支付", "已取消"));
transitionRules.put("已支付", Arrays.asList("已发货", "退款中"));
transitionRules.put("已发货", Arrays.asList("已签收", "退货中"));
// ... 其他状态规则
List<String> allowedTransitions = transitionRules.get(currentStatus);
return allowedTransitions != null && allowedTransitions.contains(newStatus);
}
}
实体模型设计
系统采用JPA注解方式进行实体映射,确保数据模型与数据库结构的严格对应:
@Table(name = "feiyixinxi")
public class Feiyixinxi implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "bianhao")
private String bianhao;
@Column(name = "mingcheng")
private String mingcheng;
@Column(name = "fenlei")
private Integer fenlei;
@Column(name = "tupian")
private String tupian;
@Column(name = "jianjie")
private String jianjie;
@Column(name = "xiangqing")
private String xiangqing;
@Column(name = "xiaoshoujiage")
private BigDecimal xiaoshoujiage;
@Column(name = "kucun")
private Integer kucun;
@Column(name = "addtime")
private String addtime;
// 关联属性
@Transient
private String fenleiName;
// Getter和Setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
// 其他getter/setter方法...
}
功能展望与优化
基于当前系统架构,以下几个方向值得进一步优化和扩展:
1. Redis缓存集成
现状分析:非遗产品信息、分类数据等基础信息查询频繁,且变化不频繁。 优化方案:
@Service
public class FeiyifenleiService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String CATEGORY_CACHE_KEY = "feiyi:categories";
public List<Feiyifenlei> getAllCategories() {
// 先查缓存
List<Feiyifenlei> categories = (List<Feiyifenlei>) redisTemplate.opsForValue().get(CATEGORY_CACHE_KEY);
if (categories == null) {
// 缓存未命中,查询数据库
categories = mapper.selectAll();
// 写入缓存,设置过期时间
redisTemplate.opsForValue().set(CATEGORY_CACHE_KEY, categories, Duration.ofHours(2));
}
return categories;
}
}
2. 消息队列异步处理
应用场景:订单创建后的库存扣减、邮件通知、数据统计等操作。 技术选型:采用RabbitMQ或RocketMQ实现业务解耦。
3. 微服务架构改造
拆分方案:
- 用户服务:负责用户认证、权限管理
- 产品服务:管理非遗产品和分类信息
- 订单服务:处理购物车、订单流程
- 内容服务:管理新闻资讯、友情链接
4. 移动端适配升级
技术方案:基于现有API开发React Native或Flutter移动应用,提供更好的移动购物体验。
5. 智能推荐系统
实现思路:基于用户浏览历史、购买记录等数据,采用协同过滤算法实现个性化推荐。
总结
非遗文化数字生态平台通过SSM框架的有机整合,构建了一个功能完备、性能稳定的文化展示与电商管理平台。系统在数据库设计上充分考虑了业务特性和性能需求,在功能实现上注重用户体验和操作便捷性。实体模型设计规范,代码结构清晰,为后续的功能扩展和维护奠定了良好基础。
平台不仅解决了非遗文化数字化展示的技术难题,更重要的是打通了文化传播与商业价值的转化通道。通过持续的技术优化和功能扩展,该平台有望成为非遗文化保护与传承的重要数字化基础设施。
