vue+elementui+springboot后端菜单国际化

vue提供了前端国际化,但菜单栏通过后端控制,个人写个后端菜单国际化的控制(可扩展)

主要思路:后端启动时初始化将数据库中所有的菜单初始到容器里,前端发请求带上语言类型请求头,更据语言类型返回菜单数据

 新增一张表sys_lang

/*==============================================================*/
/* Table: sys_lang                                              */
/*==============================================================*/
create table sys_lang
(
   lang_id              bigint not null auto_increment comment '主键',
   lang_key             varchar(50) comment '语言key',
   lang_value           varchar(150) comment '语言value',
   lang_type            tinyint default 1 comment '语言类型(1 中文 2 英文)',
   primary key (lang_id)
);

alter table sys_lang comment '系统语言表';

 

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/**
  * @description 国际化菜单数据容器
  * @autor linxh
  * @date 2019年12月4日
  */
public class L18nMenuContainer {
    
    /**
     * 中文容器
     */
    private static Map<String, String> L18N_ZH_MENU_MAP = new HashMap<String, String>(16);
    
    /**
     * 英文容器
     */
    private static Map<String, String> L18N_EN_MENU_MAP = new HashMap<String, String>(16);
    
    /**
     * 获取
     * @param key
     * @return
     */
    protected static String get(String key) {
        if (StringUtils.isBlank(key)) {
            throw new NullPointerException("menu key is null");
        }
        return getContainerByHeader().get(key);
    }
    
    /**
     * 清空
     */
    protected static void clearAll() {
        if (!L18N_EN_MENU_MAP.isEmpty()) {
            L18N_EN_MENU_MAP.clear();
        }
        if (!L18N_ZH_MENU_MAP.isEmpty()) {
            L18N_ZH_MENU_MAP.clear();
        }
    }
    
    /**
     * 获取容器
     * @return
     */
    protected static Map<String, String> getContainerByHeader() {
        String header = L18nHeader.getHeader();
        if (Constant.EN_US.equals(header)) {
            return L18N_EN_MENU_MAP;
        } else  if (Constant.ZH_CN.equals(header)){
            return L18N_ZH_MENU_MAP;
        }
        throw new RuntimeException("get l18n header error");
    }
    
    /**
     * 获取容器
     * @return
     */
    protected static Map<String, String> getContainerByType(int type) {
        if (type == L18nEnum.EN_US.getOrdial()) {
            return L18N_EN_MENU_MAP;
        } else  if (type == L18nEnum.ZH_CN.getOrdial()){
            return L18N_ZH_MENU_MAP;
        }
        throw new RuntimeException("get lang type error");
    }
}

 

import java.util.List;

import javax.annotation.PostConstruct;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

/**
  * @description 菜单国际化
  * @autor linxh
  * @date 2019年12月3日
  */
@Component
@Slf4j
public class L18nMenu {
    
    @Autowired
    private SysLangService langService;
    
    
    
    /**
     * 重试次数
     */
    private static final int RETRY_COUNT = 3;
    
    /**
     * 初始化
     */
    @PostConstruct
    public void init() {
        int updCount = 0;
        while (updCount < RETRY_COUNT) {
            if (this.insertAll()) {
                return;
            }
            updCount++;
        }
        if (log.isErrorEnabled()) {
            log.error("lang init faild");
        }
        throw new RuntimeException("lang init faild");
    }
    
    /**
     * 插入所有数据
     */
    public boolean insertAll() {
        try {
            List<SysLang> menuLangList = langService.selectAll();
            for (SysLang sysLang : menuLangList) {
                addOrUpd(sysLang.getLangKey(), sysLang.getLangValue(), sysLang.getLangType());
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    
    /**
     * 定时更新
     */
    public void execute() {
        L18nMenuContainer.clearAll();
        int updCount = 0;
        while (updCount < RETRY_COUNT) {
            if (this.insertAll()) {
                return;
            }
            updCount++;
        }
        if (log.isErrorEnabled()) {
            log.error("lang update faild");
        }
        throw new RuntimeException("lang update faild");
    }
    
    /**
     * 添加或修改
     * @param key
     * @param val
     */
    public void addOrUpd(String key, String val, int type) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(val)) {
            throw new NullPointerException("menu key or value is null");
        }
        L18nMenuContainer.getContainerByType(type).put(key, val);
    }
    
    /**
     * 获取值
     * @param key
     * @return
     */
    public String getVal(String key) {
        return L18nMenuContainer.get(key);
    }
}

 /**
  * @description 语言类型枚举
  * @autor linxh
  * @date 2019年12月4日
  */
public enum L18nEnum {
    ZH_CN(1,"中文"),
    EN_US(2,"英文");
    
    /**
     * 类型值
     */
    private int ordial;
    /**
     * 类型描述
     */
    private String l18nDesc;
    
    private L18nEnum(int ordial, String l18nDesc) {
        this.ordial = ordial;
        this.l18nDesc = l18nDesc;
    }
    
    public final int getOrdial(){
        return this.ordial;
    }
}

 

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * @description 国际化请求头
 * @autor linxh
 * @date 2019年12月3日
 */
public class L18nHeader {
    
    private final static String L18N_VAL= "i18n";
    
    public static String getHeader() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        if(null != requestAttributes) {
            HttpServletRequest request = requestAttributes.getRequest();            
            String headerVal = request.getHeader(L18N_VAL);
            return headerVal;
        }
        return "";
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值