[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-8PikYMQU":3,"public-project-articles-8PikYMQU":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},771,"8PikYMQU",49,"03. Springboot3框架的快速搭建以及项目工程的讲解","## 编程软件\n\nIDEA2023 以上的版本、Maven3.8、JDK21\n\n\n\n**学习 SpringBoot3 的基础必备知识： JavaSE、JavaWeb**\n\n## 创建 SpringBoot 工程\n\n### 新建 SpringBoot3 工程\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740114952572-3a6e35c2-b75f-4ebf-9e13-e52cd0b99c9e.png)\n\n### 删除无用的文件\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740115158908-2002d33f-cf76-4cf9-b7dc-112686f6620c.png)\n\n删除 test 目录\n\n删除 resources 里面的 static 和 template 文件夹\n\n删除 pom.xml 里面的无用依赖\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740115427791-95156ac2-91ea-4850-bbff-4fb81324c5e5.png)\n\n### 配置 maven\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740115304998-3b6b07b7-34c8-44a3-adcb-035098c70494.png)\n\n\n\n### 代码结构分析\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740115458112-2d472c4f-71b3-48b7-a733-2bd348b8231b.png)\n\n.idea: idea 软件的配置文件（不用管它）\n\nsrc：源码的目录\n\nSpringbootApplication： 工程的启动类\n\napplication.yml：Springboot 的配置文件\n\ntarget：源码编译后的文件目录（可以忽略）\n\npom.xml：定义 Springboot 工程的所有依赖项，springboot 加载的时候会扫描这个文件里面所有的依赖项，然后下载\n\n\u003Cfont style=\"color:#bcbec4;background-color:#1e1f22;\">\u003C\u002Ffont>\n\n**Springboot 里面内置了 Tomcat**\n\n\n\napplication.properties -> application.yml\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740115769733-9117dd58-00e4-49c4-ae16-55eda08f207b.png)\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740115748844-0c7320f6-7e3a-4c3b-980c-6f8e44aca706.png)\n\n### 重新打开 code2025 目录\n\n同时加载 springboot 和 vue\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740116090308-2de64089-8edf-49bf-82a9-c4bdbf059706.png)\n\n选择  pom.xml 然后加载依赖\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740116119634-0406c654-ac74-4750-9678-4831a59a6962.png)\n\n### 设置编码\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740116189339-7da82ed2-4d0f-4bc2-a1fc-e646884b4e82.png)\n\n\n\n### 启动 Springboot 工程\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740116279813-a0af53c8-2b92-4d02-aa9e-1ce7db7ba80c.png)\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740116305248-7170fcf8-172d-40c9-8a13-e8a64b422952.png)\n\n\n\n## 写一个测试接口 say: hello\n\n```java\npackage com.example.controller;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class WebController {\n\n    \u002F\u002F  表示这是一个 get请求的接口\n    @GetMapping(\"\u002Fhello\") \u002F\u002F 接口的路径，全局唯一的\n    public String hello() {\n        return \"hello青哥哥\";  \u002F\u002F 接口的返回值\n    }\n\n}\n```\n\n\n\n**修改完代码后记得重启后端**\n\n****\n\n**\u003Cfont style=\"color:#DF2A3F;\">404\u003C\u002Ffont>** **：就是根据路径没请求到接口数据**\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740116750470-5418b566-83c5-42e7-a885-020bb5088506.png)\n\n## 学会看网络请求\n\n按 F12 或者  在页面右键打开检查就可以看到控制台\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740117031675-ccd552e7-b5c2-448a-a651-b5e11dcc97f1.png)\n\n## 统一返回包装类 Result\n\n> **\u003Cfont style=\"color:#DF2A3F;\">包装类：作用是统一后端返回的数据类型，code 是作为前端判断请求成功的依据，msg 是错误的信息，data 是返回给前端的数据\u003C\u002Ffont>**\n\n```java\npackage com.example.common;\n\npublic class Result {\n    private String code;\n    private Object data;\n    private String msg;\n\n    public static Result success() {\n        Result result = new Result();\n        result.setCode(\"200\");\n        result.setMsg(\"请求成功\");\n        return result;\n    }\n\n    public static Result success(Object data) {\n        Result result = new Result();\n        result.setCode(\"200\");\n        result.setData(data);\n        result.setMsg(\"请求成功\");\n        return result;\n    }\n\n    public static Result error(String msg) {\n        Result result = new Result();\n        result.setCode(\"500\");\n        result.setMsg(msg);\n        return result;\n    }\n\n    public static Result error(String code, String msg) {\n        Result result = new Result();\n        result.setCode(code);\n        result.setMsg(msg);\n        return result;\n    }\n\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public Object getData() {\n        return data;\n    }\n\n    public void setData(Object data) {\n        this.data = data;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n}\n\n```\n\n## 500 错误：常见的系统的错误\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740117884684-536f9c95-ea02-4ed0-90ed-0ecf5ffc7f03.png)\n\n**抛出这些错误非常不友好，我们应该使用统一的处理方式**\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740118311483-ffb76bc5-5ad2-4d58-89d9-05f4b55ca3a7.png)\n\n## 全局异常处理\n\nGlobalExceptionHandler\n\n```java\npackage com.example.exception;\n\nimport com.example.common.Result;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\n\u002F**\n * 全局异常捕获器\n *\u002F\n@ControllerAdvice(\"com.example.controller\")\npublic class GlobalExceptionHandler {\n    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);\n\n    @ExceptionHandler(Exception.class)\n    @ResponseBody \u002F\u002F 将result对象转换成 json的格式\n    public Result error(Exception e) {\n        log.error(\"系统异常\", e);\n        return Result.error(\"系统异常\");\n    }\n\n}\n```\n\n## 系统异常怎么办？\n\n你得看你的控制台，然后找到报错的代码位置，具体地去修正代码\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740118460251-a55bea00-6696-4c04-9f8d-fa39e40e017f.png)\n\n## 自定义异常\n\nCustomException\n\n```java\npackage com.example.exception;\n\n\u002F**\n * 自定义异常\n * 运行时异常\n *\u002F\npublic class CustomerException extends RuntimeException {\n    private String code;\n    private String msg;\n\n    public CustomerException(String code, String msg) {\n        this.code = code;\n        this.msg = msg;\n    }\n\n    public CustomerException(String msg) {\n        this.code = \"500\";\n        this.msg = msg;\n    }\n\n    public CustomerException() {}\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n}\n\n```\n\n\n\n## 最终版全局异常\n\n```java\npackage com.example.exception;\n\nimport com.example.common.Result;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\n\u002F**\n * 全局异常捕获器\n *\u002F\n@ControllerAdvice(\"com.example.controller\")\npublic class GlobalExceptionHandler {\n    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);\n\n    @ExceptionHandler(Exception.class)\n    @ResponseBody \u002F\u002F 将result对象转换成 json的格式\n    public Result error(Exception e) {\n        log.error(\"系统异常\", e);\n        return Result.error(\"系统异常\");\n    }\n\n    @ExceptionHandler(CustomerException.class)\n    @ResponseBody \u002F\u002F 将result对象转换成 json的格式\n    public Result customerError(CustomerException e) {\n        log.error(\"自定义错误\", e);\n        return Result.error(e.getCode(), e.getMsg());\n    }\n\n}\n```\n\n## 测试自定义异常\n\ncontroller 测试接口\n\n```java\n@GetMapping(\"\u002Fadmin\")\npublic Result admin(String name) {\n    String admin = adminService.admin(name);\n    return Result.success(admin);\n}\n```\n\nservice\n\n```java\npackage com.example.service;\n\nimport com.example.exception.CustomerException;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class AdminService {\n\n    public String admin(String name) {\n        if (\"admin\".equals(name)) {\n            return \"admin\";\n        } else {\n            throw new CustomerException(\"账号错误\");\n        }\n    }\n\n}\n```\n\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2025\u002Fpng\u002F751015\u002F1740119126875-e2e12fed-8d28-41aa-bf0f-8b72b58afa6d.png)\n\n","coding",1,12768,1517,"2025-02-21 17:21:51","2026-05-03 22:49:02","带小白做毕设2025系列课程","graduation-project-2025",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,28,35,42,43,50,57,64,71,78,85,92,99,106,113,120,127,134,141,148,155],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":25,"created_at":26,"updated_at":27,"project_title":15,"project_slug":16},766,"XmlcAcY0","00. 带小白做毕设2025课程介绍",19012,1512,"2025-02-22 15:29:01","2026-05-07 15:33:28.189425+00",{"id":29,"uuid":30,"project_id":6,"title":31,"type":9,"status":10,"public_enabled":10,"views":32,"sort":33,"created_at":34,"updated_at":14,"project_title":15,"project_slug":16},767,"nmjXCdVH","01. 前端Vue3 框架的快速搭建以及项目工程的讲解",15797,1513,"2025-02-13 17:13:40",{"id":36,"uuid":37,"project_id":6,"title":38,"type":9,"status":10,"public_enabled":10,"views":39,"sort":40,"created_at":41,"updated_at":14,"project_title":15,"project_slug":16},768,"pMdPrVeH","02. 使用Vue3集成Element-Plus快速搭建一个管理系统的页面框架",15959,1514,"2025-02-14 11:25:07",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},{"id":44,"uuid":45,"project_id":6,"title":46,"type":9,"status":10,"public_enabled":10,"views":47,"sort":48,"created_at":49,"updated_at":14,"project_title":15,"project_slug":16},772,"Q1TCG9Jj","04. Springboot3整合MyBatis实现数据库操作",11144,1518,"2025-03-07 15:50:30",{"id":51,"uuid":52,"project_id":6,"title":53,"type":9,"status":10,"public_enabled":10,"views":54,"sort":55,"created_at":56,"updated_at":14,"project_title":15,"project_slug":16},773,"De7YPnEc","05. Springboot3+vue3实现增删改查、分页查询、批量删除（上）",10827,1519,"2025-02-22 15:09:19",{"id":58,"uuid":59,"project_id":6,"title":60,"type":9,"status":10,"public_enabled":10,"views":61,"sort":62,"created_at":63,"updated_at":14,"project_title":15,"project_slug":16},774,"YKEHfsPd","06. Springboot3+vue3实现增删改查、分页查询、批量删除（下）",7760,1520,"2025-02-22 22:00:02",{"id":65,"uuid":66,"project_id":6,"title":67,"type":9,"status":10,"public_enabled":10,"views":68,"sort":69,"created_at":70,"updated_at":14,"project_title":15,"project_slug":16},775,"sNDKpWVJ","07. Springboot3+Vue3实现excel批量导入导出",6552,1521,"2025-02-23 10:49:24",{"id":72,"uuid":73,"project_id":6,"title":74,"type":9,"status":10,"public_enabled":10,"views":75,"sort":76,"created_at":77,"updated_at":14,"project_title":15,"project_slug":16},776,"1uMP9O6C","08. Springboot3+vue3实现登录注册功能",7964,1522,"2025-02-23 18:14:13",{"id":79,"uuid":80,"project_id":6,"title":81,"type":9,"status":10,"public_enabled":10,"views":82,"sort":83,"created_at":84,"updated_at":14,"project_title":15,"project_slug":16},777,"WahvQp1v","09. Springboot3+vue3实现JWT登录鉴权",7151,1523,"2025-02-23 21:58:00",{"id":86,"uuid":87,"project_id":6,"title":88,"type":9,"status":10,"public_enabled":10,"views":89,"sort":90,"created_at":91,"updated_at":14,"project_title":15,"project_slug":16},778,"QFFAqZh1","10. Springboot3+vue3实现文件上传和下载",6171,1524,"2025-02-24 14:16:27",{"id":93,"uuid":94,"project_id":6,"title":95,"type":9,"status":10,"public_enabled":10,"views":96,"sort":97,"created_at":98,"updated_at":14,"project_title":15,"project_slug":16},1278,"S2eL2g5L","11. Springboot3+vue3实现个人中心、修改密码",5945,1525,"2025-02-24 18:10:59",{"id":100,"uuid":101,"project_id":6,"title":102,"type":9,"status":10,"public_enabled":10,"views":103,"sort":104,"created_at":105,"updated_at":14,"project_title":15,"project_slug":16},1279,"LkN8Mmsn","12. Springboot3+Vue3实现系统公告功能",4967,1526,"2025-02-25 11:50:13",{"id":107,"uuid":108,"project_id":6,"title":109,"type":9,"status":10,"public_enabled":10,"views":110,"sort":111,"created_at":112,"updated_at":14,"project_title":15,"project_slug":16},1280,"i7wziuEN","13. Springboot3+Vue3实现角色权限控制",4446,1527,"2025-02-25 11:51:38",{"id":114,"uuid":115,"project_id":6,"title":116,"type":9,"status":10,"public_enabled":10,"views":117,"sort":118,"created_at":119,"updated_at":14,"project_title":15,"project_slug":16},1281,"pGwiTCRn","14. Springboot3+Vue3实现富文本编辑器功能",4578,1528,"2025-02-26 16:04:58",{"id":121,"uuid":122,"project_id":6,"title":123,"type":9,"status":10,"public_enabled":10,"views":124,"sort":125,"created_at":126,"updated_at":14,"project_title":15,"project_slug":16},1282,"tZ8iDql5","15. Springboot3+Vue3实现模块之间的关联",4454,1529,"2025-02-26 18:28:55",{"id":128,"uuid":129,"project_id":6,"title":130,"type":9,"status":10,"public_enabled":10,"views":131,"sort":132,"created_at":133,"updated_at":14,"project_title":15,"project_slug":16},1283,"gb01JPC2","16. Springboot3+Vue3实现echarts数据统计",4307,1530,"2025-03-03 16:58:21",{"id":135,"uuid":136,"project_id":6,"title":137,"type":9,"status":10,"public_enabled":10,"views":138,"sort":139,"created_at":140,"updated_at":14,"project_title":15,"project_slug":16},1284,"59bDkSFf","17. Springboot3+Vue3实现提交审核业务功能",3793,1531,"2025-03-04 11:58:16",{"id":142,"uuid":143,"project_id":6,"title":144,"type":9,"status":10,"public_enabled":10,"views":145,"sort":146,"created_at":147,"updated_at":14,"project_title":15,"project_slug":16},1285,"gApyb58X","18. Springboot3+Vue3实现预约审核业务功能",3332,1532,"2025-03-05 20:07:24",{"id":149,"uuid":150,"project_id":6,"title":151,"type":9,"status":10,"public_enabled":10,"views":152,"sort":153,"created_at":154,"updated_at":14,"project_title":15,"project_slug":16},1286,"XfpY5re0","19. Springboot3+Vue3实现前台首页的设计",3508,1533,"2025-03-05 20:08:12",{"id":156,"uuid":157,"project_id":6,"title":158,"type":9,"status":10,"public_enabled":10,"views":159,"sort":160,"created_at":161,"updated_at":14,"project_title":15,"project_slug":16},1287,"BnSPRBOc","20. Springboot3+Vue3实现前台轮播图和详情页的设计",4062,1534,"2025-03-17 17:13:36"]