本项目是在RuoYi开发框架中集成Nop平台的示例应用。后端基于RuoYi v3.8.5。
后端代码: nop-for-ruoyi 前端代码: nop-for-ruoyi-vue3
修改项目根目录下的pom文件,将nop平台的nop-spring-web-start模块和nop-sys-web模块和nop加入依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.github.entropy-cloud</groupId>
<artifactId>nop-spring-web-starter</artifactId>
<version>${nop-entropy.version}</version>
</dependency>
<dependency>
<groupId>io.github.entropy-cloud</groupId>
<artifactId>nop-sys-web</artifactId>
<version>${nop-entropy.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
在ruoyi-admin模块中引入nop-spring-web-starter和nop-sys-web模块,其中nop-spring-web-starter模块是实现Springboot与Nop平台集成所必须的, 而引入nop-sys-web模块是为了使用NopSysSequence顺序号生成器表以及演示如何集成Nop平台生产的模块。
<dependencies>
<dependency>
<groupId>io.github.entropy-cloud</groupId>
<artifactId>nop-spring-web-starter</artifactId>
</dependency>
<dependency>
<groupId>io.github.entropy-cloud</groupId>
<artifactId>nop-sys-web</artifactId>
</dependency>
</dependencies>
在application.yaml中增加配置
nop:
debug: true
orm:
init-database-schema: true
这样会以调试模式启动,并自动根据ORM模型创建NopSysSequence等所需要的数据库表。
- 与SpringBoot集成的实现原理: 在nop-spring-web-starter模块的NopSpringWebAutoConfig配置类中会监听Spring容器的启动事件,当Spring容器启动完毕后再启动Nop平台。
一般情况下基于Nop平台开发的模块并不依赖于Spring框架,可以独立开发并使用自动生成的xxx-app来测试,最后再在ruoyi工程中引入对应模块来打包为spring服务。
增加resources/_vfs/_delta/default/nop/dao/beans/dao-defaults.beans.xml
,通过可逆计算取消Nop平台内置的nopDataSource,并将Spring中的dynamicDataSource映射为nopDataSource。
<beans x:schema="/nop/schema/beans.xdef" xmlns:x="/nop/schema/xdsl.xdef"
x:extends="super" x:dump="true">
<bean id="nopDataSource" x:override="remove" />
<bean id="nopHikariConfig" x:override="remove" />
<alias name="dynamicDataSource" alias="nopDataSource" />
</beans>
在ruoyi-framework模块中引入nop-spring-web-starter依赖
<dependency>
<groupId>io.github.entropy-cloud</groupId>
<artifactId>nop-spring-web-starter</artifactId>
</dependency>
在JwtAuthenticationTokenFilter中增加登录后用户上下文的初始化代码
void initUserContext(LoginUser loginUser) {
UserContextImpl userContext = new UserContextImpl();
String userName = loginUser.getUsername();
userContext.setUserName(userName);
userContext.setUserId(loginUser.getUserId());
userContext.setDeptId(String.valueOf(loginUser.getDeptId()));
userContext.setAccessToken(loginUser.getToken());
userContext.setSessionId(loginUser.getToken());
IUserContext.set(userContext);
}
在ruoyi-framework模块中增加IActionAuthChecker的实现类
public class NopActionAuthChecker implements IActionAuthChecker {
@Inject
PermissionService permissionService;
@Override
public boolean isPermitted(String permission, IUserContext iUserContext) {
return permissionService.hasPermi(permission);
}
}
在定制的dao-defaults.beans.xml中增加配置
<bean id="actionAuthChecker" class="com.ruoyi.framework.web.service.PermissionService" />
Nop平台是在Spring框架初始化完毕之后创建的,因此在Nop平台开发的模块中可以通过 @Inject标准注解来直接注入Spring容器所管理的类。
而在Spring容器所创建的服务类中,不能自动注入Nop平台所管理的类,但是可以通过BeanContainer获取,例如
IGraphQLEngine engine = BeanContainer.instance().getBeanByType(IGraphQLEngine.class);
BeanContainer.instance().getBean("myBean");
建议使用Nop平台开发的时候,尽量不直接使用Spring相关的类,可以封装为接口后注入到模块中使用。通过这种方式,可以使得相应功能摆脱Spring依赖,未来可以移植到Quarkus框架中使用。