【蒼穹外賣】Day2 手把手敲完細節

目錄

1. 新增員工

1.1 需求分析和設計

1.2 代碼開發

①定義DTO類:(在sky-pojo里)

②EmployeeController中創建新增員工方法save()

③EmployeeService里聲明save方法(alt+enter)

④EmployeeServiceImpl中實現save方法

⑤在EmployeeMapper中聲明insert方法,插入數據庫

1.3 功能測試

1.4 代碼完善

1.5 代碼提交

1.6 遇到的問題

2. 員工的分頁查詢

2.1 需求分析和設計

2.2 代碼開發

①定義DTO類

②EmployeeController中創建員工分頁查詢方法page()

③EmployeeService里聲明pageQuery方法

④?EmployeeServiceImpl中實現pageQuery方法

⑤在EmployeeMapper中聲明pageQuery方法,插入數據庫

2.3 功能測試

2.4?代碼完善

2.5 代碼提交

3. 啟用禁用員工賬號

3.1 需求分析和設計?編輯

3.2 代碼開發

3.3 功能測試

?4. 編輯員工

4.1 需求分析和設計

?4.2?代碼開發

?4.3 功能測試-成功

5. 導入分類模塊功能

5.1 需求分析和設計

5.2 代碼導入

5.3 功能測試


1. 新增員工

步驟:需求分析和設計(產品原型→接口設計→數據庫設計)→代碼開發

1.1 需求分析和設計

產品原型:

當填寫完表單信息, 點擊"保存"按鈕后, 會提交該表單的數據到服務端, 在服務端中需要接受數據, 然后將數據保存至數據庫中。

請求方式:post,由于需要提交員工信息,post可以攜帶json數據

請求參數:json數據

返回數據:響應碼,數據,攜帶錯誤信息等..

接口設計:

?其實就是把頁面中錄入的員工數據打包成json格式插入emplyee表。

數據庫設計(emplyee表)

紅框中就是頁面輸入的數據?

1.2 代碼開發

當前端提交的數據和實體類中對應的屬性差別比較大時,建議使用DTO來封裝數據。

①定義DTO類:(在sky-pojo里)
 @Data
public class EmployeeDTO implements Serializable {private Long id;private String username;private String name;private String phone;private String sex;private String idNumber;}
EmployeeController中創建新增員工方法save()

Springboot是面向注解開發,所以注意添加如下注解

EmployeeService里聲明save方法(alt+enter)

/**后面直接回車補全注釋

.var快捷創建一個對象

/*** 新增員工* @param employeeDTO*/void save(EmployeeDTO employeeDTO);
④EmployeeServiceImpl中實現save方法

使用了對象屬性拷貝的方式進行了強制對象轉換。

具體來說,這里使用了Spring框架中的BeanUtils類的靜態方法copyProperties來將EmployeeDTO對象的屬性值復制到Employee對象中。這種方式可以視作一種強制對象轉換,因為它將兩個不同類的對象之間的屬性進行了映射和復制,從而實現了數據的傳遞和轉換。

    public void save(EmployeeDTO employeeDTO) {Employee employee = new Employee();//對象屬性拷貝,除了拷貝的屬性相同,其他的屬性都要自己設置BeanUtils.copyProperties(employeeDTO, employee);//設置賬號的狀態,默認正常狀態 1表示正常 0表示鎖定(放在常量類里方便維護可復用)employee.setStatus(StatusConstant.ENABLE);//設置密碼,默認密碼123456(md5加密后再存儲)employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));//設置當前記錄的創建時間和修改時間employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//設置當前記錄創建人id和修改人id//TODO 后期需要修改為當前登錄用戶的idemployee.setCreateUser(10L);//目前寫個假數據,后期修改employee.setUpdateUser(10L);employeeMapper.insert(employee);//后續步驟定義}
⑤在EmployeeMapper中聲明insert方法,插入數據庫
/*** 插入員工數據* @param employee*/@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +"values " +"(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")void insert(Employee employee);

