基于JavaSpringBootvuenode

作者主页: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 */@RestControllerpublic class SysLoginController extends AbstractController {@Autowiredprivate SysUserService sysUserService;@Autowiredprivate SysUserTokenService sysUserTokenService;@Autowiredprivate 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();}}

服务层实现:

/** * 系统用户 * * @author admin */@Service("sysUserService")public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> implements SysUserService {@Autowiredprivate SysUserRoleService sysUserRoleService;@Autowiredprivate SysRoleService sysRoleService;@Overridepublic 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);}@Overridepublic List queryAllPerms(Long userId) {return baseMapper.queryAllPerms(userId);}@Overridepublic List queryAllMenuId(Long userId) {return baseMapper.queryAllMenuId(userId);}@Overridepublic SysUserEntity queryByUserName(String username) {return baseMapper.queryByUserName(username);}@Override@Transactionalpublic 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@Transactionalpublic 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());}@Overridepublic void deleteBatch(Long[] userId) {this.removeByIds(Arrays.asList(userId));}@Overridepublic 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("新增用户所选角色,不是本人创建");}}}

权限控制:

/** * Shiro配置 * * @author admin  */@Configurationpublic 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;    }}

全局配置:

# Tomcatserver:  tomcat:    uri-encoding: UTF-8    max-threads: 1000    min-spare-threads: 30  port: 8080  connection-timeout: 5000ms  servlet:    context-path: /renren-fastspring:  # 环境 dev|test|prod  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#mybatismybatis-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,通过断电调试发现用户信息为空数据项,在前端保存时,必须填写用户完整的相关信息或者数据库设置字段可以为空,这样就可以解决。 我学习编程的主要目的是提高程序解决实际问题的关键技能和技巧。

源码获取: