• 【毕业设计】基于SSM的进存销管理系统 - spring mvc java web


    0 前言

    Hi,同学们好呀,被评为全网最细的丹成学长ヾ(•ω•`)o,今天带大家复盘一个学长帮往届同学做的一个毕业作品

    基于java web的进存销管理系统


    计算机毕设选题大全及项目分享:

    https://blog.csdn.net/WEB_DC/article/details/125563252


    1 项目介绍

    进销存系统是什么?

    进销存系统是为了对企业生产经营中进货、出货、批发销售、付款等全程进行(从接获订单合同开 始,进入物料采购、入库、领用到产品完工入库、交货、回收货款、支付原材料款等)跟踪(每一步都 提供详尽准确的数据)、管理(有效辅助企业解决业务管理、分销管理、存货管理、营销计划的执行和 监控、统计信息的收集等方面的业务问题)而设计的整套方案。

    2 系统功能模块

    在这里插入图片描述

    2.1 基础资料

    往来单位资料 货品资料 员工信息 仓库资料 计量单位 账户信息 公司信息 用户可以快速、直观地 查询所需要的数据资料。

    2.2 系统管理

    操作员管理 系统设置 数据初始化 系统管理是整个系统的门户,在系统的安全性上起到了不可估 量的作用。各种信息要求尽量全面详细,使管理变得更轻松更有效。

    2.3 采购管理

    新增采购订单 采购订单查询 新增采购单 采购单查询 采购退货 采购明细表 货品采购汇总表 供应商采购汇总表 采购订单完成情况 采购覆盖企业采购的各个环节。企业通过虚拟的在线货品目 录,迅速而实时的访问货品信息;通过价格和品质的比较,选定产品供应商。

    2.4 销售管理

    新增销售订单 销售订单查询 新增销售单 销售单查询 销售退货 销售明细表 货品销售汇总表 客户销售汇总表 销售订单完成情况 销售覆盖企业销售的各个环节。通过销售订单录入与变更,跟 踪管理商品销售情况;根据货品报价和销售数量自动开出销售发票,根据发货单产生结算凭证和 收货单。

    2.5 库存管理

    新增入库单 新增出库单 仓库调拨 库存盘点 期末提供了货品盘点、货品调价以及业务审核等 期末业务处理功能,业务期末结算为财务期末结算做了必要的铺垫作用。

    2.6 财务管理

    付款单 收款单 其他收入 其他支出 账户查询 应付账款表-单据 应付账款表-往来单位 应收账款 表-单据 应收账款表-往来单位

    3 技术栈

    在这里插入图片描述

    4 数据库搭建

    在这里插入图片描述
    在这里插入图片描述

    5 部分关键代码

    登陆流程

    在这里插入图片描述

    @Bean 
    public UserDetailsService userDetailsService(){ 
      return new UserDetailsService() { 
         @Override 
         public UserDetails loadUserByUsername(String username) throws 
    UsernameNotFoundException { 
            // 根据用户名查询用户记录   
            User userDetails = (User) userService.findUserByUserName(username); 
            return userDetails; 
        } 
      }; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用生效SpringSecurity 登录配置

    /** 
    * 放行静态web 资源 
    * @param web 
    * @throws Exception 
    */ 
    @Override 
    public void configure(WebSecurity web) throws Exception { 
       web.ignoring().antMatchers( 
           "/images/**", 
           "/css/**", 
           "/js/**", 
           "/lib/**", 
           "/error/**" 
      ); 
    } 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
      //禁用csrf 
      http.csrf().disable() 
         // 允许iframe 页面嵌套 
          .headers().frameOptions().disable() 
        .and() 
            .formLogin() 
              .usernameParameter("userName") 
              .passwordParameter("password") 
              .loginPage("/index") 
              .loginProcessingUrl("/login") 
              .successHandler(authenticationSuccessHandler) 
              .failureHandler(authenticationFailedHandler) 
        .and() 
            .logout() 
            .logoutUrl("/signout") 
    .deleteCookies("JSESSIONID") 
            .logoutSuccessHandler(jxcLogoutSuccessHandler) 
        .and() 
            .authorizeRequests().antMatchers("/index","/login").permitAll() 
            .anyRequest().authenticated(); 
    } 
    /** 
      配置SpringSecurity 密码加密Bean 对象 
    */ 
    @Bean 
    public PasswordEncoder encoder(){ 
    return new BCryptPasswordEncoder(); 
    } 
    /* 
     配置认证Service接口与密码加密实现类 
    */ 
    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    { 
    auth.userDetailsService(userDetailsService()).passwordEncoder(encoder()); 
    }
    
    jxc-admin pom.xml 引入Spring Security 坐标
    <!--spring security 组件--> 
    <dependency> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 
    用户登录成功,用户信息页面展示获取 
    ${(Session.SPRING_SECURITY_CONTEXT.authentication.principal.username)!'lzj'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    使用SpringSecurity 对密码进行加密

    @RequestMapping("setting") 
    public String setting(Principal principal, Model model){ 
       String userName  = principal.getName(); 
       User user = userService.findUserByUserName(userName); 
       model.addAttribute("user",user); 
       return "user/setting"; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加图片验证码

    <dependency> 
       <groupId>com.github.penggle</groupId> 
       <artifactId>kaptcha</artifactId> 
       <version>2.3.2</version> 
    </dependency> 
    @Configuration 
    @PropertySource(value = {"classpath:kaptcha.properties"}) 
    public class CaptchaConfig { 
       @Value("${kaptcha.border}") 
       private String border; 
       @Value("${kaptcha.border.color}") 
       private String borderColor; 
       @Value("${kaptcha.textproducer.font.color}") 
       private String fontColor; 
       @Value("${kaptcha.image.width}") 
       private String imageWidth; 
       @Value("${kaptcha.image.height}") 
       private String imageHeight; 
       @Value("${kaptcha.session.key}") 
       private String sessionKey; 
       @Value("${kaptcha.textproducer.char.length}") 
       private String charLength; 
       @Value("${kaptcha.textproducer.font.names}") 
       private String fontNames; 
       @Value("${kaptcha.textproducer.font.size}") 
       private String fontSize; 
       /** 
        * 自定义 验证码生成器 
        * @return 
        */ 
       @Bean(name = "captchaProducer") 
       public DefaultKaptcha getKaptchaBean(){ 
           DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); 
           //加载验证码配置 
           Properties properties = new Properties(); 
           properties.setProperty("kaptcha.border", border;
     properties.setProperty("kaptcha.border.color", borderColor
    ); 
           properties.setProperty("kaptcha.textproducer.font.color", fontColor); 
           properties.setProperty("kaptcha.image.width", imageWidth); 
           properties.setProperty("kaptcha.image.height", imageHeight); 
           properties.setProperty("kaptcha.session.key", sessionKey); 
           properties.setProperty("kaptcha.textproducer.char.length", charLength); 
           properties.setProperty("kaptcha.textproducer.font.names", fontNames); 
           properties.setProperty("kaptcha.textproducer.font.size",fontSize); 
           defaultKaptcha.setConfig(new Config(properties)); 
           return defaultKaptcha; 
      } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    控制器输出验证码

    
    @RequestMapping(value="/image",method = RequestMethod.GET) 
    public void kaptcha(HttpSession session, HttpServletResponse response) throws 
    IOException { 
       response.setDateHeader("Expires", 0); 
       response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
       response.addHeader("Cache-Control", "post-check=0, pre-check=0"); 
       response.setHeader("Pragma", "no-cache"); 
       response.setContentType("image/jpeg"); 
       //验证码文字 
       String capText = captchaProducer.createText(); 
       //将验证码存到session 
       session.setAttribute("captcha_key", 
               new CaptchaImageModel(capText,2 * 60)); 
       //将图片返回给前端 
       try(ServletOutputStream out = response.getOutputStream()){ 
           BufferedImage bufferedImage = captchaProducer.createImage(capText);  // 
    生成验证码图片 
           ImageIO.write(bufferedImage,"jpg",out); 
           out.flush(); 
      } 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    校验登录验证码

    @Component 
    public class CaptchaCodeFilter extends OncePerRequestFilter { 
       private static ObjectMapper objectMapper = new ObjectMapper(); 
       @Override 
       protected void doFilterInternal(HttpServletRequest request, 
                                       HttpServletResponse response, 
                                       FilterChain filterChain) 
               throws ServletException, IOException { 
           // 只有在登录请求时才有验证码校验 
           if(StringUtils.equals("/login",request.getRequestURI()) 
                   && StringUtils.equalsIgnoreCase(request.getMethod(),"post")){
     try{ 
                   //验证谜底与用户输入是否匹配 
                   this.validate(new ServletWebRequest(request)); 
              }catch(AuthenticationException e){ 
                   response.setContentType("application/json;charset=UTF-8"); 
                   response.getWriter().write(objectMapper.writeValueAsString( 
                           RespBean.error("验证码错误"))); 
                   //catch异常后,之后的过滤器就不再执行了 
                   return; 
              } 
          } 
           filterChain.doFilter(request,response); 
      } 
       /** 
        * 验证码 校验 
        * @param request 
        * @throws ServletRequestBindingException 
        */ 
       private void validate(ServletWebRequest request) throws 
    ServletRequestBindingException { 
           HttpSession session = request.getRequest().getSession(); 
           String codeInRequest = ServletRequestUtils.getStringParameter( 
                   request.getRequest(),"captchaCode"); 
           if(StringUtils.isEmpty(codeInRequest)){ 
               throw new SessionAuthenticationException("验证码不能为空"); 
          } 
           // 获取session中的验证码 
           CaptchaImageModel codeInSession = (CaptchaImageModel) 
                           session.getAttribute("captcha_key"); 
           if(Objects.isNull(codeInSession)) { 
               throw new SessionAuthenticationException("验证码不存在"); 
          } 
           // 校验服务器session池中的验证码是否过期 
           if(codeInSession.isExpired()) { 
               session.removeAttribute("captcha_key"); 
               throw new SessionAuthenticationException("验证码已经过期"); 
          } 
           // 请求验证码校验 
           if(!StringUtils.equals(codeInSession.getCode(), codeInRequest)) { 
               throw new SessionAuthenticationException("验证码不匹配"); 
          } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    6 系统实现效果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    计算机毕设选题大全及项目分享:

    https://blog.csdn.net/WEB_DC/article/details/125563252


    7 最后

  • 相关阅读:
    Himall商城- web私有方法
    机器学习和大数据基础数据集--免费
    【教程】微信推文怎么添加附件文档 (如word文档、excel表格、pdf文件)
    Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
    21天学会C++:Day13----动态内存管理
    运维职业规划
    路由组件构建方案(分库分表)V1
    PyCharm+PyQT5之五Widgets QT程序
    物联网ARM开发-1协议I2C
    【Spring Boot】SpringBoot 单元测试
  • 原文地址:https://blog.csdn.net/WEB_DC/article/details/125625193