若依架構代碼改造
概述
若依架構是開源優秀版本,實現前后端分類,主要相關文檔鏈接如下:https://doc.ruoyi.vip/ruoyi/
問題匯總和處理
嘗試用若依架構改造本地項目,遇到問題匯總,便于大家參考交流
問題1、登錄提示驗證碼有誤:
解決:替換項目的時候,主要framework項目這個文件CaptchaConfig.java,如下行配置:KaptchaTextCreator一定帶上空間名稱邏輯,否則找不到
// 驗證碼文本生成器 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator");
問題2、token存儲redis緩存里面的json,結果取值反序列化失敗:
解決:主要替換common模塊里面Constants.java,修改配置如下,JSON_WHITELIST_STR 一定要配置自己的命名空間
/** * 自動識別json對象白名單配置(僅允許解析的包名,范圍越小越安全) */ public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.ruoyi" }; /** * 定時任務白名單配置(僅允許訪問的包名,如其他需要可以自行添加) */ public static final String[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" }; /** * 定時任務違規的字符 */ public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" };
問題3、mapper找不到,提示無此class文件。
解決:主要替換framework項目里面ApplicationConfig.java文件里面的注解,MapperScan一定改成自己的命名空間
/** * 程序注解配置 * * @author fts */ @Configuration // 表示通過aop框架暴露該代理對象,AopContext能夠訪問 @EnableAspectJAutoProxy(exposeProxy = true) // 指定要掃描的Mapper類的包的路徑 @MapperScan("com.ruoyi.**.mapper") public class ApplicationConfig { /** * 時區配置 */ @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); } }
建議4:建議修改下CacheConstants.java文件修改成自己的項目后綴,如下,方便鍵值分開;
/** * 登錄用戶 redis key */ public static final String LOGIN_TOKEN_KEY = "login_tokens_test:";
常遇到問題列表:
1、Long 類型id,查詢顯示頁面丟失精度顯示不一致。需要加上注解:
@JsonSerialize(using = ToStringSerializer.class) private Long id;
2、mapper的查詢日志顯示不出來,配置文件加上如下:
# mybatis配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、提示數據未授權,其他模塊有效的token,到某個模塊跟日志提示:token無效
解決方式:修改nacos配置文件,redis配置中和其他模塊保持一致。
比如如下配置,其他模塊都抱持統一:(spring.redis.database標識redis緩存數據庫的編號,否則找其他數據庫就會報錯,找不到token)

4、若依頁面集成
1>、菜單配置。不要用外部鏈接,配置如下:

2>、編寫iframe/index目錄下的vue(接受路由傳過來的參數,用iframe加載url)
<template > <div> <iframe ref="tagFrame" width="100%" border="0" ></iframe> </div> </template> <script> import { getToken } from "@/utils/auth"; export default { name: "fts", data() { return { tagQuery:null }; }, mounted(){ this.loadFrameUrl(); }, created() { this.tagQuery=this.$route.query; }, methods: { /** 加載基礎數據 */ loadFrameUrl() { const iframe = this.$refs.tagFrame; const url=this.tagQuery.tagUrl+"?tms_org=0001&source=" console.log(url) const deviceWidth = document.documentElement.clientWidth const deviceHeight = document.documentElement.clientHeight // 數字是頁面布局寬度差值 //iframe.style.width = (Number(deviceWidth) - 40) + 'px' // 數字是頁面布局高度差 iframe.style.height = (Number(deviceHeight) - 90) + 'px' this.openWindowFileHeader(iframe,url); }, //打開上傳文件 openWindowFileHeader(iframe,url){ fetch(url, { headers: { 'UserInfo': getToken() // 添加自定義請求頭 } }) .then(response => response.text()) .then(html => { iframe.contentWindow.document.open(); iframe.contentWindow.document.write(html); iframe.contentWindow.document.close(); }); } } }; </script>
3>、集成第三方地址后端java關鍵性的代碼
String jwt = request.getHeader(JWT_TOKEN_HEADER);//獲取token //解析token。采用 Claims claims = Jwts.parser().setSigningKey(generateKey()) .parseClaimsJws(jwt).getBody(); //基于jjwt和密鑰,生成key private Key generateKey() { return new SecretKeySpec(jwtSecret.getBytes(), SignatureAlgorithm.HS512.getJcaName()); }
jjwt對應的pom文件
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>

浙公網安備 33010602011771號