feat(国际化): 新增国际化

This commit is contained in:
gx_ma
2026-03-24 11:41:41 +08:00
parent abe46baf18
commit e70c198071
97 changed files with 10802 additions and 5302 deletions

View File

@@ -70,6 +70,22 @@
<version>${dynamic-datasource.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,6 +1,8 @@
package com.fastbee.framework.config;
import java.util.concurrent.TimeUnit;
import com.fastbee.framework.interceptor.LanguageInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -15,6 +17,8 @@ import com.fastbee.common.config.RuoYiConfig;
import com.fastbee.common.constant.Constants;
import com.fastbee.framework.interceptor.RepeatSubmitInterceptor;
import javax.annotation.Resource;
/**
* 通用配置
*
@@ -25,6 +29,8 @@ public class ResourcesConfig implements WebMvcConfigurer
{
@Autowired
private RepeatSubmitInterceptor repeatSubmitInterceptor;
@Resource
private LanguageInterceptor languageInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
@@ -46,6 +52,9 @@ public class ResourcesConfig implements WebMvcConfigurer
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
//这里配置国际化拦截器的白名单
registry.addInterceptor(languageInterceptor).addPathPatterns("/**").excludePathPatterns("/v2/api-docs",
"/tool/gen/**");
}
/**

View File

@@ -119,6 +119,7 @@ public class SecurityConfig
"/wechat/mobileLogin", "/wechat/miniLogin", "/wechat/wxBind/callback").permitAll()
.antMatchers("/zlmhook/**").permitAll()
.antMatchers("/goview/sys/login","/goview/project/getData").permitAll()
.antMatchers("/app/language/list").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/druid/**").permitAll()

View File

@@ -0,0 +1,58 @@
package com.fastbee.framework.interceptor;
import com.fastbee.common.enums.Language;
import com.fastbee.common.utils.SecurityUtils;
import com.fastbee.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
import static com.fastbee.common.constant.Constants.LANGUAGE;
/**
* 国际化语言拦截器
*/
@Component
@Slf4j
public class LanguageInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String language = request.getHeader(LANGUAGE);
if (StringUtils.isEmpty(language) || language.equals("undefined")
|| language.equals("")|| language.equals("null")){
//针对有些接口没有增加语言字段先去token获取
language = SecurityUtils.getLanguage();
}else if (!language.contains("-")){
language = Language.matches(language);
}
// 前端传递的language必须是zh-CN格式的中间的-必须要完整不能只传递zh或en
Locale locale = new Locale(language.split("-")[0],language.split("-")[1]);
// 这样赋值以后MessageUtils.message方法就不用修改了
LocaleContextHolder.setLocale(locale);
return true;
}
/**
* 请求处理之后进行调用但是在视图被渲染之前Controller方法调用之后
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
}
/**
* 在整个请求结束之后被调用也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}

View File

@@ -66,7 +66,7 @@ public class SysLoginService
* @param uuid 唯一标识
* @return 结果
*/
public String login(String username, String password, String code, String uuid)
public String login(String username, String password, String code, String uuid, String language)
{
// 验证码校验
validateCaptcha(username, code, uuid);
@@ -100,6 +100,7 @@ public class SysLoginService
}
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
loginUser.setLanguage(language);
recordLoginInfo(loginUser.getUserId());
// 生成token
return tokenService.createToken(loginUser);
@@ -111,7 +112,7 @@ public class SysLoginService
* @param password 密码
* @return token
*/
public String socialLogin(String username, String password){
public String socialLogin(String username, String password, String language){
// 用户验证
Authentication authentication = null;
try
@@ -136,6 +137,7 @@ public class SysLoginService
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
recordLoginInfo(loginUser.getUserId());
loginUser.setLanguage(language);
// 生成token
return tokenService.createToken(loginUser);
}
@@ -146,7 +148,7 @@ public class SysLoginService
* @param encodePwd 系统用户密码
* @return
*/
public String redirectLogin(String username,String encodePwd){
public String redirectLogin(String username,String encodePwd,String language){
// UserDetails userDetails=userDetailsServiceImpl.loadUserByUsername(username);
SysUser user = userService.selectUserByUserName(username);
if (StringUtils.isNull(user))
@@ -167,6 +169,8 @@ public class SysLoginService
UserDetails userDetails = userDetailsServiceImpl.createLoginUser(user);
LoginUser loginUser = (LoginUser) userDetails;
recordLoginInfo(loginUser.getUserId());
loginUser.setLanguage(language);
// 生成token
return tokenService.createToken(loginUser);

View File

@@ -61,6 +61,6 @@ public class UserDetailsServiceImpl implements UserDetailsService
public UserDetails createLoginUser(SysUser user)
{
return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
return new LoginUser(user.getUserId(), user.getDeptId(), user.getLanguage(), user, permissionService.getMenuPermission(user));
}
}