Project Experiment: DRP Web Application


概述

xxx进销存信息管理系统是笔者在大学期间跟随老师为当地企业完成的一个 web 项目,本文主要对该项目做一个总结。

1、需求分析

接到项目后,我们首先根据企业方提供的资料,分析该企业内部相关的业务需求,将系统总体划分为多个模块,作为一个比较典型的中小型企业后台系统,它主要包括了以下几个方面:公司相关信息管理、原材料和产品管理、仓库管理、客户及售后服务管理、销售管理、财务管理、权限管理。

将系统拆分为多个模块后,我们开始设计数据库,和其他系统有些不同的是,该系统要求员工并不能直接登录该系统,而是由管理员指定特定的员工,为其分配权限后,该员工才可以登录系统,所以我们的员工信息和权限用户信息是分开存储的。

2、技术选型

进行了需求分析后,笔者和同学商量了一下,决定采用当前流行的前后端分离开发模式,由于系统是多个模块的,所以采用了微服务的架构,简单的模块可以由一个人进行开发,复杂模块由多人协作开发。

人员分配:后端 4 人、前端 2 人。

版本控制工具:Git

文档:Swagger(升级方案:knife4j)

后端构建工具:Maven

后端技术选型:

  • Spring Cloud Hoxton.SR9
  • Spring Cloud Alibaba 2.2.6.RELEASE
  • Spring Boot 2.3.2.RELEASE
  • 数据库:MySQL 8.0+
  • ORM:Mybatis、Mybatis-Plus、Durid
  • Spring Security
  • 日志:Logback

使用 Maven 来构建整个项目的时候,也有几个注意点:

  • 项目是多模块的,可以使用聚合工程的架构;
  • 对模块的划分需要上点心,尽量减少冗余的依赖;
  • 依赖冲突问题需要解决(可以使用 Maven Helper 插件查看依赖冲突)

前端技术选型:

  • Vue、Vuex、Vue-Router
  • 二开框架:vue-element-admin(感谢 PanJiaChen 大佬提供的开源框架)

后端部分

1、数据库方面

平时我们学习数据库的理论知识时,学的比较全面,而在实际开发的时候,我们主要使用的是其中一部分知识,有时候甚至会违背某些规则(笔者并非专业的数据库相关人员,下面是个人观点)。

(1)比如说各种范式,它们的主要目的是为了减少数据冗余,使数据库结构更加合理,但是在实际开发中一些冗余是不可避免的(这也体现了小团队的局限性,大公司都有专业的数据库设计人员),我们只能尽量将数据库设计的合理一些;

(2)在编写 SQL 的时候,程序员的某些需求 MySQL 的函数已经帮我们实现了,要多看官方文档,比如说字符串和日期的相互转换(格式化)、字符串的处理、流程控制、正则表达式、NULL 的判断等等;

(3)SQL 语句的优化问题(特别是表联结相关的),这些网上已经很多了,要多加学习;

(4)索引的设计,网上也很多;

(5)存储引擎相关的知识也要去学;

2、ORM 工具

笔者在该项目的中使用的是 Mybatis-Plus,它极大的提高了开发效率,但是也有一些问题需要注意:

(1)不要过度依赖 Mp,有些时候一定要编写 SQL 语句,在单表操作时使用 Mp 比较高效,涉及到多个表就需要手动编写 SQL,手动编写具备很多优势;

(2)在 MVC 模式中,如果直接使用 Mp 一条路走下去,就暴露了我们的数据库实体模型,直接是面向数据库表编程,有些内部的逻辑是不必要暴露的;现阶段笔者认为既然我们还在 MVC 的模式中,不妨对 Model 层做一些扩展,针对不同的业务场景构建不同的模型,不过这样也带来了一些问题,这些模型的管理和扩展需要想一想如何解决,特别是随着业务的增加,模型层会变得越来越复杂,难以管理。(近年大家开始关注 DDD 了,这也是一个值得研究的领域);

(3)Mp 提供的很多方便的功能,比如逻辑删除、乐观锁、自动填充,都是在我们使用 Mp 提供的相关 API 才可以生效的,自己编写的 SQL 语句不会应用这些功能,这一点需要注意。

3、Spring 生态

在 Java EE 生态中 Spring 占据了重要的一席,我们现在使用的 Spring MVC、Spring Boot、Spring Security、Spring Data 等框架都是根据 Spring 来构建的,搞懂 Spring 对我们 Java 程序员来说是必经之路。

Spring

目前笔者在做项目时最明显的和 Spring 框架相关联的地方大概就是向容器中注入 Bean 了,下面举出笔者个人的一些想法:

(1)Bean 的生命周期我们要捋清楚;

(2)Spring 容器的分层、容器的刷新、容器的生命周期;

(3)后置处理器的用法要搞懂;

(4)BeanFactoryApplicationContext 两种体系需要弄清楚;

(5)相关的接口作用要弄明白:xxxAwarexxxCapable 等接口

Spring Data

Spring Data 相关框架为 Spring 工程提供数据访问支持,里面封装的各种工具能够很方便的让我们操作数据库,例如笔者在本项目中使用了 JDBC、Redis,只需导入对应的 stater 即可。

另一方面 Spring 框架还提供了比较全面的事务管理机制,这一点是我们开发人员需要注意的,在不同的业务场景下定制不同的事务规则能够很好的提高系统性能。

  • 举笔者做的这个项目而言,系统的用户不多,对于系统性能没有非常严格的要求,所以我们在处理某些业务时,可以提高隔离级别来保证数据的一致性,在生成报表的时候改变一下事务的传播机制,保证报表数据的准确;
  • 大多时候开发人员需要根据业务在系统性能和数据一致性之间进行一个取舍,找到合适的事务机制是我们应该做的。

