• 周一. 5 月 20th, 2024

基于JavaSpringBootvuenode

admin

12 月 15, 2023 #农业资讯

作者主页:Java 李阳勇

 

简介:Java领域优质创造者,【java李阳勇】公众号作者✌简历模板、学习资料、面试题库【关注我,我全部给你】

文末获取源码联系方式

研究背景意义

我国是农业大国,农业经济在整个国民经济和社会发展中始终具有重要意义。 20世纪90年代以来,电子信息、网络通信、自动控制等信息技术在农业领域得到广泛应用。 当前,我国农业发展已从传统农业向现代农业发展。 农业信息化是利用信息技术促进农业持续稳定的过程。 及时、有效、及时地将农场信息发送给农民,实现农场生产、管理、销售信息化,提高农场管理效率。 我国历来高度重视农业发展,但一直未能跟上农业现代化的步伐。 现阶段,我国农业信息化建设尚处于起步阶段。 在政策上,我国政府在多地建设了信息农场试点。 在技​​术层面,各种农场管理系统也被开发出来并应用于各个农场。 与传感器相结合的农产品管理系统是目前应用最广泛的信息技术。 通过对农场的调查研究、数据库和农场信息管理系统的分析建立、传感器数据的处理,帮助管理者做出正确的决策。 通过传统渠道进行信息收集和查询非常繁琐、效率低下,而且时间难以把握。 在这种情况下,我决定开发一套基于Java前后端分离的在线智能农场管理系统,包括登录模块、普通用户管理、农场数据分析与展示、地块信息管理、种植计划管理、生产预警管理,由生产数据管理等模块组成,用于收集、整理和发布相关信息。 大大提高效率,缩短时间。 让大家更方便地体验和实践与传统方法完全不同的管理方法。

查看完整视频效果

主要模块设计:

农业资讯平台_农业资讯_农业资讯网/

语言技术:

开发工具:IDEA 2021.3、navicat for mysql、postman。

开发语言:java、jdk1.8、mysql5、node.js 14。

硬件环境:Windows 10操作系统、Google浏览器等

主要技术:springboot、mybatis-plus、vue、element UI、mysql等。

视频演示:计算机专业学生寒假如何充电? 功能截图:

用户输入登录地址: 输入账号密码进行登录验证

农业资讯网_农业资讯平台_农业资讯/

农场信息管理主页:首页基本介绍,可定制图文视频展示。

农业资讯网_农业资讯平台_农业资讯/

这是使用echarts树形图图标模拟来实现的。

农业资讯_农业资讯平台_农业资讯网/

用户管理:

农业资讯_农业资讯平台_农业资讯网/

农业资讯平台_农业资讯_农业资讯网/

角色菜单:

农业资讯网_农业资讯平台_农业资讯/

菜单列表:可以控制到按钮级别

农业资讯平台_农业资讯_农业资讯网/

绘图文件:

农业资讯网_农业资讯_农业资讯平台/

种植计划:

农业资讯_农业资讯网_农业资讯平台/

生产材料:

农业资讯_农业资讯平台_农业资讯网/

预警管理:

农业资讯_农业资讯平台_农业资讯网/

农业资讯平台_农业资讯_农业资讯网/

公告:

农业资讯平台_农业资讯网_农业资讯/

农业资讯平台_农业资讯网_农业资讯/

文档信息:查看上传、下载等。

农业资讯网_农业资讯平台_农业资讯/

农业资讯网_农业资讯_农业资讯平台/

论文报告:

农业资讯平台_农业资讯网_农业资讯/

农业资讯_农业资讯网_农业资讯平台/

关键源码:

用户登录:


/**
 * 登录相关
 *
 * @author lyy
 */
