项目实践笔记。

项目来自编程导航知识星球 | 鱼皮的编程宝典 (codefather.cn)

注意事项

一定要提前检查node,npm等的版本和源,不然可能会出现很多问题。

如果视频教程里和文档里写的不一样,请以文档里的为标准,不要抄视频里的代码。

二八定律:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的。

企业做项目流程

  1. 需求分析。
  2. 设计(概要设计、详细设计)。
  3. 技术选型。
  4. 初始化 / 引入需要的技术。
  5. 写 Demo。
  6. 写代码(实现业务逻辑)。
    • 先做设计
    • 代码实现
    • 持续优化
  7. 测试(单元测试)。
  8. 代码提交 / 代码评审。
  9. 部署。
  10. 发布。

初始化项目

  • 官方模板。
  • Github代码。
  • IDEA等工具生成。

项目模板瘦身

  • 移除国际化。
  • 移除测试用代码。
  • 规整项目目录:
    • 删除不必要的目录,如 前后端分离项目,后端删除static等前端的文件。
    • 新建目录,如model,utils,service等。

数据库设计

  • 不一定要在刚开始的时候就把所有字段都想好,可以后续补充,盲目添加字段容易过度设计。
  • 常用字段
    • create_time 创建时间(数据插入时间)datetime
    • update_time 更新时间(数据更新时间)datetime
    • is_delete 是否删除 0 1(逻辑删除)tinyint
  • 经典数据库列名是带_(下划线)的

编写接口

  • restful接口形式:
    1. 接收参数
    2. 请求类型(POST、GET)
    3. 请求体(JSON)
    4. 返回值
  • 注意鉴权。

控制层封装请求

对参数本身进行校验,而不涉及业务逻辑。

前后端优化

  1. 通用返回对象,给对象添加补充信息。类似于

    1
    2
    3
    4
    5
    6
    7
    {
    "code": 0, //业务状态码
    "data": {
    //对象内容
    },
    "msg": //返回信息
    }
  2. 封装全局异常处理

    • 定义业务异常类
    • 编写全局异常处理器
  3. !!!做优化前一定要先规范传参形式,否则前后端匹配会非常麻烦,坑巨多!!!

多环境

  1. 本地环境
  2. 开发环境
  3. 测试环境
  4. 预发布环境
  5. 正式环境
  6. 沙箱环境/实验环境

跨域问题解决

浏览器为了用户的安全,仅允许向 同域名、同端口 的服务器发送请求。

如何解决跨域?

最直接的方式:把域名、端口改成相同的

添加跨域头

让服务器告诉浏览器:允许跨域(返回 cross-origin-allow 响应头)

1. 网关支持(Nginx)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 跨域配置
location ^~ /api/ {
proxy_pass http://127.0.0.1:8080/api/;
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers '*';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}

2. 修改后端服务

  • 配置 @CrossOrigin 注解

  • 添加 web 全局请求拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Configuration
    public class WebMvcConfg implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
    //设置允许跨域的路径
    registry.addMapping("/**")
    //设置允许跨域请求的域名
    //当**Credentials为true时,**Origin不能为星号,需为具体的ip地址【如果接口不带cookie,ip无需设成具体ip】
    .allowedOrigins("http://localhost:9527", "http://127.0.0.1:9527", "http://127.0.0.1:8082", "http://127.0.0.1:8083")
    //是否允许证书 不再默认开启
    .allowCredentials(true)
    //设置允许的方法
    .allowedMethods("*")
    //跨域允许时间
    .maxAge(3600);
    }
    }
  • 定义新的 corsFilter Bean,参考:https://www.jianshu.com/p/b02099a435bd

查漏补缺

  • java依赖注入
  • impl
    在Java开发中,通常将后台分成几层,常见的是三层mvc:model、view、controller,模型视图控制层三层,而impl通常处于controller层的service下,用来存放接口的实现类,impl的全称为implement,表示实现的意思。
    impl用于实现接口

    2019022617091046

    java中impl作用-CSDN博客

  • QueryWrapper
    queryWrapper是mybatis plus中实现查询的对象封装操作类,他的层级关系如下

    20181001173726837

    mybatis plus 条件构造器queryWrapper学习_querywapper是什么-CSDN博客

    大致可以看成是构建一个sql语句,如何再用这个语句去查询,由这个类来帮我们构建语句。

  • Matcher

  • final

  • 开箱错误

  • userService

  • 注解

  • @Data

  • mock

  • 泛型

  • java程序中加上Serializable的作用

  • java中大写的类型和小写的类型的的区别,如Integer和int

  • java强转

  • 类、接口、枚举、注解区别

  • java类的结构

  • super

  • \

  • ts import里加{}

  • JUC和JVM

  • netstat -ntlp命令
    可以查看哪些端口被哪些进程占用了。

  • ps -ef命令
    可以查看运行的进程的用户,和进程的pid。

  • vim /etc/profile

    1
    export PATH=$PATH:/root/software/apache-maven-3.9.6/bin

配置环境变量,不同环境变量间用:分隔

  • source /etc/profile
    刷新环境变量

  • java -jar .\user_center-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    这样子可以指定prod环境运行
    对应src/resources/application-prod.yml

  • jobs 命令
    用于查看正在执行的后台进程,但只能看当前终端生效的进程,如果关闭当前终端后,在另一个终端下,jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)。