基于springboot的助农服务app
介绍
2024届软件工程毕业设计
该项目是基于springboot的助农App的设计及实现,主要实现了管理员,用户,商家三个端的设计,其中主要实现的功能有产品模块,订单模块,购物车模块,以及相关联的管理模块,秒杀等,帮助农民出售农作物,提高农业水平的发展,提高农民的收入,方便农民出售自产的农产品。系统使用MVC设计模式,用户端以及商家端采用uniapp+springboot+mybatis+mybatis-plus实现,后台管理系统采用vue+springboot+mybatis+mybatis-plus实现。数据存储使用mysql数据库,同时使用elasticSearch全文搜索,加快和前端交互的效率。
管理员端页面效果图如下,其中权限管理中使用了springsecurity框架,作为动态权限。各个表单的添加和修改功能均测试过,无任何问题。
其中,springsecurity的核心代码如下,配置了过滤器,拦截规则,异常处理器等
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
//退出登录
.and()
.logout()
.logoutSuccessHandler(jwtLogoutSuccessHandler)
// 配置拦截规则
.and()
.authorizeRequests()
.antMatchers(URL_WHITELIST).permitAll()
.anyRequest().access(
"@customPermissionEvaluator.hasPermission(authentication, request)")
// 异常处理器
.and()
.exceptionHandling()
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler)
// 配置自定义的过滤器
.and()
.addFilter(jwtAuthenticationFilter())
;
;
}
项目中还使用了xxl-job作为定时任务,xxl-job核心配置类如下所示
@Slf4j
@Configuration
public class XxlJobConfig {
// private Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.port}")
private int port;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init.");
// registry jobhandler
// XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanMethodJobHandler());
// init executor
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
// xxlJobSpringExecutor.setAddress(address);
// xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
// xxlJobSpringExecutor.setLogPath(logPath);
// xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
jwt令牌权限过滤器代码如下所示
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String jwt = request.getHeader(jwtUtils.getHeader());
if (isPathWithoutAuthentication(request.getRequestURI())) {
chain.doFilter(request, response);
return;
}
Claims claim = jwtUtils.getClaimsByToken(jwt);
if (claim == null) {
request.setAttribute("jwtExceptionMessage","token 异常");
throw new JwtException("token 异常");
}
if (jwtUtils.isTokenExpired(claim)) {
request.setAttribute("jwtExceptionMessage","token 已过期");
throw new JwtException("token 已过期");
}
String username = claim.getSubject();
Object tokenIn = redisUtil.get(RedisKeyUtil.getRedisKeyOfGetToken(username));
if (tokenIn!=null&&!tokenIn.toString().equals(jwt)){
request.setAttribute("jwtExceptionMessage","用户已在其他地方登录");
throw new JwtException("用户已在其他地方登录");
}
UserPo userPo = userService.findByUsername(username);
// 构建UsernamePasswordAuthenticationToken,这里密码为null,是因为提供了正确的JWT,实现自动登录
log.info("登录的用户是:"+username);
UsernamePasswordAuthenticationToken token =
new UsernamePasswordAuthenticationToken(username,
null, userDetailService.getUserAuthority(userPo.getId()));
token.setDetails(userPo.getId());
SecurityContextHolder.getContext().setAuthentication(token);
chain.doFilter(request, response);
}
![img](file:///C:/Users/Administrator/AppData/Roaming/Tencent/Users/491650652/QQ/WinTemp/RichOle/{6$AZ@82F@M685V2X@6]}}D.png)
用户端页面如下图所示,采用的是app的形式展示,使用Hbuilder作为开发工具开发,个人觉得uniapp的语法和vue的语法极其相似=_=
用户端有秒杀的功能,使用了redis缓存秒杀数据,同时使用了rabbitmq作为消息队列。在首页的推荐中,使用的是基于物品的协同过滤算法。
登录页面包括用户名密码登录和邮箱验证码登录,邮箱验证码使用到的是springmail技术。
redis核心配置类代码如下所示
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer); // key的序列化类型
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 方法过期,改为下面代码
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value的序列化类型
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
秒杀中使用了redisson锁,防止超卖现象,redisson配置类代码如下所示。
@Configuration
public class RedissonConfig {
@Value("${spring.redis.database}")
private int database;
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
@Bean(value = "redissonClient", destroyMethod = "shutdown")
public RedissonClient redissonClient() throws Exception {
Config config = new Config();
config.useSingleServer().setAddress(String.format("redis://%s:%s", this.host, this.port));
if (!this.password.isEmpty()) {
config.useSingleServer().setPassword(this.password);
}
config.useSingleServer().setDatabase(this.database);
StringCodec codec = new StringCodec();
config.setCodec(codec);
return Redisson.create(config);
}
}
以上是用户端买家的各个功能的部分截图,时间原因不一一阐述。
最后是商家端App,商家端App主要功能有数据台查看,店铺管理,商品管理,订单管理,以及参加秒杀活动的管理。商家端效果图如下所示。
以上是基于Springboot的助农服务项目的介绍,运用到的技术和技术栈主要有springboot、mybaits、mybatisplus、redis、rabbitmq、elasticsearch、springsecurity、jwt令牌、springmail等等,同时自定义了一个基于物品的协同过滤算法,给用户做推荐。数据库使用的是mysql数据库,表设计有26张。
以上项目是本人自己设计编写的,如需源码请联系微信:wsjcql