表的字段和屬性是一一對應,表的屬性采用駝峰命名法(在server的配置文件application.yml中)

mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.sky.entityconfiguration:#開啟駝峰命名map-underscore-to-camel-case: true

1.3 功能測試

兩種方法:接口文檔(主要)、前后端聯調(需要前端開發好)

我們上期講到,接口文檔是由Swagger規范生成,由注解來修飾具有更好可讀性的文檔。

首先開啟啟動類SkyAppication.java

然后打開localhost:8081/doc.html——接口文檔,開始調試,返回401

原來是存在jwt令牌校驗的攔截器

所以我們先到登錄頁面獲取令牌

?添加為全局參數

然后發送,這個時候遇到了一個500問題 ,反復確定insert SQL語句沒有錯誤后,修改發送請求與參考視頻里的一致,重新調試,成功添加

前后端聯調:登錄一直在加載,最終報了一個錯(504),懷疑是因為連接著接口文檔或者沒有往下運行到登錄

所以加載不出來,重新debug,成功登陸界面,添加數據成功!

1.4 代碼完善

1、要捕獲username不唯一的異常

?

debug停在獲取jwt令牌的一行,原因是2小時以后原來的token失效,重新獲取

在server的handler文件中添加exceptionhandler:

    @ExceptionHandlerpublic Result exceptionHandler(SQLIntegrityConstraintViolationException ex){//Duplicate entry 'zhangsan' for key 'employee.idx_username'//我們希望當重復時,提示xx重復String message = ex.getMessage();if(message.contains("Duplicate entry")){String[] sp = message.split(" ");String username = sp[2];//String msg = username + "已存在";String msg = username + MessageConstant.ALREADY_EXISTS;return Result.error(msg);}else {return Result.error(MessageConstant.UNKNOWN_ERROR);}}

修改之后,異常被捕獲,作出響應?

2、創建員工save方法里的創建人和修改人是固定寫死的,即

        //TODO 后期需要修改為當前登錄用戶的idemployee.setCreateUser(10L);//目前寫個假數據,后期修改employee.setUpdateUser(10L);

我們需要的user_id就在攔截的token里面,需要進行解析

        //1、從請求頭中獲取令牌String token = request.getHeader(jwtProperties.getAdminTokenName());//2、校驗令牌try {log.info("jwt校驗:{}", token);Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());log.info("當前員工id:", empId);//3、通過,放行return true;} catch (Exception ex) {//4、不通過,響應401狀態碼response.setStatus(401);return false;}

問題是解析得到了empId后,我們要如何傳遞給service的save方法?

● ThreadLocal

并不是一個線程(Thread),他是一個線程的局部變量

為每個線程提供單獨一份存儲空間,起到線程隔離的作用,只有線程內才能獲取對應的值

那么我們客戶端發出的每次請求是否對應一個線程呢?在不同的地方添加語句

System.out.println("當前線程的id:" + Thread.currentThread().getId());

可以看到都對應線程:44?

重新請求對應線程46,說明:一次請求確實對應一個線程。所以可以把id存入ThreadLocal,再在server里取出來.

ThreadLocal常用方法:set(T value), get(), remove()

我們使用ThreadLocal時往往會進行一個簡單的封裝,包裝成一個工具類common-BaseContext

public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}

添加兩句,interceptor(攔截器)里

BaseContext.setCurrentId(empId);

serviceimpl實現類里

employee.setCreateUser(BaseContext.getCurrentId());employee.setUpdateUser(BaseContext.getCurrentId());

debug時可以右鍵-evalueate expression得到里面的值為empId

1.5 代碼提交

commit + push即可

1.6 遇到的問題

1、沒有自動補全SQL語句功能

net start MYSQL80后可以測試數據庫連接

這篇文章非常有用:IDEA設置MYSQL語句自動提示補全

最后發現是因為安裝的社區版本很多功能都沒有,所以重新安裝Utimate版本

