1、合并打包缘由
甲方服务器上无法安装nginx,所以只能打成一个jar包
2、后端要改的代码
1)修改ResourcesConfig
以下红色区域是新增内容:


修改后代码:
/**
* 通用配置
*
* @author ruoyi
*/
@Configuration
public class ResourcesConfigimplements WebMvcConfigurer
{
@Autowired
private RepeatSubmitInterceptorrepeatSubmitInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地文件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX +”/**”)
.addResourceLocations(“file:” + JournalismConfig.getProfile() +”/”)
.addResourceLocations(new ClassPathResource(“/static/static/index.html”) {
@Override
public ResourcecreateRelative(String relativePath) {
return this;
}
});
/** 页面静态化 */
registry.addResourceHandler(“/static/**”).addResourceLocations(“classpath:/static/static/”);
/** swagger配置 */
registry.addResourceHandler(“/swagger-ui/**”)
.addResourceLocations(“classpath:/META-INF/resources/webjars/springfox-swagger-ui/”)
.setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());
registry.addResourceHandler(“doc.html”).addResourceLocations(“classpath:/META-INF/resources/”);
registry.addResourceHandler(“/webjars/**”).addResourceLocations(“classpath:/META-INF/resources/webjars/”);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController(“/index”).setViewName(“index.html”);
registry.addViewController(“/”).setViewName(“index.html”);
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}
/**
* 自定义拦截规则
*/
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns(“/**”);
}
/**
* 跨域配置
*/
@Bean
public CorsFiltercorsFilter()
{
CorsConfiguration config =new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOriginPattern(“*”);
// 设置访问源请求头
config.addAllowedHeader(“*”);
// 设置访问源请求方法
config.addAllowedMethod(“*”);
// 有效期 1800秒
config.setMaxAge(1800L);
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source =new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration(“/**”, config);
// 返回新的CorsFilter
return new CorsFilter(source);
}
}
2)修改SecurityConfig 配置

修改后代码:
/**
* spring security配置
*
* @author ruoyi
*/
@EnableMethodSecurity(prePostEnabled =true, securedEnabled =true)
@Configuration
public class SecurityConfig
{
/**
* 自定义用户认证逻辑
*/
@Autowired
private UserDetailsServiceuserDetailsService;
/**
* 认证失败处理类
*/
@Autowired
private AuthenticationEntryPointImplunauthorizedHandler;
/**
* 退出处理类
*/
@Autowired
private LogoutSuccessHandlerImpllogoutSuccessHandler;
/**
* token认证过滤器
*/
@Autowired
private JwtAuthenticationTokenFilterauthenticationTokenFilter;
/**
* 跨域过滤器
*/
@Autowired
private CorsFiltercorsFilter;
/**
* 允许匿名访问的地址
*/
@Autowired
private PermitAllUrlPropertiespermitAllUrl;
/**
* 身份验证实现
*/
@Bean
public AuthenticationManagerauthenticationManager()
{
DaoAuthenticationProvider daoAuthenticationProvider =new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userDetailsService);
daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
return new ProviderManager(daoAuthenticationProvider);
}
/**
* anyRequest | 匹配所有请求路径
* access | SpringEl表达式结果为true时可以访问
* anonymous | 匿名可以访问
* denyAll | 用户不能访问
* fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录)
* hasAnyAuthority | 如果有参数,参数表明权限,则其中任何一个权限可以访问
* hasAnyRole | 如果有参数,参数表明角色,则其中任何一个角色可以访问
* hasAuthority | 如果有参数,参数表明权限,则其权限可以访问
* hasIpAddress | 如果有参数,参数表明IP地址,如果用户IP和参数匹配,则可以访问
* hasRole | 如果有参数,参数表明角色,则其角色可以访问
* permitAll | 用户可以任意访问
* rememberMe | 允许通过remember-me登录的用户访问
* authenticated | 用户登录后可访问
*/
@Bean
protected SecurityFilterChainfilterChain(HttpSecurity httpSecurity)throws Exception
{
return httpSecurity
// CSRF禁用,由于不使用session
.csrf(csrf -> csrf.disable())
// 禁用HTTP响应标头
.headers((headersCustomizer) -> {
headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());
})
// 认证失败处理类
.exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
// 基于token,所以不需要session
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 注解标记允许匿名访问的url
.authorizeHttpRequests((requests) -> {
permitAllUrl.getUrls().forEach(url ->requests.antMatchers(url).permitAll());
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
requests.antMatchers(“/login”,”/register”,”/captchaImage”,”/api/**”,”/common/**”).permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET,”/”,”/*.html”,”/**/*.html”,”/**/*.css”,”/**/*.js”,”/static/**”,
“/”,
“/index”,”/profile/**”).permitAll()
.antMatchers(“/swagger-ui.html”,”/swagger-resources/**”,”/webjars/**”,”/*/api-docs”,”/druid/**”).permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
})
// 添加Logout filter
.logout(logout -> logout.logoutUrl(“/logout”).logoutSuccessHandler(logoutSuccessHandler))
// 添加JWT filter
.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
// 添加CORS filter
.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
.addFilterBefore(corsFilter, LogoutFilter.class)
.build();
}
/**
* 强散列哈希加密实现
*/
@Bean
public BCryptPasswordEncoderbCryptPasswordEncoder()
{
return new BCryptPasswordEncoder();
}
}
3)修改admin模块下的pom文件
把以下配置添加到admin模块下的pom的<build>中
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>static/**</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>static/**</include>
</includes>
</resource>
</resources>

2、修改前端代码
我把前端项目ui放到项目里面了

1)修改前端vue.config.js
修改打包后的输出位置
outputDir: ../ruoyi-admin/src/main/resources/static


2)、修改router/index.js
改为:mode: hash ,

3)修改.env.production
VUE_APP_BASE_PATH调用后端ip端口地址
VUE_APP_BASE_API = 设置为空字符串

需要修改的代码位置就修改完了。
可以在本地测试运行一下,先打前端包,

打包后查看admin模块下resources是否有前端文件

然后就可以启动后端项目啦。页面访问也是访问后端的ip地址+端口;
我的后端端口是8081
访问:http://localhost:8081/