@RestController
public class SysLoginController extends AbstractController {
	@Autowired
	private SysUserService sysUserService;
	@Autowired
	private SysUserTokenService sysUserTokenService;
	@Autowired
	private SysCaptchaService sysCaptchaService;
	/**
	 * 验证码
	 */
	@GetMapping("captcha.jpg")
	public void captcha(HttpServletResponse response, String uuid)throws IOException {
		response.setHeader("Cache-Control", "no-store, no-cache");
		response.setContentType("image/jpeg");
		//获取图片验证码
		BufferedImage image = sysCaptchaService.getCaptcha(uuid);
		ServletOutputStream out = response.getOutputStream();
		ImageIO.write(image, "jpg", out);
		IOUtils.closeQuietly(out);
	}
	/**
	 * 登录
	 */
	@PostMapping("/sys/login")
	public Map<string, object=""> login(@RequestBody SysLoginForm form)throws IOException {
		boolean captcha = sysCaptchaService.validate(form.getUuid(), form.getCaptcha());
//		if(!captcha){
//			return R.error("验证码不正确");
//		}
		//用户信息
		SysUserEntity user = sysUserService.queryByUserName(form.getUsername());
		//账号不存在、密码错误
		if(user == null !user.getPassword().equals(new Sha256Hash(form.getPassword(), user.getSalt()).toHex())) {
			return R.error("账号或密码不正确");
		}
		//账号锁定
		if(user.getStatus() == 0){
			return R.error("账号已被锁定,请联系管理员");
		}
		//生成token,并保存到数据库
		R r = sysUserTokenService.createToken(user.getUserId());
		return r;
	}
	/**
	 * 退出
	 */
	@PostMapping("/sys/logout")
	public R logout() {
		sysUserTokenService.logout(getUserId());
		return R.ok();
	}
	
}
</string,>

 

服务层实现:


/**
 * 系统用户
 *
 * @author admin
 */
@Service("sysUserService")
public class SysUserServiceImpl extends ServiceImpl<sysuserdao, sysuserentity=""> implements SysUserService {
	@Autowired
	private SysUserRoleService sysUserRoleService;
	@Autowired
	private SysRoleService sysRoleService;
	@Override
	public PageUtils queryPage(Map<string, object=""> params) {
		String username = (String)params.get("username");
		Long createUserId = (Long)params.get("createUserId");
		IPage page = this.page(
			new Query().getPage(params),
			new QueryWrapper()
				.like(StringUtils.isNotBlank(username),"username", username)
				.eq(createUserId != null,"create_user_id", createUserId)
		);
		return new PageUtils(page);
	}
	@Override
	public List queryAllPerms(Long userId) {
		return baseMapper.queryAllPerms(userId);
	}
	@Override
	public List queryAllMenuId(Long userId) {
		return baseMapper.queryAllMenuId(userId);
	}
	@Override
	public SysUserEntity queryByUserName(String username) {
		return baseMapper.queryByUserName(username);
	}
	@Override
	@Transactional
	public void saveUser(SysUserEntity user) {
		user.setCreateTime(new Date());
		//sha256加密
		String salt = RandomStringUtils.randomAlphanumeric(20);
		user.setPassword(new Sha256Hash(user.getPassword(), salt).toHex());
		user.setSalt(salt);
		this.save(user);
		
		//检查角色是否越权
		checkRole(user);
		
		//保存用户与角色关系
		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
	}
	@Override
	@Transactional
	public void update(SysUserEntity user) {
		if(StringUtils.isBlank(user.getPassword())){
			user.setPassword(null);
		}else{
			user.setPassword(new Sha256Hash(user.getPassword(), user.getSalt()).toHex());
		}
		this.updateById(user);
		
		//检查角色是否越权
		checkRole(user);
		
		//保存用户与角色关系
		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
	}
	@Override
	public void deleteBatch(Long[] userId) {
		this.removeByIds(Arrays.asList(userId));
	}
	@Override
	public boolean updatePassword(Long userId, String password, String newPassword) {
		SysUserEntity userEntity = new SysUserEntity();
		userEntity.setPassword(newPassword);
		return this.update(userEntity,
				new QueryWrapper().eq("user_id", userId).eq("password", password));
	}
	
	/**
	 * 检查角色是否越权
	 */
	private void checkRole(SysUserEntity user){
		if(user.getRoleIdList() == null user.getRoleIdList().size() == 0){
			return;
		}
		//如果不是超级管理员,则需要判断用户的角色是否自己创建
		if(user.getCreateUserId() == Constant.SUPER_ADMIN){
			return ;
		}
		
		//查询用户创建的角色列表
		List roleIdList = sysRoleService.queryRoleIdList(user.getCreateUserId());
		//判断是否越权
		if(!roleIdList.containsAll(user.getRoleIdList())){
			throw new RRException("新增用户所选角色,不是本人创建");
		}
	}
}</string,></sysuserdao,>

 