2、Cannot resolve symbol 'SQLIntegrityConstraintViolationException'

import java.sql.SQLIntegrityConstraintViolationException;(導入這個包)


2. 員工的分頁查詢

2.1 需求分析和設計

分析產品原型——

請求方式:get方式請求,

查詢參數:頁碼,每頁記錄數,員工姓名(不同于增加員工查詢參數是json格式,這里使用Query)

后端相應數據:響應碼,錯誤信息,總的數據數total,和這一頁展示的員工數據集合records

接口設計:

2.2 代碼開發

根據接口設置對應的DTO

后面所有的分頁查詢都封裝成PageResult對象,再+code+msg封裝成統一的result

具體來說,Result<Object>接口傳入PageResult對象

①定義DTO類
@Data
public class EmployeePageQueryDTO implements Serializable {//員工姓名private String name;//頁碼private int page;//每頁顯示記錄數private int pageSize;}
EmployeeController中創建員工分頁查詢方法page()

路徑等于@RequestMapping+下面的路徑

@RequestMapping("/admin/employee")@PostMapping("/login")
@PostMapping("/logout")
@GetMapping("/page")
    @GetMapping("/page")@ApiOperation("員工分頁查詢")public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){Log.info("員工分頁查詢,參數為:{}", employeePageQueryDTO);PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);    //service存儲分頁查詢的方法return Result.success(pageResult);}
EmployeeService里聲明pageQuery方法
    /*** 分頁查詢方法* @param employeePageQueryDTO* @return*/PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
④?EmployeeServiceImpl中實現pageQuery方法

一般來說通過從數據庫中導入分頁數據

select * from employee limit 0,10(limit關鍵字查詢第0-10條)

mybatis框架提供插件pagehelper,簡化分頁操作?(在pom.xml中增加配置)

        <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency>

?page和pageSize已知,直接用pagehelper

    /*** 分頁查詢* @param employeePageQueryDTO* @return*/public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {//select * from employee limit 0,10(limit關鍵字查詢第0-10條)//實現原理:將page封裝后存入threadlocal,在分頁查詢前取出來,動態拼接實現SQLPageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);   //返回pagehelper格式的對象long total = page.getTotal();List<Employee> records = page.getResult();return new PageResult(total, records);}
⑤在EmployeeMapper中聲明pageQuery方法,插入數據庫

由于是動態SQL,要使用動態標簽,注解不太方便,

所以我們將SQL寫入映射配置文件,在server-resources-mapper-EmployeeMapper.xml里

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.EmployeeMapper">
</mapper>

ctrl+點擊EmployeeMapper可以進入EmployeeMapper.java文件說明映射已經建立好了

同時為了確保xml文件被掃描到,在application.xml中增加配置

mybatis:#mapper配置文件mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.sky.entityconfiguration:#開啟駝峰命名map-underscore-to-camel-case: true

下載mybatisx插件:

紅色頭繩的表示映射配置文件,藍色頭繩的表示mapper接口。在mapper接口點擊紅色頭繩的小鳥圖標會自動跳轉到對應的映射配置文件,在映射配置文件中點擊藍色頭繩的小鳥圖標會自動跳轉到對應的mapper接口。也可以在mapper接口中定義方法,自動生成映射配置文件中的 statement?

alt+enter-select自動生成配置文件,在自動生成的基礎上編寫動態SQL

<mapper namespace="com.sky.mapper.EmployeeMapper"><select id="pageQuery" resultType="com.sky.entity.Employee">select * from  employee<where><if test="name != null and name !=’‘">and name like concat('%',#{name},'%')   //模糊搜索+字符串拼接</if></where>order by create_time desc   //降序排序</select>
</mapper>

2.3 功能測試

①接口文檔:

返回401,說明token又過期了,在application.yml中

返回兩條json(報了500看了一下是因為xml文件里加中文注釋)

?②前后端聯調

功能一:分頁查詢,前端已經顯示了

功能二:模糊查詢調用name like語句

2.4?代碼完善

剛剛在測試時已經發現了問題,紅框里的最后操作時間不是規范格式

第一種方式需要一個一個地處理,第二種方式則可以統一處理

通過server-config-WebMvcConfiguration里重寫Spring框架里自帶的一個方法extendHandlerExceptionResolvers,擴展消息轉換器((對后端返回給前端的數據做統一處理)

通過實現WebMvcConfigurer接口,你可以按需選擇性地覆蓋接口中的方法,只實現你需要的配置,而不需要處理所有配置。

    /*** 擴展Spring MVC框架的消息轉換器* @param exceptionResolvers*/protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){log.info("擴展消息轉換器...");//創建一個消息轉換器對象MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();//需要為消息轉換器設置一個對象轉換器,將java對象序列化為json數據converter.setObjectMapper(new JacksonObjectMapper());//將自己的消息轉換器converter加入容器converters里,并優先使用converters.add(0, converter);}

2.5 代碼提交


3. 啟用禁用員工賬號

3.1 需求分析和設計

POST請求是因為啟用禁用 本質是修改

一般來說,狀態用路徑參數傳,id用請求參數傳

3.2 代碼開發

EmployeeController中創建方法

    /*** 啟用禁用員工賬號* @param status* @param id* @return*/@PostMapping("/status/{status}")@ApiOperation("啟用禁用員工賬號")public Result startOrStop(@PathVariable Integer status, Long id){log.info("啟用禁用員工賬號,參數為:{},{}", status, id);employeeService.startOrStop(status, id);return Result.success();}

?EmployeeService里聲明

    /*** 啟用禁用員工賬號* @param status* @param id*/void startOrStop(Integer status, Long id);

EmployeeServiceImpl中實現

    public void startOrStop(Integer status, Long id) {//根據id改status,動態更新所以傳實體類比較合適//update employee set status =? where id = ?Employee employee = new Employee();employee.setStatus(status);employee.setId(id);employeeMapper.update(employee);}

也可以通過@Builder構建器獲得一個構件器對象

    public void startOrStop(Integer status, Long id) {//根據id改status,動態更新所以傳實體類比較合適//update employee set status =? where id = ?Employee employee = Employee.builder().status(status).id(id).build();employeeMapper.update(employee);}

在EmployeeMapper中

    /*** 根據主鍵動態修改屬性* @param employee*/void update(Employee employee);

既然是動態的,SQL語句也要放在映射配置文件里寫

    <update id="update">update employee<set><if test="name != null">name = #{name},</if><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="phone != null">phone = #{phone},</if><if test="sex != null">sex = #{sex},</if><if test="idNumber != null">id_Number = #{idNumber},</if><if test="updateTime != null">update_Time = #{updateTime},</if><if test="updateUser != null">update_User = #{updateUser},</if><if test="status != null">status = #{status},</if></set>where id = #{id}</update>

3.3 功能測試

修改成功!

前后端聯調也成功!?

最后記得提交!


?4. 編輯員工

4.1 需求分析和設計

點擊修改,就會跳轉修改界面

?接口設計:

涉及到兩個接口:一個是根據id查詢員工信息(GET),一個是修改員工信息(PUT)

還有提交用POST,刪除用DELETE

?4.2?代碼開發

①根據id查詢員工信息比較簡單,這里只放具體實現了

    /*** 根據id查詢員工信息* @param id* @return*/@Select("select * from employee where id = #{id}")Employee getById(Long id);

前后端聯調成功,并且可以從開發者工具-網絡看到響應格式

② 編輯員工信息

利用mapper之前定義好的update語句更新員工信息

    /*** 編輯員工信息* @param employeeDTO*/public void update(EmployeeDTO employeeDTO) {Employee employee = new Employee();BeanUtils.copyProperties(employeeDTO, employee);employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(BaseContext.getCurrentId());employeeMapper.update(employee);}

?4.3 功能測試-成功

5. 導入分類模塊功能

5.1 需求分析和設計

?設計包括6個接口,和員工管理類似

5.2 代碼導入

mapper-xml-service-imple-controller倒序導入,這樣不會報錯

maven編譯一遍無誤

5.3 功能測試


兩天終于敲完了 Day2,進度有點慢啊T^T

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42458.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

頂刊文獻閱讀及代碼復現

前提:每個無人機都有 (i)自己的機載計算機,用于執行控制其自身動作所需的計算 (ii)自己的傳感器系統,用于測量相對位置和速度, (iii)自己的通信設備,用于與相鄰代理進行數據交換。 模型:短期的排斥力、中間范圍的速度一致性和長距離的吸引力

通過PLC地址來切換威綸通觸摸屏界面

Step 1 元件-PLC控制 Step 2 新增 選擇設備 選擇切換基本窗口功能 選擇觸發地址 Step 3 離線仿真測試 在數值框中輸入對應的頁面號 可以看到頁面可以正常切換 分享創作不易&#xff0c;請多多支持&#xff0c;點贊、收藏、關注&#xff01; Ending~

昇思Mindspore25天學習打卡Day20:DCGAN生成漫畫頭像

昇思Mindspore25天學習打卡Day20&#xff1a;DCGAN生成漫畫頭像 1 GAN基礎原理2 DCGAN原理3 數據準備與處理數據處理 4 構造網絡4.1 生成器4.2 判別器 5 模型訓練損失函數優化器訓練模型 6 結果展示7 訓練結束打上標簽和時間 在下面的教程中&#xff0c;我們將通過示例代碼說明…

為什么裁員先裁技術人員?網友給答復

網友1&#xff1a;技術崗本身就是項目制的&#xff0c;項目完成&#xff0c;后續項目運營的收益與技術無關。之前是項目多&#xff0c;所以收益持續走高&#xff0c;現在都在減項目&#xff0c;自然先減技術崗。 網友2&#xff1a;房子蓋起來了&#xff0c;還需要農民工么? …

基于STM主題模型的主題提取分析-完整代碼數據

直接看結果: 代碼: import re from collections import defaultdict import random import matplotlib.pyplot as plt import numpy as npimport pandas as pd import numpy as np import re from sklearn.feature_extraction.text import CountVectorizer from nltk.corpus…

在Morelogin中使用IPXProxy海外代理IP的設置指南

Morelogin指紋瀏覽器是市場上較受歡迎的指紋瀏覽器&#xff0c;允許用戶管理多個賬號并進行自動化操作。它提供免費環境供用戶進行體驗&#xff0c;并且操作起來非常簡單。大多數人都會將Morelogin指紋瀏覽器和海外代理IP進行使用&#xff0c;來應用于多種場景&#xff0c;如電…

用ce修改植物大戰僵尸雜交版銀幣

第一步打開游戲 用ce打開圖中進程 第二步 輸入你原始銀幣 點首次搜索 第三步 找到這個地址 把地址拖下來 第四步 雙擊直接修改下面數值即可 金幣 鉆石 都和這個方法一樣 不一樣的是首次搜索可能會有很多地址 我們改變游戲里面的值 然后再次搜索游戲被改變的值即可準確找到地址

MySQL中字段的實際長度

在MySQL中&#xff0c;字段的實際長度&#xff08;即存儲數據的實際字節數&#xff09;可能因數據類型和存儲的具體內容而異。對于字符類型&#xff08;如CHAR, VARCHAR, TEXT等&#xff09;字段&#xff0c;實際長度取決于存儲的字符串長度以及字符集的編碼方式&#xff08;如…

新加坡工作和生活指北:租房篇

本文首發于公眾號 Keegan小鋼 前段時間已經分享了工作篇&#xff0c;現在接著聊聊生活篇。因為生活這塊涉及到多個方面&#xff0c;內容比較多&#xff0c;所以我再細分了一下&#xff0c;本篇先聊聊租房。 先來看看新加坡的地區分布圖&#xff0c;如下&#xff1a; 上圖將新加…

使用Python繪制累積直方圖并分析數據

使用Python繪制累積直方圖并分析數據 在這篇博客中&#xff0c;我們將探討如何使用Python中的pandas庫和matplotlib庫來繪制累積直方圖&#xff0c;并分析數據文件中的內容。累積直方圖是一種常用的圖表類型&#xff0c;用于展示數據的累積分布情況。 數據&#xff1a; 鏈接…

(C++鏈表01) 移除鏈表元素

203、移除鏈表元素 不帶頭節點 class Solution { public:ListNode* removeElements(ListNode* head, int val) {while(head ! NULL && head->val val) {ListNode* tem head;head head->next;delete tem;}ListNode* cur head;while(cur ! NULL && c…

LDA算法進行相似性分析

import gensim from gensim import corpora from gensim.models import LdaModel from gensim.matutils import cossim import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize import string# 如果您尚未下載nltk的停用詞列表&#xff0c;請…

使用sklearn的基本流程

scikit-learn&#xff0c;通常簡稱為 sklearn&#xff0c;是一個開源的Python庫&#xff0c;是基于 Python 編程語言的一個非常流行的機器學習庫。它建立在 NumPy 和 SciPy 這兩個科學計算庫之上&#xff0c;并與 Matplotlib 配合使用&#xff0c;為數據預處理、模型訓練、評估…

Atom編輯器插件Minimap使用樣例

Atom編輯器插件Minimap是一個強大的工具&#xff0c;它為開發者提供了快速、直觀的代碼預覽功能。以下是Minimap的使用樣例和一些關鍵特性的介紹&#xff1a; 1. 安裝Minimap 首先&#xff0c;你需要在Atom編輯器中安裝Minimap插件。這通常可以通過Atom的插件市場&#xff08…

vue緩存頁面,當tab切換時保留原有的查詢條件

需求&#xff1a; 切換tab時&#xff0c;查詢條件不變 路由頁面&#xff1a; 單個頁面上加這句話&#xff1a;

bert-base-chinese模型離線使用案例

import torch import torch.nn as nn from transformers import BertModel, BertTokenizer# 通過torch.hub(pytorch中專注于遷移學的工具)獲得已經訓練好的bert-base-chinese模型 # model torch.hub.load(huggingface/pytorch-transformers, model, bert-base-chinese) model…

超過35歲的網工,你該何去何從?

在網絡工程師這個職業中&#xff0c;35歲往往被視為一個重要的門檻&#xff0c;這個年齡段的工程師&#xff0c;既擁有豐富的經驗和技能&#xff0c;也面臨著職業發展的諸多挑戰。 隨著技術的飛速發展和年輕一代的不斷涌入&#xff0c;不少35歲以上的網工都在迷茫的路口&#x…

雅思詞匯7~9

生活類詞匯 英文中文fridge冰箱washing machine洗衣機dishwasher洗碗機water heater熱水器microwave oven微波驢stereo system音箱radiator電暖爐toaster烤面包機dryer烘干機air conditioner空調accmodation住宿&#xff0c;膳宿tenant租客landlord房東couple夫婦veterinarian…

【資源下載】《數據倉庫工具箱》

歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;歡迎訂閱相關專欄&#xff1a; 歡迎關注微信公眾號&#xff1a;野老雜談 ?? 全網最全IT互聯網公司面試寶典&#xff1a;收集整理全網各大IT互聯網公司技術、項目、HR面試真題. ?? AIGC時代的創新與未來&a…

SpringBoot報錯:The field file exceeds its maximum permitted size of 1048576 bytes

報錯信息 The field file exceeds its maximum permitted size of 1048576 bytes原因是 SpringBoot內嵌的 tomcat 默認的所有上傳的文件大小為 1MB 解決辦法 修改配置 spring:servlet:multipart:max-file-size: 50MBmax-request-size: 50MB或者 spring.servlet.multipart.…