簡介
技術選型
展示項目中使用到的技術框架和中間件。
用戶層:node.js? ? ? ? Vue.js? ? ? ? ElementUI? ? ? ? 微信小程序? ? ? ? apache echarts
網關層:nginx
應用層:Spring Boot? ? ? ? Spring MVC? ? ? ? Spring Task? ? ? ? httpclient? ? ? ? Spring Cache? ? ? ? JWT? ? ? ? 阿里云OSS? ? ? ? Swagger? ? ? ? POI? ? ? ? WebSocket
數據庫:MySQL? ? ? ? Redis? ? ? ? mybatis? ? ? ? pagehelper? ? ? ? spring data redis
工具:Git? ? ? ? maven? ? ? ? junit? ? ? ? postman
后端環境搭建
熟悉項目的整體結構
sky-take-out? ? ? ? maven父工程,統一管理依賴版本,聚合其他子模塊
sky-common? ? ? ? 子模塊,存放公共類,例如:工具類,常量類,異常類等
sky-pojo? ? ? ? 子模塊,存放實體類,VO,DTO等
sky-server? ? ? ? 子模塊,后端服務,存放配置文件,controller、service、mapper
關于什么是DTO、VO、entity?
entity? ? ? ? 實體,通常與數據庫中的表對應
DTO? ? ? ? 數據傳輸對象,通常用于程序中各層之間傳遞數據
VO? ? ? ? 視圖對象,為前端展示數據提供對象
POJO? ? ? ? 普通java對象,只有屬性和對應的getter和setter
如何實用git進行版本管理?
Git對待數據的方式并非差異比較,而是采用快照的方式。Git把數據看作是對小型文件系統的一組快照。每次提交更新或者在Git中保存狀態時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。為了高效,如果文件沒有修改,Git不再重新存儲該文件,二十保留一個人鏈接指向之前存儲的文件。Git對待數據更現實一個快照流。
Git的三種狀態
- 已提交(committed):數據已經安全的保存在本地數據庫中。
- 已修改(modified):已經修改了文件,但是還沒有保存在數據庫中。
- 已暫存(staged):表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
由此引入Git項目的三個工作區域的概念:Git倉庫、工作目錄、和暫存區。
Git常用命令
獲取git倉庫
從現在目錄中初始化倉庫
git init
從服務器中克隆一個現有的git倉庫
git clone [url]
提交更新
git commit -m "代碼提交信息"
推送到遠程倉庫:
git remote add origin <server>
將改動提交到遠程倉庫(可以將master換成你想要推送的任何分支)
git push origin master
撤銷操作
git commit --amend
Git分支
分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master是默認分支。在其他分支上進行開發。完成后再將他們合并到主分支上。
創建一個名字叫做test的分支
git branch test
切換當前分支到test(當你切換分支的時候,Git會重置你的工作目錄,使其看起來像回到了你在分支上最后一次提交的樣子。Git會自動添加、修改、刪除文件以確保此時你的工作目錄和這個分支最后一次提交時的樣子一摸一樣)
git checkout test
你可以直接這樣創建分支并切換過去
git checkout -b feature_x
切換到主分支
git checkout master
合并分支
git merge test
把新建的分支刪除掉
git push origin
數據庫環境搭建
employee? ? ? ? 員工表;? ? ? ? category? ? ? ? 分類表;
dish? ? ? ? 菜品表;? ? ? ? dish_flavor? ? ? ? 菜品口味表;
setmeal? ? ? ? 套餐表;? ? ? ? setmeal_dish? ? ? ? 套餐菜品關系表
user? ? ? ? 用戶表;? ? ? ? adress_book? ? ? ? 地址表;
shopping_cart? ? ? ? 購物車表;? ? ? ? orders? ? ? ? 訂單表;
order_detail? ? ? ? 訂單明細表;
Nginx反向代理和負載均衡
前端發送的請求,是如何請求到后端服務的?
? ? ? ? nginx反向代理就是將前端發送的請求由nginx動態轉發到后端服務器。
????????nginx反向代理好處
- 提高訪問速度
- 進行負載均衡
- 保證后端服務安全
Day1
完善登錄功能
password = DigestUtils.md5DigestAsHex(password.getBytes());
Swagger介紹和使用
后端生成接口文檔并且進行測試
介紹
生成接口文檔以及在線調試。
Knife4j是為java MVC框架集成Swagger生成Api文檔的增強解決方案。
Yapi是設計階段的工具,管理和維護接口;Swagger在開發階段使用的框架,幫助后端開發人員做后端的接口測試。
使用方式
- 導入knife4j的maven坐標
- 在配置類中加入knife4j相關配置
- 設置靜態資源映射,否則接口文檔頁面無法顯示
- 訪問接口文檔界面localhost:8080/doc.html
常用注解
@Api 用在類上,例如controller表示對類的說明
@ApiModel 用在類上,例如entity,DTO,VO
@ApiModelProperty 用在屬性上,描述屬性信息
@ApiOPeration 用在方法上,例如controller的方法,說明方法的用途、作用
Day2
員工管理
新增員工
- 如果傳入的數據是json需要添加 @RequestBody 注解
-
對象屬性拷貝由A拷貝到B,前提是A,B的屬性名一致
BeanUtils.copyProperties(employeeDTO,employee);
代碼完善:
錄入的用戶名已存在,拋出異常后沒有處理;
? ? ? ? 處理過程首先捕捉出現的異常,然后分析相關錯誤;
新增員工時,創建人id和修改人id設置為了固定值;
- 熟悉關于基于JWT令牌認證的過程。
- 截取JWT令牌,并且分析令牌里面出現的ID
- 那么如何將ID傳給服務?
ThreadLocal并不是一個Thread,而是Thread的局部變量。
ThreadLocal為每一個線程提供單獨一份存儲空間,具有線程隔離的效果,只有在線程內才能獲取到對應的值,線程外則不能訪問到。
ThreadLocal常用方法
- public void set(T value) 設置當前線程的線程局部變量的值
- public T get() 返回當前線程所對應的線程局部變量
- public void remove()移除當前線程的線程局部變量
員工分頁查詢
- Pagehelper插件,分頁查詢是基于SQL的limit關鍵字計算,其返回類型也要為Page
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
- 分頁查詢XML書寫:
啟用禁用員工賬號
@PathVariable
是Spring框架中的一個注解,用于將URL中的路徑變量綁定到方法參數上。
編輯員工
- 注意書寫SQL的語法錯誤
導入分類模塊功能代碼
菜品管理
公共字段自動填充
實現思路
insert create_time 創建時間 datetimecreate_user 創建人id bigint
insert/updateupdate_time 創建時間 datetimeupdate_user 修改時間 bigint
- 自定義注解AutoFill,用于標識需要進行公共字段自動填充的方法。
- 自定義切面AutoFillAspect,統一攔截加入了AutoFill注解的方法,通過反射為公共字段賦值。
- 在Mapper加入AutoFill注解。
//獲取到當前被攔截的方法上的數據庫操作類型MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法簽名對象AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//獲得方法上的注解OperationType operationType = autoFill.value();//獲得數據庫操作類型//獲取到當前被攔截的方法的參數--實體對象Object[] args = joinPoint.getArgs();if(args == null || args.length == 0){return;}Object entity = args[0];//準備賦值的數據LocalDateTime now = LocalDateTime.now();Long currentId = BaseContext.getCurrentId();//根據當前不同的操作類型,為對應的屬性通過反射來賦值if(operationType == OperationType.INSERT){//為四個字段賦值try{Method setCreateTime = entity.getClass().getDeclaredMethod("setCreateTime", LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod("setCreateUser",Long.class);Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser",Long.class);//通過反射賦值setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);}catch (Exception e){e.printStackTrace();}}else if (operationType == OperationType.UPDATE){try{Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser",Long.class);//通過反射賦值setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);}catch (Exception e){e.printStackTrace();}}
通過在Mapper里面加入注解
@AutoFill(value = OperationType.INSERT)
/@AutoFill(value = OperationType.UPDATE)
使用阿里OSS
- 在阿里云官網創建一個bucket
- 完善配置項
- 創建config文件
Day5
Redis基礎知識
Redis是基于內存的key-value結構數據庫。
- 基于內存存儲,讀寫性能高
- 適合存儲熱點數據,熱點商品、資訊、新聞
- ?企業應用廣泛
如何打開Redis在程序所在的文件目錄打開cmd
redis-server.exe redis.windows.conf
結束進程
ctrl + c
如何連接redis
redis-cli.exe
Redis中的數據類型
Redis存儲的是key-value結構的數據,其中key是字符串類型,value有5種常用的數據類型。
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合sorted set / zset
字符串String
SET key value 設置指定key的值;
GET key 獲取指定key的值;
SETEX key? seconds value 設置指定key的值,并將key的過期時間設為seconds(獲取驗證碼)
SETNX key value 只有在key不存在時設置key的值
哈希操作命令
Redis hash 是一個string類型的field和value的映射表,hash特別適合用于存儲對象。
HSET key field value? ? ? ? 將哈希表key中的字段field的值設為value
HGET key field? ? ? ? 獲取存儲在哈希表中指定字段的值
HDEL key field? ? ? ? 刪除存儲在哈希表中的指定字段
HKEYS key? ? ? ? 獲取哈希表中所有字段
HVALS key? ? ? ? 獲取哈希表中所有值
其中,key、field1、value均為字符串。
列表操作命令
Redis列表是最簡單的字符串列表,按照插入順序排序,常用命令:
- LPUSH key value1 [value2]? ? ? ? 將一個或多個值插入到列表頭部
- LRANGE key start stop? ? ? ? 獲取列表最后一個元素 lrange key 0 -1輸出全部元素
- LPOP key? ? ? ?移除并獲取列表最后一個元素
- LLEN key? ? ? ?獲取列表長度
- R類似
?集合操作命令
Redis set 是string 類型的無序集合。集合成員是唯一的,集合中不能出現重復的數據,常見命令:
- SADD key member1 [member2]? ? ? ? 向集合中添加一個或多個成員
- SMEMBERS key? ? ? ? ? ? ? ? ?返回集合中的所有成員
- SCARD key? ? ? ? ? ? ? ? ? ? 獲取集合的成員數
- SINTER key1 [key2]? ? ? ? ?返回給定所有集合的交集
- SUNION key1 [key2]? ? ? ? ? 返回所有給定集合的并集
- SREM key member1 [member2]? ? ? ? ? 刪除集合中一個或多個成員
有序集合操作命令
Redis有序集合是string類型元素的集合,且不允許有重復成員。每個元素都會關聯一個double類型的分數。常用命令:
ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員
ZRANGE key start stop [WITHSCORES] 通過索引區間返回有序集合中指定區間的成員
ZINCRBY key increment member 有序集合中對指定成員的分數加上增量increment
ZREM key member [member ...] 移除有序集合中的一個或多個成員?
Redis通用命令
不分數據類型,都可以使用的命令
- KEYS pattern 查找所有符合給定模型的key
- EXISTS key 檢查給定key是否存在
- TYPE key 返回key所存儲的值的類型
- DEL key 該命令用于在key存在時刪除key