权限控制:


/**
 * Shiro配置
 *
 * @author admin 
 */
@Configuration
public class ShiroConfig {
 @Bean("securityManager")
 public SecurityManager securityManager(OAuth2Realm oAuth2Realm) {
 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
 securityManager.setRealm(oAuth2Realm);
 securityManager.setRememberMeManager(null);
 return securityManager;
 }
 @Bean("shiroFilter")
 public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
 ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
 shiroFilter.setSecurityManager(securityManager);
 //oauth过滤
 Map<string, filter=""> filters = new HashMap<>();
 filters.put("oauth2", new OAuth2Filter());
 shiroFilter.setFilters(filters);
 Map<string, string=""> filterMap = new LinkedHashMap<>();
 filterMap.put("/webjars/**", "anon");
 filterMap.put("/druid/**", "anon");
 filterMap.put("/app/**", "anon");
 filterMap.put("/sys/login", "anon");
 filterMap.put("/swagger/**", "anon");
 filterMap.put("/v2/api-docs", "anon");
 filterMap.put("/swagger-ui.html", "anon");
 filterMap.put("/swagger-resources/**", "anon");
 filterMap.put("/captcha.jpg", "anon");
 filterMap.put("/aaa.txt", "anon");
 filterMap.put("/virtuel/**", "anon");
 filterMap.put("/**", "oauth2");
 shiroFilter.setFilterChainDefinitionMap(filterMap);
 return shiroFilter;
 }
 @Bean("lifecycleBeanPostProcessor")
 public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
 return new LifecycleBeanPostProcessor();
 }
 @Bean
 public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
 AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
 advisor.setSecurityManager(securityManager);
 return advisor;
 }
}
</string,></string,>

 

全局配置:

# Tomcat
server:
 tomcat:
 uri-encoding: UTF-8
 max-threads: 1000
 min-spare-threads: 30
 port: 8080
 connection-timeout: 5000ms
 servlet:
 context-path: /renren-fast
spring:
 # 环境 devtestprod
 profiles:
 active: dev
 # jackson时间格式化
 jackson:
 time-zone: GMT+8
 date-format: yyyy-MM-dd HH:mm:ss
 servlet:
 multipart:
 max-file-size: 100MB
 max-request-size: 100MB
 enabled: true
 mvc:
 throw-exception-if-no-handler-found: true
# resources:
# add-mappings: false
#mybatis
mybatis-plus:
 mapper-locations: classpath*:/mapper/**/*.xml
 #实体扫描,多个package用逗号或者分号分隔
 typeAliasesPackage: io.renren.modules.*.entity
 global-config:
 #数据库相关配置
 db-config:
 #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
 id-type: AUTO
 logic-delete-value: -1
 logic-not-delete-value: 0
 banner: false
 #原生配置
 configuration:
 map-underscore-to-camel-case: true
 cache-enabled: false
 call-setters-on-nulls: true
 jdbc-type-for-null: 'null'
#文件虚拟路径
virtuel:
 # filePath: D:/training/
 filePath: C:/Users/Administrator/Desktop/lyy/

 

总结:

经过最近对java面向对象编程、前端知识和JAVA框架的掌握和学习,以及这段时间这个教育教学系统的开发,我更加明白了java学习的重要性。 在开发这个系统时,我完成了土地管理平台的多次实验和功能测试。 在系统开发和学习阶段,我意识到自己熟悉了java,然后能够独立使用相关技术。 我发现确实有很多便利。 例如,java将抽象与封装、继承与多态融为一体,实现了代码重用和代码扩展,提高了整体软件开发的速度和效率。 例如管理员添加用户时,报java.lang.NullPointException。 解决办法:查看控制台打印信息,发现添加时没有填写相关信息,报java.lang.NullPointException,通过断电调试发现用户信息为空数据项,在前端保存时,必须填写用户完整的相关信息或者数据库设置字段可以为空,这样就可以解决。 我学习编程的主要目的是提高程序解决实际问题的关键技能和技巧。

源码获取: