升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现

升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现

商品品牌多语言存储与 Redis 缓存同步实现文档

本设计文档说明商品品牌(pms_brand)在支持多语言环境下的数据存储、翻译同步及 Redis 缓存方案,

涵盖数据结构、DTO、服务实现、Redis Key 结构与数据流示意。

一、DTO 设计

① RequestBrandDTO

@Data

public class RequestBrandDTO implements Serializable {

private Long id;

private String brandCode;

private String brandImage;

private String brandIndex;

private Integer sortCode;

private Integer isIcon;

private Integer iconSort;

private Integer enabled;

private List sysDynamicTranslationList = new ArrayList<>();

}

② RequestSysDynamicTranslationDTO

@Data

public class RequestSysDynamicTranslationDTO implements Serializable {

private String languageCode;

private String fieldName;

private String fieldValue;

}

二、Service 实现(新增 / 修改)

1️⃣ 新增品牌(Add)

@Transactional

@Override

public void addBrand(RequestBrandDTO req, Long userId) {

String defaultLang = redisTemplate.opsForValue().get("sys:lang:default");

String defaultName = req.getSysDynamicTranslationList().stream()

.filter(t -> defaultLang.equalsIgnoreCase(t.getLanguageCode()))

.map(RequestSysDynamicTranslationDTO::getFieldValue)

.findFirst()

.orElse("未命名品牌");

复制代码
PmsBrandEntity brand = new PmsBrandEntity();
brand.setBrandCode(req.getBrandCode());
brand.setBrandName(defaultName);
brand.setBrandImage(req.getBrandImage());
brand.setBrandIndex(req.getBrandIndex());
brand.setSortCode(req.getSortCode());
brand.setIsIcon(req.getIsIcon());
brand.setIconSort(req.getIconSort());
brand.setEnabled(req.getEnabled());
brand.setCreator(userId);
brand.setCreateDate(System.currentTimeMillis());
this.save(brand);

String brandKey = "pms:brand:" + brand.getId();
redisTemplate.opsForHash().putAll(brandKey, BeanUtil.beanToMap(brand));

for (RequestSysDynamicTranslationDTO t : req.getSysDynamicTranslationList()) {
    SysDynamicTranslationEntity entity = new SysDynamicTranslationEntity();
    entity.setEntityType("product_brand");
    entity.setEntityId(brand.getId());
    entity.setLanguageCode(t.getLanguageCode());
    entity.setFieldName(t.getFieldName());
    entity.setFieldValue(t.getFieldValue());
    entity.setCreator(userId);
    entity.setCreateDate(System.currentTimeMillis());
    translationDao.insert(entity);

    String i18nKey = "i18n:product_brand:" + brand.getId() + ":" + t.getLanguageCode();
    redisTemplate.opsForHash().put(i18nKey, t.getFieldName(), t.getFieldValue());
}

redisTemplate.opsForList().rightPush("pms:brand:list:enabled", String.valueOf(brand.getId()));

}

2️⃣ 修改品牌(Update)

@Transactional

@Override

public void updateBrand(RequestBrandDTO req, Long userId) {

PmsBrandEntity brand = this.getById(req.getId());

if (brand == null) {

throw new RuntimeException("品牌不存在");

}

复制代码
String defaultLang = redisTemplate.opsForValue().get("sys:lang:default");
String defaultName = req.getSysDynamicTranslationList().stream()
    .filter(t -> defaultLang.equalsIgnoreCase(t.getLanguageCode()))
    .map(RequestSysDynamicTranslationDTO::getFieldValue)
    .findFirst()
    .orElse(brand.getBrandName());

brand.setBrandCode(req.getBrandCode());
brand.setBrandName(defaultName);
brand.setBrandImage(req.getBrandImage());
brand.setBrandIndex(req.getBrandIndex());
brand.setSortCode(req.getSortCode());
brand.setIsIcon(req.getIsIcon());
brand.setIconSort(req.getIconSort());
brand.setEnabled(req.getEnabled());
brand.setUpdater(userId);
brand.setUpdateDate(System.currentTimeMillis());
this.updateById(brand);

String brandKey = "pms:brand:" + brand.getId();
redisTemplate.delete(brandKey);
redisTemplate.opsForHash().putAll(brandKey, BeanUtil.beanToMap(brand));

for (RequestSysDynamicTranslationDTO t : req.getSysDynamicTranslationList()) {
    SysDynamicTranslationEntity exist = translationDao.findOne(
        "product_brand", brand.getId(), t.getLanguageCode(), t.getFieldName());
    if (exist == null) {
        SysDynamicTranslationEntity entity = new SysDynamicTranslationEntity();
        entity.setEntityType("product_brand");
        entity.setEntityId(brand.getId());
        entity.setLanguageCode(t.getLanguageCode());
        entity.setFieldName(t.getFieldName());
        entity.setFieldValue(t.getFieldValue());
        entity.setCreator(userId);
        entity.setCreateDate(System.currentTimeMillis());
        translationDao.insert(entity);
    } else {
        exist.setFieldValue(t.getFieldValue());
        exist.setUpdater(userId);
        exist.setUpdateDate(System.currentTimeMillis());
        translationDao.updateById(exist);
    }

    String i18nKey = "i18n:product_brand:" + brand.getId() + ":" + t.getLanguageCode();
    redisTemplate.opsForHash().put(i18nKey, t.getFieldName(), t.getFieldValue());
}

}

三、Redis Key 结构设计

1️⃣ pms:brand:{id} → 品牌主缓存(Hash)

2️⃣ pms:brand:list:enabled → 启用品牌ID列表(List)

3️⃣ i18n:product_brand:{id}:{lang} → 品牌多语言翻译缓存(Hash)

四、数据流说明

新增 / 修改品牌数据流:

前端 RequestBrandDTO → Controller → Service

→ 保存 pms_brand 主表(默认语言)

→ 保存 sys_dynamic_translation 多语言翻译

→ 写入 Redis:

  • pms:brand:
  • i18n:product_brand:{id}:{languageCode}
    → 返回结果

五、Redis 数据示例

pms:brand:1001

├─ id = 1001

├─ brand_code = COCA

├─ brand_name = 可口可乐

i18n:product_brand:1001:zh-CN

├─ brand_name = 可口可乐

i18n:product_brand:1001:en-US

├─ brand_name = Coca-Cola

i18n:product_brand:1001:ja-JP

├─ brand_name = コカ・コーラ

六、总结

该方案实现了商品品牌的国际化多语言同步逻辑,支持前端提交多语言内容,后端统一写入数据库与缓存。

实现要点:

  1. 默认语言写入品牌主表
  2. 所有语言写入 sys_dynamic_translation
  3. Redis 双层缓存结构(品牌主缓存 + 多语言缓存)
  4. 修改品牌自动刷新翻译与缓存
相关推荐
xiaoye37083 小时前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
YDS8295 小时前
黑马点评 —— 分布式锁详解加源码剖析
java·spring boot·redis·分布式
ZTLJQ5 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
夏霞5 小时前
c# signlar 客户端传递参数给服务端配置方法
开发语言·c#
迷藏4945 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
AI自动化工坊5 小时前
DeerFlow 2.0实战指南:生产级AI Agent框架的Docker化部署与并行编排
人工智能·docker·ai·容器·开源
升鲜宝供应链及收银系统源代码服务5 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
daidaidaiyu5 小时前
Nacos实例一则及其源码环境搭建
java·spring
2301_818419015 小时前
C++中的解释器模式变体
开发语言·c++·算法
冬奇Lab6 小时前
一天一个开源项目(第56篇):人人都能用英语 - AI 时代的外语学习开源项目
人工智能·开源·资讯