Spring MVC

在深入学习 Spring MVC 之前,建议一定要先搞明白 Servlet 体系,然后再看看 Spring MVC 对 Servlet 的扩展,对于该框架,笔者目前也有一些看法:

(1)Spring MVC 引入的 Spring 容器是如何和原生 Web Application 联系起来的;

(2)前端控制器 DispatcherServlet 的生命周期及构建过程;

(3)Spring MVC 处理请求的过程要清楚;

(4)九大组件的作用;

(5)过滤器、拦截器、监听器的作用和原理。

目前笔者进行开发时主要还是和 Spring MVC 打交道,熟练使用是第一步,还需要掌握其原理,进行定制化,比如说 JSON 序列化这一块就有很多值得研究的地方。

By the way,接收参数不要 Map!不要 Map!不要 Map!开发一时爽,维护火葬场。

Spring Boot

Spring Boot 解决了过去 Spring 配置繁琐的问题,它可以看作是一个脚手架,帮助程序员快速的搭建开发环境。

Spring Boot 提供的 stater 可以看作是不同的开发环境 ,举常见的 web 为例,当我们引入了 stater-web 后,在项目启动时,Spring Boot 将该 starter 中包含的 Java 类注入到 Spring 容器中,比如说该 stater 中包含了 Servlet 相关的类、Tomcat 相关的类等等资源,Spring 容器中有了这些 Bean 后,我们才可以开发 web 应用,其他的 starter 也是同样的道理。

(1)开发人员必须清楚 Spring Boot 的装配机制,主要包括以下几点:

  • Spring Boot 提供的用于自动装配机制的相关注解;
  • 应用启动时 Spring Boot 是如何扫描各种 stater 并将相应类资源注入 Spring 容器的。

(2)Spring Boot 提供的开发环境并不能满足所有的场景,有时候我们需要将定制的类在应用启动时注入到容器中,这就需要自定义 stater 来完成相应的需求了。

Spring Security

安全框架并不多,开发人员大概也就三种选择:Shiro、Spring Security、自制安全框架。

不过得益于 Spring 生态的强大以及分布式、微服务的迅速发展,Spring Security 现在越来越受到欢迎,它能够很好的和 Spring Cloud 进行结合。

(1)首先我们需要明白 Spring Security 是通过过滤器来完成鉴权的;

(2)对 Spring Security 的各项配置其实就是定制了一系列的过滤器,最终经 Spring Security 整合为一条或多条过滤器链,再由 Spring 提供的代理过滤器将其嵌入到原生 web 过滤器链中;

(3)至于内部的鉴权机制暂时了解即可,现阶段只需做到能够配置常规的认证机制;

(4)Spring Security 另一个强大之处就在于帮助开发人员处理了许多安全问题,让我们能够专注业务。

前端部分

1、前后端交互

在本项目的开发过程中,虽然笔者主要负责后端,但是前端的权限模块也顺带做了一下,提高了对 Vue 的使用熟练度,也发现了一些前端开发人员在和后端人员在对接时需要注意的地方,比如说:

  • 前端某些页面或者对某些数据进行处理时,需要向后台发送一些数据或者从后台得到一些数据,这些数据需要抽象为各种模型,如 VO、DTO;
  • 数据的格式以及对数据的校验工作,这一块需要前后端一块处理;
  • 前端人员在实际开发前最好先把原型做出来,向后端说明需要的数据;
  • 关于系统的权限问题,在本项目中,笔者是将所有的权限交给前后端一块处理,包括页面路由和操作权限,当然也可以路由级别的权限前后端一块做,对于页面中某些操作可以交给后端进行方法级别的鉴权处理,前端不必操心。

2、Vue 技术栈

笔者认为前端最重要的两个方面是页面设计和用户交互,前者带给用户视觉享受,后者带给用户舒适的使用感。

随着现在单页面应用的盛行,一个页面代码的长度越来越长,前端人员更应该养成良好的编码习惯,多站在用户的角度上思考问题。

下面谈一谈笔者使用 Vue 相关技术进行开发时的一些感受:

  • 对于一个后台系统而言路由不要过深、过多;
  • 尽量多自定义组件,不要什么组件都向路由中注册(因为一些隐藏路由也需要注册到权限数据库中);
  • 复用组件时一定要注意页面路由的变化,及时重置数据;
  • 系统状态需要持久化,防止状态丢失(使用 js-cookie、vuex-persistence);
  • 系统状态要分多模块,不要全放在一个 store 中;
  • 要学会自定义指令、自定义插件;
  • 每个系统有自己的 UI 需求,开源的框架不一定适合所有的系统。

总结

当我们能够熟练使用上面的框架时,常规的开发已经不是什么问题了,难一点的无非就是各种各样的业务需求会要求我们使用不同的工具去实现,将这些工具整合到项目中使用就可以了。

做完了这个项目之后,笔者也发现自身的一些问题,接下来可以慢慢向这些方面努力:

  • Spring 相关框架还需要继续深耕;
  • 数据库知识也需要学习;
  • 解决并发问题的能力仍需提高;
  • 熟练掌握常用设计模式 ○| ̄|_

Author: NaiveKyo
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source NaiveKyo !
  TOC