【蒼穹外賣】學習心得體會-隨筆

前言

寫了很久,終于可以完整運行項目了,記錄下這幾天的心得體會回顧一下知識點

第一天、Git 分布式版本控制工具

一、Git概述

  • 定義:是分布式版本控制工具,用于管理軟件開發中的源代碼文件,像Java類、xml文件、html頁面等,軟件開發中應用廣泛。
  • 倉庫類型
    • 本地倉庫:位于開發人員自己電腦上。
    • 遠程倉庫:存在于遠程服務器上,可借助GitHub、碼云、GitLab等代碼托管服務搭建。

二、Git的下載與安裝

  • 下載地址:https://git-scm.com/download,下載后雙擊安裝文件完成安裝。
  • 安裝成功標志:在任意目錄下點擊鼠標右鍵,出現“Git GUI Here”(打開Git圖形界面)和“Git Bash Here”(打開Git命令行)菜單。

三、常用代碼托管服務

  • GitHub:面向開源及私有軟件項目的托管平臺,只支持Git作為版本庫格式托管。
  • 碼云:國內代碼托管平臺,服務器在國內,速度相對較快。
  • GitLab:用于倉庫管理系統的開源項目,基于Git搭建的web服務。
  • BitBucket:源代碼托管網站,采用Mercurial和Git作為分布式版本控制系統,有商業計劃和免費賬戶。

四、Git常用命令

  1. 全局設置
    設置用戶名稱和email地址(非注冊碼云賬號時用的用戶名和郵箱,可任意設置):
    • git config --global user.name "itcast"
    • git config --global user.email "hello@itcast.cn"
      查看配置信息:git config --list
  2. 獲取Git倉庫
    • 本地初始化:在指定目錄下執行git init命令創建,成功后會出現隱藏的.git文件夾。
    • 從遠程倉庫克隆:使用git clone 遠程倉庫地址命令,將遠程倉庫拷貝到本地。
  3. 工作區、暫存區、版本庫相關概念
    • 版本庫:.git隱藏文件夾,存儲配置、日志、文件版本等信息。
    • 工作區:包含.git文件夾的目錄,存放開發代碼。
    • 暫存區:.git文件夾中的index文件,臨時保存修改文件。
  4. 工作區文件狀態:分為untracked(未跟蹤)、tracked(已跟蹤,含Unmodified未修改、Modified已修改、Staged已暫存狀態),狀態隨Git命令執行而變化。
  5. 本地倉庫操作命令
    • git status:查看文件狀態。
    • git add:將文件修改加入暫存區(如git add fileName)。
    • git reset:取消暫存(git reset 文件名)或切換到指定版本(git reset --hard 版本號)。
    • git commit:將暫存區文件修改提交到版本庫(如git commit -m msg 文件名,-m用于添加提交說明,可用通配符一次提交多個文件)。
    • git log:查看提交日志。
  6. 遠程倉庫操作命令
    • git remote:查看遠程倉庫(加-v參數查看詳細信息)。
    • git remote add:添加遠程倉庫(格式為git remote add 簡稱 遠程倉庫地址,一個本地倉庫可關聯多個遠程倉庫)。
    • git clone:從遠程倉庫克隆數據到本地。
    • git push:將本地倉庫內容推送到遠程倉庫(格式為git push 遠程倉庫簡稱 分支名稱)。
    • git pull:從遠程倉庫獲取最新版本并合并到本地倉庫(格式為git pull 遠程倉庫簡稱 分支名稱,若本地非克隆倉庫拉取文件報錯,可加--allow-unrelated-histories參數解決)。
  7. 分支操作命令
    • git branch:查看分支(git branch列出本地分支;git branch -r列出遠程分支;git branch -a列出所有本地和遠程分支)。
    • git branch [name]:創建分支。
    • git checkout [name]:切換分支。
    • git push [shortName] [name]:推送至遠程倉庫分支。
    • git merge [name]:合并分支。
  8. 標簽操作命令
    • git tag:查看標簽。
    • git tag [name]:創建標簽。
    • git push [shortName] [name]:將標簽推送至遠程倉庫。
    • git checkout -b [branch] [name]:檢出標簽(新建分支指向標簽)。

五、在IDEA中使用Git

  1. 配置Git:需提前安裝好Git,若安裝在默認目錄(C:\Program Files\Git),IDEA可直接使用,否則需手動配置Git安裝目錄下的git.exe可執行文件路徑。
  2. 獲取Git倉庫
    • 本地初始化倉庫:通過菜單【VCS】—【Import into Version Control】—【Create Git Repository】操作,選擇項目根目錄完成初始化,會出現.git隱藏目錄,工具欄出現相關操作圖標。
    • 從遠程倉庫克隆:在IDEA開始窗口點擊【Get from Version Control】,輸入遠程倉庫URL地址和本地倉庫存放目錄,點擊【Clone】按鈕克隆。
  3. Git忽略文件:通過.gitignore文件指定工作區中不需要Git管理的文件(如編譯后的.class文件、開發工具配置文件等),文件名固定,添加到忽略列表的文件后續Git會忽略。
  4. 本地倉庫操作:在IDEA中可進行將文件加入暫存區(操作類似命令git add)、將暫存區文件提交到版本庫(簡化操作可直接提交,有提交單個文件、多個文件等不同操作方式,工具欄有快捷按鈕)、查看日志(可查看整個項目或某個文件的提交日志)等操作。
  5. 遠程倉庫操作:可查看遠程倉庫(對應git remote命令)、添加遠程倉庫(對應git remote add命令)、推送至遠程倉庫(對應git push命令,工具欄有提交快捷按鈕可同時完成提交和推送)、從遠程倉庫拉取(對應git pull命令,工具欄有快捷按鈕)。
  6. 分支操作:可查看分支(對應git branch命令,狀態欄有快捷按鈕)、創建分支(輸入分支名創建)、切換分支、將分支推送到遠程倉庫(對應git push命令)、合并分支(對應git merge命令)等操作。

第二天、Swagger理解、開發環境搭建

以下是“蒼穹外賣-day01”課程知識點的快速總結:

一、軟件開發整體介紹

  1. 軟件開發流程
    • 需求分析:編寫需求規格說明書(用Word描述項目各部分,如系統定義、功能規格等)和產品原型(以網頁形式展示頁面效果、交互邏輯等)。
    • 設計:包含UI設計(頁面及交互邏輯設計)、數據庫設計(確定數據庫、表結構及關系等)、接口設計(分析原型圖確定接口相關參數及路徑、請求方式)。
    • 編碼:開發工程師進行項目代碼編寫并完成單元測試。
    • 測試:測試人員在測試環境對部署好的項目進行功能測試,出具測試報告。
    • 上線運維:運維人員準備服務器環境,將項目部署到服務器上線運行。
  2. 角色分工
    • 項目經理:負責整個項目,進行任務分配和把控進度,貫穿全階段。
    • 產品經理:在需求分析階段進行需求調研,輸出需求調研文檔、產品原型。
    • UI設計師:在設計階段根據產品原型輸出界面效果圖。
    • 架構師:負責項目整體架構設計、技術選型等設計相關工作。
    • 開發工程師:在編碼階段實現項目功能代碼。
    • 測試工程師:針對項目編寫測試用例、輸出測試報告,負責測試階段工作。
    • 運維工程師:在上線運維階段搭建軟件環境、部署項目上線。
  3. 軟件環境
    • 開發環境:軟件開發人員開發階段使用,外部用戶一般無法訪問,如開發中使用的本地或服務器中的MySQL等軟件,項目測試、上線后不再使用。
    • 測試環境:開發人員完成功能模塊開發與單元測試后,將項目部署至此供測試人員使用,用于項目測試,外部用戶無法訪問。
    • 生產環境:項目開發、測試通過后上線部署的環境,正式對外提供服務,可位于機房或云服務器等線上環境。

二、蒼穹外賣項目介紹

  1. 項目介紹:專為餐飲企業定制,包含系統管理后臺(供內部員工管理餐廳各類信息、統計數據、來單語音播報等)和小程序端(供消費者點餐、下單、支付等)兩部分。
  2. 產品原型:由產品經理設計,展示項目業務功能(非最終頁面效果),分為管理端原型(員工登錄、管理等功能展示)和用戶端原型(微信登錄、點餐、支付等功能展示)。
  3. 技術選型
    • 用戶層:管理后臺前端用H5、Vue.js、ElementUI、apache echarts等;移動端用微信小程序。
    • 網關層:Nginx作Http服務器,有反向代理、負載均衡作用,可部署靜態資源、提高訪問性能。
    • 應用層:SpringBoot快速構建項目;SpringMVC與Spring無縫集成;還有Spring Task、httpclient、Spring Cache、JWT、阿里云OSS、Swagger、POI、WebSocket等用于不同功能實現。
    • 數據層:核心業務數據存MySQL,用Redis做緩存,Mybatis做持久層開發,搭配pagehelper分頁插件以及spring data redis簡化Redis操作。
    • 工具:git管理代碼版本,maven構建項目,junit進行單元測試,postman測試接口。

三、開發環境搭建

  1. 前端環境搭建:基于nginx,將前端運行環境的nginx移到非中文目錄,啟動nginx(雙擊nginx.exe,訪問端口80)即可訪問前端頁面。
  2. 后端環境搭建
    • 熟悉項目結構:后端基于maven分模塊開發,有sky-take-out(父工程管理依賴、聚合模塊)、sky-common(存放公共類)、sky-pojo(存放實體、DTO、VO等)、sky-server(存放配置、Controller、Service、Mapper等)模塊,各模塊內有不同功能的包。
    • Git版本控制:創建本地倉庫,再在碼云等平臺創建遠程倉庫,將本地文件提交到本地倉庫后,添加遠程倉庫地址,推送文件至遠程倉庫。
    • 數據庫環境搭建:找到sky.sql文件直接打開執行創建數據庫及11張表(如員工表、分類表等),了解各表大致存儲數據,可參考《數據庫設計文檔》了解詳細結構。
    • 前后端聯調:后端初始工程已實現登錄功能,介紹了從Controller層、Service層到Mapper層的代碼邏輯,可通過斷點調試跟蹤執行過程。
    • nginx反向代理和負載均衡
      • 反向代理:將前端動態請求由nginx轉發到后端服務器,可提高訪問速度、進行負載均衡、保證后端服務安全,配置通過如location /api/ { proxy_pass http://localhost:8080/admin/; }等指令實現。
      • 負載均衡:基于反向代理實現,把請求按指定策略分配給集群中服務器,策略有輪詢、weight(權重)、ip_hash、least_conn、url_hash、fair等,各有對應配置方式。
    • 完善登錄功能:針對員工表密碼明文存儲安全性低的問題,采用MD5加密方式,修改數據庫中密碼為密文,同時在Java代碼比對密碼時先對前端提交密碼加密后再比對。

四、導入接口文檔

  1. 前后端分離開發流程:先定義接口(確定路徑、請求方式、參數等),前端和后端并行開發與自測,然后前后端連調測試,最后提交給測試人員最終測試。
  2. 操作步驟:從資料中找到項目接口文件,在YApi平臺(http://yapi.feisudu.com/ )創建項目后導入接口文件(管理端和用戶端分別導入對應json文件)。

五、Swagger

  1. 介紹:是規范完整框架,利于前后端分離開發、自動生成接口文檔、進行功能測試。Springfox基于Spring整合Swagger,knife4j是集成Swagger生成Api文檔的增強解決方案,目前常用knife4j。
  2. 使用步驟
    • 導入knife4j的maven坐標到pom.xml。
    • 在配置類中加入knife4j相關配置(如定義Docket,設置ApiInfo等)。
    • 設置靜態資源映射,確保接口文檔頁面能訪問。
    • 通過訪問http://ip:port/doc.html路徑進行接口文檔訪問與測試。
  3. 常用注解
    • @Api:用在類(如Controller)上說明類。
    • @ApiModel:用在類(如entity、DTO、VO)上。
    • @ApiModelProperty:用在屬性上描述屬性信息。
    • @ApiOperation:用在方法上說明方法用途、作用,使用這些注解可生成可讀性更好的接口文檔。

第三天、員工查詢分頁等業務邏輯

本文檔圍繞蒼穹外賣項目展開,主要介紹了項目開發中員工管理和菜品分類管理相關功能的實現,包括需求分析與設計、代碼開發、功能測試以及代碼提交等內容,具體知識點如下:

員工管理功能

  1. 新增員工
    • 需求分析與設計:依據產品原型明確功能需求,設計新增員工接口及對應的employee表結構,規定賬號、手機號、身份證號等信息的格式及默認值等要求。
    • 代碼開發:涉及DTO類設計、Controller層、Service層接口與實現類、Mapper層的代碼編寫,實現數據的接收、業務邏輯處理及數據庫插入操作。
    • 功能測試:通過接口文檔測試和前后端聯調測試兩種方式進行,解決了如JWT令牌校驗失敗等測試中出現的問題。
    • 代碼完善:針對用戶名重復、創建人及修改人id固定等問題,利用全局異常處理器和ThreadLocal機制進行優化處理。
    • 代碼提交:按流程完成代碼提交操作。
  2. 員工分頁查詢
    • 需求分析與設計:根據產品原型確定分頁展示員工信息及按姓名查詢的業務規則,明確接口相關要求。
    • 代碼開發:設計DTO類封裝請求參數,統一用PageResult封裝分頁查詢結果,在各層級編寫代碼實現分頁查詢功能,利用PageHelper插件簡化開發。
    • 功能測試:采用接口文檔測試和前后端聯調測試方式,針對操作時間字段顯示格式問題進行代碼完善。
    • 代碼提交:完成相應提交操作。
  3. 啟用禁用員工賬號
    • 需求分析與設計:依照產品原型明確賬號啟用禁用的操作規則及對應接口設計要求。
    • 代碼開發:在Controller層、Service層、Mapper層編寫代碼實現相關業務邏輯及數據庫操作。
    • 功能測試:運用接口文檔測試和前后端聯調測試進行驗證。
    • 代碼提交:按常規步驟提交代碼。
  4. 編輯員工
    • 需求分析與設計:基于產品原型梳理出根據id查詢員工信息和編輯員工信息兩個接口需求。
    • 代碼開發:分別在各層級編寫代碼實現員工信息回顯及修改功能,部分功能復用已有代碼。
    • 功能測試:通過接口文檔測試和前后端聯調測試檢驗功能實現情況。
    • 代碼提交:完成代碼提交流程。

菜品分類管理功能

  1. 需求分析與設計:從產品原型出發,分析新增、分頁查詢、刪除、修改、啟用禁用、按類型查詢菜品分類等功能需求,確定接口設計及category表結構。
  2. 代碼導入:按照mapper、service、controller順序導入資料中提供的分類管理模塊功能代碼,并進行編譯。
  3. 功能測試:重啟服務后,對菜品分類管理的各項功能如分頁查詢、分類類型查詢、啟用禁用、修改、新增、刪除等進行測試驗證。
  4. 代碼提交:按照常規流程完成代碼提交。

第四天、菜品管理板塊

一、公共字段自動填充

  1. 問題分析
    • 系統中很多表存在公共字段(如創建時間、創建人、修改時間、修改人),在新增或編輯數據時需重復賦值,代碼冗余繁瑣。
  2. 實現思路
    • 自定義注解AutoFill,標識需自動填充公共字段的方法。
    • 自定義切面AutoFillAspect,攔截加AutoFill注解的方法,通過反射為公共字段賦值。
    • Mapper方法上加AutoFill注解。
  3. 技術點運用
    • 枚舉:定義OperationType枚舉(UPDATEINSERT)表示數據庫操作類型。
    • 注解:創建AutoFill注解,指定作用于方法,運行時有效,關聯OperationType枚舉值。
    • AOP:通過@Aspect@Component定義切面類,設置切入點autoFillPointCut,在前置通知autoFill方法中實現公共字段賦值邏輯。
    • 反射:在autoFill方法中,利用反射獲取被攔截方法的參數實體對象,根據操作類型為公共字段賦值。
  4. 代碼開發要點
    • 自定義注解AutoFillcom.sky.annotation包中,關聯OperationType枚舉。
    • 切面AutoFillAspectcom.sky.aspect包中,切入點表達式execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill),在前置通知中獲取方法簽名、注解、操作類型,以及方法參數實體對象,然后根據操作類型利用反射為實體對象的公共字段賦值。
    • Mapper接口方法(如CategoryMapperEmployeeMapper的新增和修改方法)上添加@AutoFill注解,并注釋掉業務層中原來為公共字段賦值的代碼。
  5. 功能測試與提交
    • 以新增菜品分類為例測試,查看控制臺輸出的 SQL 和數據庫表中數據,確認公共字段自動填充成功。
    • 代碼提交時注意可能出現的提示,按步驟推送成功。

二、新增菜品

  1. 需求分析與設計
    • 產品原型:后臺可管理菜品信息,新增菜品時需選擇所屬分類并上傳圖片,菜品名稱唯一,可選擇口味,對應一張圖片。
    • 接口設計:包括根據類型查詢分類(已完成)、文件上傳、新增菜品。明確各接口請求方式、路徑、參數和返回值。
    • 表設計:涉及菜品表dish(包含菜品名稱、分類 ID、價格、圖片、描述、狀態、創建時間、更新時間、創建人、更新人等字段)和菜品口味表dish_flavor(包含菜品 ID、口味名稱、口味值等字段)。
  2. 代碼開發步驟
    • 文件上傳實現
      • 定義OSS相關配置,在sky-server模塊的application-dev.ymlapplication.yml中設置aliossendpointaccess-key-idaccess-key-secretbucket-name等屬性。
      • 讀取OSS配置,在sky-common模塊的AliOssProperties類中通過@ConfigurationProperties讀取配置。
      • 生成OSS工具類對象,在sky-server模塊的OssConfiguration類中創建AliOssUtil對象。
      • 定義文件上傳接口,在sky-server模塊的CommonController中創建upload方法,接收MultipartFile類型的文件,處理文件名、生成新文件名,利用AliOssUtil上傳文件并返回文件路徑。
    • 新增菜品實現
      • 設計DTODishDTO,在sky-pojo模塊中,包含菜品基本信息和口味列表。
      • Controller層,在sky-server模塊的DishController中創建save方法,接收DishDTO,調用DishServicesaveWithFlavor方法。
      • Service層接口DishService中定義saveWithFlavor方法。
      • Service層實現類DishServiceImpl中實現saveWithFlavor方法,先將DishDTO屬性復制到Dish實體,插入菜品表獲取主鍵,再處理口味數據插入口味表。
      • Mapper層,DishMapper中添加insert方法并在DishMapper.xml中編寫插入菜品數據的 SQL,DishFlavorMapper中添加insertBatch方法并在DishFlavorMapper.xml中編寫批量插入口味數據的 SQL。
  3. 功能測試與提交
    • 進入菜品管理新建菜品頁面,填寫信息保存后在數據庫表中查看數據,確認新增菜品功能成功。
    • 代碼提交按常規步驟操作,注意提交過程中的提示信息。

三、菜品分頁查詢

  1. 需求分析和設計
    • 產品原型:菜品數據多以分頁展示,展示菜品基本信息、圖片(需下載)和分類名稱(需關聯查詢)。
    • 業務規則:按頁碼展示,每頁 10 條,可根據菜品名稱、分類、狀態查詢。
    • 接口設計:設計菜品分頁查詢接口,明確請求方式、路徑、參數和返回值。
  2. 代碼開發流程
    • 設計DTODishPageQueryDTO,在sky-pojo模塊中,包含頁碼、頁大小、菜品名稱、分類 ID、狀態等屬性。
    • 設計VODishVO,在sky-pojo模塊中,包含菜品基本信息、分類名稱、口味列表等屬性。
    • Controller層,在DishController中創建page方法,接收DishPageQueryDTO,調用DishServicepageQuery方法并返回結果。
    • Service層接口DishService中擴展pageQuery方法。
    • Service層實現類DishServiceImpl中實現pageQuery方法,使用PageHelper進行分頁,調用DishMapperpageQuery方法并封裝PageResult返回。
    • Mapper層,DishMapper接口中聲明pageQuery方法,在DishMapper.xml中編寫 SQL,關聯dish表和category表,根據條件查詢并按創建時間倒序排列。
  3. 功能測試與提交
    • 可通過接口文檔測試(啟動服務,使用admin用戶登錄獲取token,在Swagger中訪問菜品分頁查詢接口發送請求)和前后端聯調測試(啟動nginx,訪問http://localhost點擊菜品管理),確認數據成功查出。
    • 代碼提交步驟與之前類似,注意處理提交過程中的問題。

四、刪除菜品

  1. 需求分析和設計
    • 產品原型:菜品列表有刪除操作,可單個或批量刪除。
    • 業務規則:起售中菜品不能刪除,被套餐關聯的菜品不能刪除,刪除菜品時關聯口味數據也刪除。
    • 接口設計:設計菜品批量刪除接口,ids參數可包含多個菜品 ID。
    • 表設計:涉及dish表、dish_flavor表和setmeal_dish表(菜品與套餐關聯中間表)。
  2. 代碼開發實現
    • Controller層,在DishController中創建delete方法,接收菜品 ID 列表,調用DishServicedeleteBatch方法。
    • Service層接口DishService中聲明deleteBatch方法。
    • Service層實現類DishServiceImpl中實現deleteBatch方法,先判斷菜品是否起售中或被套餐關聯,若可刪除則先刪除菜品表數據,再刪除關聯口味數據。
    • Mapper層,DishMapper中聲明getById方法并編寫 SQL 查詢菜品,SetmealDishMapper中聲明getSetmealIdsByDishIds方法并在SetmealDishMapper.xml中編寫 SQL 根據菜品 ID 查詢套餐 ID,DishMapper中聲明deleteById方法并編寫 SQL 刪除菜品數據,DishFlavorMapper中聲明deleteByDishId方法并編寫 SQL 刪除關聯口味數據。
  3. 功能測試與提交
    • 通過前后端聯調測試,在菜品列表頁面進行刪除操作,包括刪除正常菜品和起售中菜品,檢查數據庫表中數據是否正確刪除,確認功能是否符合業務規則。
    • 代碼提交按常規流程操作,留意提交時的提示信息。

五、修改菜品

  1. 需求分析和設計
    • 產品原型:菜品管理列表點擊修改按鈕進入修改頁面,回顯信息并修改保存。
    • 接口設計:涉及根據 ID 查詢菜品和修改菜品兩個接口,明確各接口請求方式、路徑、參數和返回值。
  2. 代碼開發步驟
    • 根據 ID 查詢菜品實現
      • Controller層,在DishController中創建getById方法,接收菜品 ID,調用DishServicegetByIdWithFlavor方法并返回結果。
      • Service層接口DishService中聲明getByIdWithFlavor方法。
      • Service層實現類DishServiceImpl中實現getByIdWithFlavor方法,先查詢菜品數據,再查詢關聯口味數據,封裝到DishVO返回。
      • Mapper層,DishFlavorMapper中聲明getByDishId方法并編寫 SQL 根據菜品 ID 查詢口味數據。
    • 修改菜品實現
      • Controller層,在DishController中創建update方法,接收DishDTO,調用DishServiceupdateWithFlavor方法。
      • Service層接口DishService中聲明updateWithFlavor方法。
      • Service層實現類DishServiceImpl中實現updateWithFlavor方法,先更新菜品表基本信息,再刪除原口味數據,最后重新插入口味數據。
      • Mapper層,DishMapper中聲明update方法并在DishMapper.xml中編寫動態更新菜品數據的 SQL,關聯AutoFill注解實現公共字段自動更新。
  3. 功能測試與提交
    • 通過前后端聯調測試,在菜品列表頁面選擇菜品修改,檢查回顯和修改保存功能是否正常。
    • 代碼提交同常規操作,注意提交過程中的細節。

第五天、Redis的應用簡單理解

Redis入門

  • 簡介
    • Redis是基于內存的key-value結構數據庫,是存儲中間件,具有讀寫性能高、適合存儲熱點數據等特點,屬于非關系型數據庫(NoSql),是關系型數據庫的補充。
    • 存儲的value類型豐富,被稱為結構化的NoSql數據庫,官方給出的QPS能達100000+。
  • 下載與安裝
    • 下載:分為Windows版(下載地址:https://github.com/microsoftarchive/redis/releases )和Linux版(下載地址:https://download.redis.io/releases/ ),資料中也提供了安裝包。
    • 安裝
      • Windows中安裝:屬于綠色軟件,解壓即可使用,解壓后有特定目錄結構。
      • Linux中安裝(簡單了解):需上傳安裝包后解壓,安裝依賴環境gcc,進入對應目錄編譯、安裝,安裝后有如Redis服務啟動腳本、客戶端腳本、配置文件等重點文件。
  • 服務啟動與停止
    • 服務啟動命令(以Windows版為例):使用“redis-server.exe redis.windows.conf”命令啟動,默認端口號為6379,按Ctrl + C可停止服務。
    • 客戶端連接命令:“redis-cli.exe”默認連接本地Redis服務及6379端口,也可通過指定參數(如-h、-p、-a)連接特定的服務、端口、設置密碼等。修改Redis配置文件設置密碼后需重啟服務,連接時需帶上密碼(若有),在某些情況下可省略部分參數。
    • Redis客戶端圖形工具:默認客戶端工具界面和操作不太友好,引入圖形工具,安裝后可新建連接并進行操作。

Redis數據類型

Redis中key是字符串類型,value有5種常用數據類型,分別是:

  • 字符串(string):普通字符串,是最簡單的數據類型。
  • 哈希(hash):類似Java中的HashMap結構,是string類型的field和value的映射表,適合存儲對象。
  • 列表(list):按插入順序排序,可包含重復元素,類似Java中的LinkedList。
  • 集合(set):無序集合,無重復元素,類似Java中的HashSet。
  • 有序集合(sorted set/zset):集合中元素關聯分數,根據分數升序排序,無重復元素。

Redis常用命令

  • 字符串操作命令:如“SET”設置指定key的值,“GET”獲取指定key的值,“SETEX”設置值并設過期時間,“SETNX”在key不存在時設置值等。
  • 哈希操作命令:像“HSET”設置哈希表中字段的值,“HGET”獲取指定字段的值,“HDEL”刪除指定字段,“HKEYS”獲取所有字段,“HVALS”獲取所有值等。
  • 列表操作命令:例如“LPUSH”將值插入列表頭部,“LRANGE”獲取列表指定范圍元素,“RPOP”移除并獲取最后一個元素,“LLEN”獲取列表長度,“BRPOP”移出并獲取最后元素(可阻塞等待)等。
  • 集合操作命令:包含“SADD”向集合添加成員,“SMEMBERS”返回集合所有成員,“SCARD”獲取集合成員數,“SINTER”返回交集,“SUNION”返回并集,“SREM”移除集合成員等。
  • 有序集合操作命令:有“ZADD”添加成員,“ZRANGE”通過索引區間返回成員(可帶分數),“ZINCRBY”對成員分數增加增量,“ZREM”移除成員等。
  • 通用命令:不分數據類型,如“KEYS”查找符合模式的key,“EXISTS”檢查key是否存在,“TYPE”返回key儲存值的類型,“DEL”刪除key,“rename”重命名,“ping”測試連接,“expire”設置key存活時間,“ttl”返回key剩余生存時間等。

在Java中操作Redis

  • Redis的Java客戶端:常用的有Jedis、Lettuce、Spring Data Redis等,重點學習Spring Data Redis,Spring Boot項目中提供對應的Starter方便使用。
  • Spring Data Redis使用方式
    • 環境搭建
      • 導入maven坐標:在項目中添加“spring-boot-starter-data-redis”依賴。
      • 配置Redis數據源:在配置文件(如application-dev.yml、application.yml)中指定Redis的主機、端口、密碼、使用的數據庫等信息。
      • 編寫配置類創建RedisTemplate對象:配置類中創建RedisTemplate,設置連接工廠對象及key的序列化器(將默認的修改為StringRedisSerializer),雖然Spring Boot會自動裝配,但修改序列化器能讓存入Redis的數據更符合預期。
      • 通過RedisTemplate對象操作Redis:注入RedisTemplate后,可獲取對應不同數據類型操作的接口對象,如ValueOperations(字符串操作)、HashOperations(哈希操作)等,進而操作不同類型數據。
    • 操作常見類型數據:通過編寫具體的測試方法,利用對應的操作接口對象,實現對字符串、哈希、列表、集合、有序集合類型數據以及通用命令的操作示例,如對字符串的存取值、設置過期等操作,對哈希類型的增刪改查操作等。

店鋪營業狀態設置

  • 需求分析和設計
    • 產品原型:后臺可設置餐廳營業狀態(營業中/打烊中),不同狀態決定用戶能否在小程序下單,點擊營業狀態按鈕可更改狀態。
    • 接口設計:包含設置營業狀態、管理端查詢營業狀態、用戶端查詢營業狀態三個接口,雖查詢的營業狀態一致,但因管理端和用戶端請求前綴不同,分為兩個接口實現。
    • 營業狀態存儲方式:基于Redis的字符串存儲,約定1表示營業,0表示打烊。
  • 代碼開發
    • 設置營業狀態:在“sky-server”模塊創建“ShopController”類,編寫“setStatus”方法,通過注入的RedisTemplate對象將營業狀態值存入Redis。
    • 管理端查詢營業狀態:在“ShopController”類中編寫“getStatus”方法,從Redis中獲取營業狀態值返回。
    • 用戶端查詢營業狀態:在“com.sky.controller.user”包下創建“ShopController”類,同樣編寫“getStatus”方法從Redis獲取并返回營業狀態值。
  • 功能測試
    • 接口文檔測試:啟動服務訪問接口文檔,登錄獲取token后,分別進行設置營業狀態、管理端和用戶端查詢營業狀態的操作,查看控制臺日志及Redis中數據驗證功能。
    • 接口分組展示:通過修改配置類(如“WebMvcConfiguration.java”),分別掃描管理端和用戶端接口所在包,生成不同分組的接口文檔,方便區分。
    • 前后端聯調測試:啟動nginx訪問項目,進入后臺操作營業狀態設置,查看狀態變化驗證功能。

第六天、微信小程序開發

HttpClient

  • 介紹
    • 是Apache Jakarta Common下的子項目,用于提供支持HTTP協議的客戶端編程工具包,能發送HTTP請求及接收響應數據,支持HTTP協議最新版本與建議。
    • 有諸多應用場景,如掃描支付、查看地圖等功能實現中,應用程序需訪問對應服務發送HTTP請求并接收響應,就可借助HttpClient來完成。
    • 有HttpClient、HttpClients、CloseableHttpClient、HttpGet、HttpPost等核心API,使用時需按創建HttpClient對象、創建Http請求對象、調用execute方法發送請求的步驟操作。
    • 通過maven坐標“org.apache.httpcomponents:httpclient:4.5.13”引入依賴(不過項目中若引入了特定依賴如aliyun-sdk-oss,其底層已包含HttpClient相關依賴,可選擇不單獨導入)。
  • 入門案例
    • GET方式請求:在Java程序中,先創建HttpClient對象(如使用HttpClients.createDefault()),再創建HttpGet請求對象(指定請求的URL),接著調用HttpClient的execute方法發送請求,獲取響應結果后解析,最后關閉相關資源。示例中發送請求到“http://localhost:8080/user/shop/status”并輸出服務端返回狀態碼與數據。
    • POST方式請求:同樣先創建HttpClient對象,然后創建HttpPost請求對象,對于攜帶參數的POST請求,需將參數封裝為請求體對象(如StringEntity)并設置到請求對象中(指定編碼方式、數據格式等),后續發送請求、解析響應結果以及關閉資源的步驟與GET請求類似。示例中發送請求到“http://localhost:8080/admin/employee/login”并輸出響應碼與響應數據。

微信小程序開發

  • 介紹:是一種可在微信內便捷獲取與傳播、體驗出色的開放能力,不同注冊主體(個人、企業、政府、媒體等)開發權限有別,比如個人身份注冊小程序無法開通支付權限。微信官方提供了開發文檔、開發者工具、設計指南以及體驗DEMO等幫助開發者開發,開發完上線也有詳細接入流程。
  • 準備工作
    • 注冊小程序:通過指定注冊地址(https://mp.weixin.qq.com/wxopen/waregister?action=step1 )進行,注冊時要選擇合適主體。
    • 完善小程序信息:登錄小程序后臺(https://mp.weixin.qq.com/ )完善信息、類目等,并查看小程序的AppID。
    • 下載開發者工具:資料中若已提供則無需下載,熟悉下載步驟即可,下載地址為https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html ,使用時需掃描登錄、創建小程序項目,還可設置不校驗合法域名(開發階段若不勾選,請求發送到后端服務器可能失敗)。
  • 入門案例
    • 小程序目錄結構:主體部分含app.js(存放邏輯代碼)、app.json(配置文件,存放公共配置)、app.wxss(存放公共樣式表,非必須);每個頁面又由js文件(存放業務邏輯代碼)、wxml文件(存放頁面結構,類似HTML頁面)、json文件(存放頁面相關配置,非必須)、wxss文件(存放頁面樣式表,類似CSS文件)組成。
    • 編寫和編譯小程序:在對應文件(如index.wxml編寫頁面布局,index.js編寫業務邏輯代碼)編寫代碼后點擊編譯按鈕運行查看效果,運行時若涉及請求后端服務(如發送請求到“http://localhost:8080/user/shop/status”),需先啟動后臺項目,同時要設置不校驗合法域名以防請求失敗。
    • 發布小程序:代碼開發完點擊上傳按鈕指定版本號上傳到微信服務器,此時為開發版本,還需進到微信公眾平臺的版本管理頁面提交審核變為審核版本,審核通過后發布成線上版本,這樣微信用戶就能搜索使用該小程序了。

微信登錄

  • 導入小程序代碼:因小程序開發偏前端,后端開發為主時可直接導入已提供的小程序代碼到微信開發者工具使用,導入時填寫自己的AppID,還需根據實際情況修改后端服務的ip地址和端口號(修改配置文件中對應項)。
  • 微信登錄流程
    • 小程序端先調用wx.login()獲取code(授權碼,每次獲取只能使用一次),再調用wx.request()攜帶code請求開發者服務器。
    • 開發者服務端通過HttpClient向微信接口服務發送請求(攜帶appId、appsecret、code三個參數),接收返回的session_key、opendId(微信用戶唯一標識)等數據后,自定義登錄態生成令牌(token)和openid等返回給小程序端,方便后續請求身份校驗。
    • 小程序端收到后存儲,后續發起業務請求時攜帶token,開發者服務端收到請求后通過token解析登錄用戶id進行身份校驗,校驗通過處理業務邏輯并返回業務數據。可使用Postman按流程進行測試。
  • 需求分析和設計
    • 產品原型:用戶進入小程序需微信授權登錄才能點餐,登錄要獲取用戶昵稱、頭像等信息,新用戶首次使用自動完成注冊存到數據庫。
    • 接口設計:小程序端獲取授權碼后發給后端,后端請求微信接口服務最終返回openid和token等數據,設計出接口的請求參數(如傳入用戶登錄相關的code)和返回數據(包含用戶id、openid、token等),請求路徑為/user/user/login。
    • 表設計:用戶首次使用小程序自動注冊時,用戶信息存儲到user表,表中包含id、openid、name、phone等字段,其中手機號字段獲取權限因小程序注冊主體不同而有差異(個人注冊小程序通常拿不到微信用戶手機號)。
  • 代碼開發
    • 定義相關配置:在配置文件(如application-dev.yml、application.yml)中配置微信登錄所需的appid、secret以及為微信用戶生成jwt令牌時用到的相關配置項(如簽名加密秘鑰、過期時間、令牌名稱等)。
    • DTO設計:根據傳入參數設計UserLoginDTO類,包含如code等屬性,用于接收小程序端傳入的登錄相關數據。
    • VO設計:根據返回數據設計UserLoginVO類,包含id、openid、token等屬性,用于返回給小程序端登錄相關結果數據。
    • Controller層:在UserController中創建login方法,接收UserLoginDTO參數,先調用Service層的wxLogin方法實現微信登錄,再為微信用戶生成jwt令牌,最后構建UserLoginVO對象返回給小程序端。
    • Service層接口與實現類:UserService接口定義wxLogin方法,UserServiceImpl實現類中wxLogin方法先調用getOpenid方法獲取微信用戶openid,判斷是否為空(為空則登錄失敗拋異常),再判斷用戶是否新用戶(新用戶自動注冊插入數據庫),getOpenid方法通過HttpClientUtil向微信接口服務發送請求獲取openid。
    • Mapper層:UserMapper接口定義根據openid查詢用戶、插入用戶數據的方法,對應的UserMapper.xml映射文件實現插入用戶數據的SQL語句。
    • 編寫攔截器:編寫JwtTokenUserInterceptor攔截器,用于攔截用戶端請求進行jwt校驗,從請求頭獲取令牌并校驗,校驗通過設置當前用戶id到上下文,校驗不通過響應401狀態碼;在WebMvcConfiguration配置類中注冊攔截器,指定攔截路徑和排除的路徑(如登錄接口、查詢店鋪營業狀態接口不攔截)。
  • 功能測試:重新編譯小程序進行登錄,可獲取到openid和token數據,查看后臺日志以及數據庫user表驗證功能(首次登錄會自動注冊新用戶到表中)。

導入商品瀏覽功能代碼

  • 需求分析和設計
    • 產品原型:用戶登錄成功進入首頁,按分類展示菜品和套餐,菜品根據是否設置口味信息展示不同按鈕,同時有菜品列表、口味、套餐列表、套餐詳情等不同效果圖展示相應展示要求。
    • 接口設計:先粗粒度設計包含查詢分類、根據分類id查詢菜品、根據分類id查詢套餐、根據套餐id查詢包含的菜品這4個接口,然后細粒度分析明確各接口的請求方式、請求路徑、傳入參數和返回值。
  • 代碼導入:按mapper、service、controller順序導入資料中的商品瀏覽功能代碼到sky-server模塊中。
    • Mapper層:在SetmealMapper.java添加查詢套餐、根據套餐id查詢菜品選項的方法,創建SetmealMapper.xml文件實現動態條件查詢套餐的SQL語句;在DishService.java添加條件查詢菜品和口味的方法定義,在DishServiceImpl.java實現該方法(查詢菜品及對應的口味信息)。
    • Service層:創建SetmealService.java接口定義條件查詢、根據id查詢菜品選項等方法,SetmealServiceImpl.java實現類實現相應業務邏輯;在DishService相關類中完善條件查詢菜品和口味的方法定義與實現。
    • Controller層:分別創建DishController.java、CategoryController.java、SetmealController.java,在各控制器類中編寫對應接口方法(如根據分類id查詢菜品、查詢分類、根據分類id查詢套餐及根據套餐id查詢菜品列表等),調用Service層方法處理業務并返回結果。
  • 功能測試:重啟服務器、重新編譯小程序,微信登錄進入首頁后測試菜品和套餐分類查詢、具體分類下菜品查詢、菜品口味查詢等功能是否正常展示。
  • 代碼提交:按常規操作流程進行代碼提交。

第七天、緩存菜品、購物車功能的實現

緩存菜品

  • 問題說明:用戶端小程序展示菜品數據依賴查詢數據庫,訪問量較大時會增大數據庫訪問壓力,導致系統響應慢、用戶體驗差。
  • 實現思路:利用Redis緩存菜品數據減少數據庫查詢,緩存邏輯為每個分類下的菜品保存一份緩存數據,且數據庫中菜品數據變更時清理對應緩存數據。
  • 代碼開發
    • 用戶端接口修改:在DishController的list方法中,先從Redis查詢菜品數據,若存在則直接返回;若不存在則查詢數據庫,將結果存入Redis后再返回。
    • 管理端接口優化:在管理端DishController中添加cleanCache方法用于清理緩存數據,然后在新增菜品、批量刪除菜品、修改菜品、菜品起售停售等相關方法中調用cleanCache方法,保證數據庫與Redis數據一致性。
  • 功能測試:可通過查看控制臺sql、前后端聯調、查看Redis緩存數據等方式測試。例如首次查詢菜品分類時從數據庫查詢并緩存到Redis,再次查詢相同分類直接從Redis獲取;修改菜品數據后能清空對應緩存,保證下次訪問時重新從數據庫查詢并更新緩存數據。
  • 代碼提交:按照常規步驟提交代碼,與其他功能代碼提交后續操作類似。

緩存套餐

  • Spring Cache介紹
    • 概述:是實現基于注解的緩存功能的框架,提供了抽象層,底層可切換不同緩存實現(如EHCache、Caffeine、Redis等)。
    • 常用注解
      • @EnableCaching:開啟緩存注解功能,加在啟動類上。
      • @Cacheable:方法執行前先查緩存有無數據,有則直接返回,無則調用方法并將返回值存入緩存。
      • @CachePut:將方法的返回值放入緩存。
      • @CacheEvict:從緩存中刪除一條或多條數據。
    • 入門案例:展示了在不同場景下各注解的使用,如在保存用戶信息的方法上加@CachePut將數據存入緩存;在查詢用戶信息的方法上加@Cacheable實現先查緩存,無數據再查數據庫并緩存結果;在刪除用戶信息的方法上加@CacheEvict清理指定緩存。
  • 實現思路:導入Spring Cache和Redis相關maven坐標,在啟動類加@EnableCaching注解開啟緩存功能,在用戶端接口SetmealController的list方法上加@Cacheable注解緩存套餐數據,在管理端接口SetmealController的相關修改、刪除、起售停售等方法上加CacheEvict注解清理緩存。
  • 代碼開發:按照實現思路在項目中添加相應依賴、注解等代碼實現緩存套餐功能。
  • 功能測試:通過前后端聯調并觀察redis中緩存的套餐數據來測試,與緩存菜品功能測試方法類似。
  • 代碼提交:按照既定流程提交代碼,與其他功能代碼提交后續操作一樣。

添加購物車

  • 需求分析和設計
    • 產品原型:用戶可將菜品(設置口味信息的需選規格后)或套餐添加到購物車,購物車中能修改商品數量、清空購物車。
    • 接口設計:設計添加購物車接口,傳入參數可能是菜品id或套餐id。
    • 表設計:購物車數據存于shopping_cart表,表中記錄用戶id、菜品或套餐相關id、口味、數量、單價、創建時間等信息,同一商品選多份只需更新數量字段。
  • 代碼開發
    • DTO設計:根據接口參數設計ShoppingCartDTO類,包含菜品id、套餐id、菜品口味等屬性。
    • 各層代碼實現
      • Controller層:創建ShoppingCartController,其中add方法接收ShoppingCartDTO參數,調用Service層的addShoppingCart方法(后續實現)添加購物車。
      • Service層接口與實現類:ShoppingCartService接口定義addShoppingCart方法,ShoppingCartServiceImpl實現類中該方法先判斷商品是否已在購物車,若已存在則更新數量,不存在則根據是菜品還是套餐插入相應數據到購物車。
      • Mapper層:創建ShoppingCartMapper接口及對應的ShoppingCartMapper.xml,定義條件查詢、更新數量、插入數據等方法及對應的SQL語句。
  • 功能測試:進入小程序添加菜品到購物車,通過查詢數據庫(因暫未實現查看購物車功能)查看購物車數據,前后端聯調時可通過斷點查看運行步驟。
  • 代碼提交:按常規操作提交代碼,后續步驟與其他功能代碼提交相同。

查看購物車

  • 需求分析和設計:產品原型體現用戶添加完商品后可進入購物車查看菜品和套餐,接口設計明確了查看購物車接口相關的請求、返回信息。
  • 代碼開發
    • Controller層:在ShoppingCartController中創建list方法,調用Service層的showShoppingCart方法(后續實現)并返回結果。
    • Service層接口與實現類:ShoppingCartService接口聲明showShoppingCart方法,ShoppingCartServiceImpl實現類中該方法通過查詢數據庫獲取當前用戶的購物車數據并返回。
  • 功能測試:進入小程序會發起查看購物車請求,點擊購物車圖標能看到購物車內容則測試成功。
  • 代碼提交:按正常流程提交代碼,與其他功能代碼提交后續步驟一致。

清空購物車

  • 需求分析和設計:產品原型展示點擊清空按鈕可清空購物車所有數據,接口設計明確了清空購物車接口相關的請求等信息。
  • 代碼開發
    • 各層代碼實現
      • Controller層:在ShoppingCartController中創建clean方法,調用Service層的cleanShoppingCart方法(后續實現)。
      • Service層接口與實現類:ShoppingCartService接口聲明cleanShoppingCart方法,ShoppingCartServiceImpl實現類中該方法通過Mapper層的deleteByUserId方法刪除當前用戶的購物車數據。
      • Mapper層:在ShoppingCartMapper接口中創建deleteByUserId方法,定義根據用戶id刪除購物車數據的SQL語句。
  • 功能測試:進入購物車頁面點擊清空按鈕后,查看數據庫確認當前用戶購物車數據已全部刪除則測試成功。
  • 代碼提交:按常規操作提交代碼,后續步驟與其他功能代碼提交相同。

第八天、微信支付功能實現

根據上傳的文件內容,以下是關于“蒼穹外賣-day08”課程的關鍵知識點總結:

1. 導入地址簿功能代碼

1.1 需求分析和設計
  • 產品原型:用戶可以維護自己的地址信息,包括查詢、新增、修改、刪除地址以及設置默認地址。
  • 接口設計:定義了7個接口用于處理地址簿管理的不同操作。
  • 表設計:創建address_book表存儲用戶的地址信息。
1.2 代碼導入
  • Mapper層:實現了與數據庫交互的基本方法,如新增地址、查詢地址等。
  • Service層:提供了業務邏輯處理的服務接口及實現類。
  • Controller層:為前端提供RESTful API接口,以JSON格式響應請求。
1.3 功能測試

通過前后端聯調測試來驗證各個功能點是否正常工作。

2. 用戶下單

2.1 需求分析和設計
  • 產品原型:用戶將菜品加入購物車后可提交訂單,并完成支付。
  • 表設計:設計了orders(訂單表)和order_detail(訂單明細表)兩個數據表,用以保存訂單相關信息。
2.2 代碼開發
  • DTO設計:定義了傳輸對象OrdersSubmitDTO用于接收用戶提交的訂單信息。
  • VO設計:定義了視圖對象OrderSubmitVO用于返回給用戶的訂單確認信息。
  • Controller層:提供了用戶下單的API接口。
  • Service層接口:聲明了用戶下單的方法。
  • Service層實現類:實現了訂單創建的具體邏輯,包括異常情況的處理。
  • Mapper層:實現了訂單及其明細數據的插入操作。
2.3 功能測試

完成了從去結算到支付成功的整個流程測試。

3. 訂單支付

3.1 微信支付介紹

簡要介紹了微信支付的產品和服務,強調了微信支付接入的重要性。

3.2 微信支付準備工作

討論了確保數據安全的方法,如使用證書進行加密解密,并解釋了如何通過內網穿透技術讓微信后臺能夠調用到本地服務器。

3.3 代碼導入
  • 配置相關屬性:在配置文件中設置了微信支付所需的參數。
  • Mapper層:增加了查詢訂單和更新訂單狀態的方法。
  • Service層:實現了訂單支付和支付成功后的訂單狀態更新邏輯。
  • Controller層:提供了訂單支付的API接口。
  • PayNotifyController:處理來自微信支付的成功回調通知。

3. 訂單支付

3.1 微信支付介紹
  • 微信支付產品:本項目選擇小程序支付。
  • 微信支付接入流程:商戶系統調用微信支付接口生成預支付交易單,用戶支付后微信后臺通知商戶系統支付結果。
  • 微信支付相關接口:包括JSAPI下單和微信小程序調起支付。
3.2 微信支付準備工作
  • 數據安全:使用微信支付平臺證書和商戶私鑰文件保證數據安全。
  • 內網穿透:使用cpolar軟件獲取臨時域名,確保微信后臺可以調用到商戶系統。
3.3 代碼導入
  • 配置文件:配置了微信支付相關的參數。
  • Mapper層:實現了訂單的查詢和更新操作。
  • Service層:實現了訂單支付和支付成功的業務邏輯。
  • Controller層:提供了訂單支付的接口,并處理微信支付的回調通知。
3.4 功能測試
  • 通過前后端聯調測試了訂單支付功能,確保支付流程正常。

總結

  • 地址簿管理:實現了用戶地址的增刪改查功能,支持設置默認地址。
  • 用戶下單:實現了用戶下單功能,生成訂單并清理購物車。
  • 訂單支付:實現了微信支付功能,支持用戶支付訂單并處理支付回調。

通過本次課程,我們掌握了如何實現用戶地址管理、用戶下單和訂單支付功能,并了解了微信支付的基本流程和接口調用方式。

第十天、催單、實時通訊功能實現

1. Spring Task

  • 作用: 用于定時執行任務,適用于需要定時處理的場景,如訂單超時處理、通知提醒等。
  • 使用步驟:
    1. 導入spring-context依賴。
    2. 在啟動類上添加@EnableScheduling注解以開啟任務調度。
    3. 創建定時任務類,并在方法上使用@Scheduled注解,指定cron表達式。
  • cron表達式: 定義任務執行時間的字符串,分為秒、分鐘、小時、日、月、周、年(可選)七個域,支持通配符和特殊字符。

2. WebSocket

  • 作用: 實現瀏覽器與服務器之間的全雙工通信,適用于實時通信場景。
  • 特點: 長連接、雙向通信、基于TCP。
  • 使用步驟:
    1. 前端使用WebSocket API建立連接。
    2. 后端使用@ServerEndpoint注解定義WebSocket服務端點。
    3. 配置WebSocket支持,如注冊ServerEndpointExporter bean。
    4. 實現連接打開、消息接收、連接關閉等回調方法。

3. 來單提醒和客戶催單

  • 設計思路:
    • 使用WebSocket保持管理端與服務器的長連接。
    • 當用戶支付成功或點擊催單時,服務器通過WebSocket向管理端推送消息。
    • 管理端解析消息并進行相應的提示和語音播報。
  • 實現細節:
    • 在支付成功和催單方法中,通過WebSocket向所有客戶端發送消息。
    • 消息格式為JSON,包含類型、訂單ID和內容字段。
    • 管理端根據消息類型進行不同的處理。

4. 代碼結構和提交

  • 代碼結構: 按模塊劃分,如sky-server模塊包含業務邏輯、數據訪問層等。
  • 代碼提交: 按功能模塊進行提交,確保每次提交的代碼完整且有明確的提交信息。

5. 功能測試

  • 測試方法: 通過瀏覽器調試工具查看數據交互,進行前后端聯調。
  • 測試步驟:
    • 登錄管理端,建立WebSocket連接。
    • 在小程序端進行下單支付和催單操作。
    • 查看管理端是否收到相應的提醒和語音播報。

6. 其他注意事項

  • cron表達式生成器: 使用在線工具生成cron表達式,避免手動編寫錯誤。
  • WebSocket安全: 考慮WebSocket連接的安全性,如添加身份驗證和授權機制。
  • WebSocket重連: 處理網絡波動導致的連接中斷,實現自動重連機制。

第十一天、echart、用戶統計、訂單統計、銷量功能實時顯示

1. Apache ECharts

  • 介紹:基于Javascript的數據可視化圖表庫,可提供直觀、生動、可交互且能個性化定制的數據可視化圖表,本質是對數據進行可視化展示,常見效果有柱形圖、餅形圖、折線圖等,官網地址為https://echarts.apache.org/zh/index.html。
  • 入門案例
    • 實現步驟:引入echarts.js文件、為ECharts準備設置寬高的DOM、初始化echarts實例、指定圖表配置項和數據、使用配置項和數據顯示圖表。
    • 代碼開發示例:給出了HTML頁面中相關的代碼結構,包括腳本的引入、DOM元素的定義以及具體配置項和圖表顯示的代碼邏輯。
    • 測試方式:通過瀏覽器打開頁面即可,使用Echarts重點在于研究圖表所需的數據格式,后端需按前端要求返回相應格式數據。

2. 營業額統計

  • 需求分析和設計
    • 產品原型:基于折線圖按天展示營業額,光標放對應點可展示具體數值,日期由時間選擇器決定,營業額指已完成訂單金額合計,X軸為日期,Y軸為營業額。
    • 接口設計:需根據原型圖設計接口,后端要適配前端對數據格式的要求。
  • 代碼開發
    • VO設計:定義TurnoverReportVO類,包含日期列表和營業額列表字段,用逗號分隔對應數據,在sky-pojo模塊中實現。
    • Controller層:創建ReportController類,提供turnoverStatistics方法用于營業額數據統計,接收日期參數并返回對應結果。
    • Service層接口與實現類:ReportService接口聲明getTurnover方法,ReportServiceImpl實現類實現該方法,通過調用Mapper層方法結合相關業務邏輯計算并封裝營業額數據。
    • Mapper層:在OrderMapper接口聲明sumByMap方法,并在OrderMapper.xml文件編寫動態SQL用于根據動態條件統計營業額。
  • 功能測試:可通過接口文檔測試、前后端聯調測試,示例展示了查看近7日、近30日營業額統計情況及查看返回數據的操作。
  • 代碼提交:按常規步驟提交代碼,給出對應截圖示意,與其他功能代碼提交后續步驟一致。

3. 用戶統計

  • 需求分析和設計
    • 產品原型:通過折線圖展示用戶總量和新增用戶數量,基于可視化報表,X軸為日期,Y軸為用戶數,根據時間選擇區間展示對應數據。
    • 接口設計:依照原型圖設計接口。
  • 代碼開發
    • VO設計:定義UserReportVO類,包含日期、用戶總量、新增用戶列表字段,以逗號分隔對應數據,位于sky-pojo模塊。
    • Controller層:在ReportController中創建userStatistics方法,用于獲取用戶數據統計結果。
    • Service層接口與實現類:ReportService接口聲明getUserStatistics方法,ReportServiceImpl實現類實現該方法,通過循環計算不同日期下新增用戶數和總用戶數并封裝返回。
    • Mapper層:在UserMapper接口聲明countByMap方法,在對應xml文件編寫動態SQL用于根據動態條件統計用戶數量。
  • 功能測試:可采用接口文檔測試、前后端聯調測試,展示了查看近7日、近30日用戶統計情況及查看返回數據的操作。
  • 代碼提交:按常規步驟提交代碼,給出對應截圖示意,與其他功能代碼提交后續步驟一致。

4. 訂單統計

  • 需求分析和設計
    • 產品原型:用折線圖展示訂單總數和有效訂單數(已完成狀態訂單),同時展示所選時間區間內的總訂單數、有效訂單數、訂單完成率,X軸為日期,Y軸為訂單數量。
    • 接口設計:根據原型圖設計相應接口。
  • 代碼開發
    • VO設計:定義OrderReportVO類,包含日期、每日訂單數、每日有效訂單數、訂單總數、有效訂單數、訂單完成率等字段,在sky-pojo模塊中定義。
    • Controller層:在ReportController里創建orderStatistics方法用于獲取訂單數據統計結果。
    • Service層接口與實現類:ReportService接口聲明getOrderStatistics方法,ReportServiceImpl實現類實現該方法,通過循環統計每天訂單相關數據,并計算時間區間內總訂單數、有效訂單數及訂單完成率后封裝返回。
    • Mapper層:在OrderMapper接口聲明countByMap方法,在對應xml文件編寫動態SQL實現根據動態條件統計訂單數量。
  • 功能測試:能通過接口文檔測試、前后端聯調測試,展示了查看近7日、近30日訂單統計情況及查看返回數據的操作。
  • 代碼提交:按常規步驟提交代碼,給出對應截圖示意,與其他功能代碼提交后續步驟一致。

5. 銷量排名Top10

  • 需求分析和設計
    • 產品原型:針對菜品和套餐銷售數量進行排名,通過柱形圖降序展示銷量排名前十的商品,根據時間選擇區間展示相應數據,銷量指商品銷售份數。
    • 接口設計:依據原型圖來設計接口。
  • 代碼開發
    • VO設計:定義SalesTop10ReportVO類,包含商品名稱列表和銷量列表字段,以逗號分隔對應數據,在sky-pojo模塊中定義。
    • Controller層:在ReportController中創建top10方法用于獲取銷量排名統計結果。
    • Service層接口與實現類:ReportService接口聲明getSalesTop10方法,ReportServiceImpl實現類實現該方法,調用Mapper層方法獲取商品銷量排名數據并進行封裝返回。
    • Mapper層:在OrderMapper接口聲明getSalesTop10方法,在對應xml文件編寫動態SQL實現查詢商品銷量排名。
  • 功能測試:可利用接口文檔測試、前后端聯調測試,展示了查看近30日銷量排名Top10統計情況及查看返回數據的操作,若某時間段無銷量數據則可能無展示效果。
  • 代碼提交:按常規步驟提交代碼,給出對應截圖示意,與其他功能代碼提交后續步驟一致。

第十二天、導出數據Excel表、工作臺數據功能完善

1. 工作臺

  • 需求分析和設計
    • 產品原型:作為系統運營的數據看板與快捷操作入口,展示今日數據、訂單管理、菜品總覽、套餐總覽、訂單信息等內容,還對營業額、有效訂單、訂單完成率、平均客單價、新增用戶等名詞做了解釋。
    • 接口設計:依據原型圖分析得出共6個接口,包含今日數據、訂單管理、菜品總覽、套餐總覽、訂單搜索(已完成)、各個狀態的訂單數量統計(已完成)等接口,并分別展示了各接口相關設計內容。
  • 代碼導入
    • Controller層:WorkSpaceController.java中定義了如工作臺今日數據查詢、訂單管理數據查詢等多個方法,通過調用WorkspaceService的對應方法并返回相應結果。
    • Service層接口:WorkspaceService.java聲明了根據時間段統計營業數據、查詢訂單管理數據等多個方法,為業務邏輯提供接口定義。
    • Service層實現類:WorkspaceServiceImpl.java實現了WorkspaceService中的方法,在各方法中通過調用對應Mapper層方法結合業務邏輯計算并返回如營業數據、訂單管理數據、菜品及套餐總覽數據等。
    • Mapper層:在SetmealMapper和DishMapper中分別添加countByMap方法定義,并在對應xml文件編寫SQL實現,用于根據條件統計套餐和菜品數量。
  • 功能測試
    • 接口文檔測試:啟動服務后訪問接口文檔地址,使用admin用戶登錄重新獲取token并設置全局參數防止失效,分別對今日數據查詢、菜品總覽查詢、訂單管理數據查詢、套餐總覽查詢等接口進行測試并展示對應測試結果截圖。
    • 前后端聯調測試:啟動nginx后訪問對應網址進入工作臺,進入開發者模式分別查看今日數據、訂單管理、菜品總覽、套餐總覽等相關內容,并展示對應測試結果截圖。
  • 代碼提交:給出代碼提交相關截圖示意,后續步驟和其他功能代碼提交一致。

2. Apache POI

  • 介紹:處理Miscrosoft Office各種文件格式的開源項目,通常用于Java程序中對Miscrosoft Office文件(尤其是Excel文件)進行讀寫操作,介紹了其常見應用場景,如銀行網銀系統導出交易明細、業務系統導出Excel報表、批量導入業務數據等,并展示了相關場景示例圖。
  • 入門案例
    • 將數據寫入Excel文件
      • 代碼開發:展示了使用Apache POI將數據寫入Excel文件的Java代碼示例,包括創建Excel文件對象、Sheet頁、行及單元格,設置單元格值,通過輸出流將內存中Excel文件寫入磁盤等操作。
      • 實現效果:在指定路徑生成Excel文件并成功寫入對應內容,展示了生成文件的截圖示例。
    • 讀取Excel文件中的數據
      • 代碼開發:呈現了利用Apache POI讀取Excel文件數據的Java代碼示例,涵蓋通過輸入流讀取文件、獲取Sheet頁、遍歷行及單元格并獲取其中文本內容等操作。
      • 實現效果:實現對指定Excel文件數據的讀取,并展示讀取后控制臺輸出內容的截圖示例。

3. 導出運營數據Excel報表

  • 需求分析和設計
    • 產品原型:在數據統計頁面點擊數據導出按鈕可下載Excel格式文件,包含最近30日運營相關數據,分為概覽數據和明細數據兩部分,按固定表格形式填充數字后可存檔。
    • 接口設計:根據原型圖設計接口,該接口無參數傳遞(后端自行計算最近30天運營數據),也無返回數據(報表導出本質是文件下載,通過輸出流將Excel文件下載到客戶端瀏覽器)。
  • 代碼開發
    • 實現步驟:明確設計Excel模板文件、查詢近30天運營數據、將數據寫入模板文件、通過輸出流下載Excel文件到客戶端瀏覽器這幾個步驟。
    • Controller層:在ReportController中創建export方法,調用ReportService的exportBusinessData方法用于導出運營數據報表。
    • Service層接口與實現類:ReportService接口聲明exportBusinessData方法,ReportServiceImpl實現類實現該方法,先獲取近30天時間范圍,查詢對應運營數據,加載模板文件創建Excel對象,將數據填充到Excel的對應單元格后通過輸出流下載文件到客戶端瀏覽器,并對可能出現的IOException做異常處理。
  • 功能測試:采用前后端聯調測試,進入數據統計頁面點擊數據導出按鈕,成功下載Excel報表并展示對應截圖示例。
  • 代碼提交:給出代碼提交相關截圖示意,后續步驟和其他功能代碼提交一致。

總結

蒼穹外賣項目學習總結

蒼穹外賣項目是一個綜合性的在線餐飲服務平臺,涵蓋了從用戶端到管理端的一系列功能模塊。通過這12天的學習,對項目整體架構、業務流程以及相關技術有了深入的理解和掌握。

功能模塊概述

  1. 基礎功能模塊:包括員工管理、菜品分類管理、菜品管理、店鋪營業狀態設置等。員工管理實現了員工信息的增刪改查,菜品分類管理和菜品管理確保了菜品體系的有序構建,店鋪營業狀態設置靈活控制店鋪營業與否。
  2. 用戶交互模塊:用戶可通過微信登錄進入小程序,進行商品瀏覽、添加購物車、下單、支付等操作。商品瀏覽展示菜品和套餐,購物車功能方便用戶管理選購商品,下單與支付流程完整流暢,同時地址簿管理使用戶能便捷維護收貨地址。
  3. 數據統計與展示模塊:利用Apache ECharts實現數據可視化,通過折線圖、柱狀圖展示營業額、用戶數據、訂單數據和銷量排名等統計信息,幫助商家直觀了解運營狀況。工作臺集成了今日數據、訂單管理、菜品及套餐總覽等功能,提供數據看板與快捷操作入口。
  4. 報表導出模塊:借助Apache POI實現運營數據的Excel報表導出,便于商家存檔與數據分析。

技術要點總結

  1. 后端技術:采用Spring Boot框架構建項目,集成MyBatis進行數據庫操作,使用Spring Data Redis實現緩存功能,提高系統性能。HttpClient用于發送HTTP請求,實現與外部服務的交互,如微信登錄、微信支付等功能。
  2. 前端技術(小程序):基于微信小程序開發框架,運用JavaScript語言進行頁面邏輯編寫,通過WXML構建頁面結構,WXSS定義頁面樣式,實現用戶端的交互功能。

項目收獲與體會

  1. 技術能力提升:熟練掌握了前后端開發技術的整合應用,包括數據庫設計與操作、接口開發、緩存策略等,提升了系統架構設計和性能優化能力。
  2. 業務理解深化:深入理解餐飲外賣業務流程,明確各功能模塊間的協作關系,能更好地從業務需求出發進行功能設計與開發。
  3. 問題解決能力增強:在項目開發過程中遇到各種問題,如數據一致性維護、接口對接等,通過分析與調試,有效提升了問題解決能力。

展望未來

蒼穹外賣項目為進一步開發提供了良好基礎,后續可考慮優化用戶體驗,如提升頁面加載速度、優化支付流程;拓展功能,如增加會員體系、營銷活動功能;加強系統安全,保障用戶數據和交易安全等。

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

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

相關文章

windows C#-使用構造函數

實例化類或結構時,將會調用其構造函數。 構造函數與該類或結構具有相同名稱,并且通常初始化新對象的數據成員。 在下面的示例中,通過使用簡單構造函數定義了一個名為 Taxi 的類。 然后使用 new 運算符對該類進行實例化。 在為新對象分配內存…

研發效能DevOps: Vite 使用 Element Plus

目錄 一、實驗 1.環境 2.初始化前端項目 3.安裝 vue-route 4.安裝 pinia 5.安裝 axios 6.安裝 Element Plus 7.gitee創建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、問題 1.README.md 文檔推送到gitee未自動換行 2.訪問login頁面顯示空白 3.表單輸入賬戶…

5G 模組 RG500Q常用AT命令

5G 模組 RG500Q常用AT命令 5G 模組 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…

NVIDIA DeepStream插件之Gst-nvtracker

NVIDIA DeepStream插件之Gst-nvtracker 1. 源由2. 基礎知識3. Gst-nvtracker插件3.1 插件參數3.2 插件API接口 4. 分析問題5. 總結6. 參考資料 1. 源由 這篇的主要目的是稍微吐槽下NVIDIA的設計,當然其實他們做的還是不錯的(從系統架構設計角度看&#…

進程內存轉儲工具|內存鏡像提取-取證工具

1.內存轉儲,內存轉儲(Memory Dump)是將計算機的物理內存(RAM)內容復制到一個文件中的過程,這個文件通常被稱為“內存轉儲文件”或“核心轉儲文件”(Core Dump),內存轉儲的主要目的是…

Lua語言入門 - Lua 面向對象

Lua 面向對象 面向對象編程(Object Oriented Programming,OOP)是一種非常流行的計算機編程架構,通過創建和操作對象來設計應用程序。 以下幾種編程語言都支持面向對象編程: CJavaObjective-CSmalltalkC#Ruby Lua 是…

Pyqt6在lineEdit中輸入文件名稱并創建或刪除JSON文件

1、創建JSON文件 代碼 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(請輸入模塊名稱)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

【Leetcode 熱題 100】236. 二叉樹的最近公共祖先

問題背景 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 最近公共祖先的定義為:對于有根樹 T T T 的兩個節點 p p p、 q q q,最近公共祖先表示為一個節點 x x x,滿足 x x x 是 p p p、 q q q 的祖先且 x x x 的深度盡可能大…

數據結構--堆的向上調整和向下調整

文章目錄 1.完全二叉樹2.堆向上調整3.堆向下調整4.測試代碼 1.完全二叉樹 下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明: 邏輯結構就是我們自己認為的進行購想出來的; 但是這個物理結構卻是我們的這個數據結構在內存里面的真是…

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用,管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足,創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…

“魔法糖果盒的秘密:用樸素貝葉斯算法猜糖果顏色”

想象一下,你有一個神奇的糖果盒,這個糖果盒里有兩種糖果:紅色的和藍色的。你閉上眼睛,從盒子里拿出一個糖果,然后嘗一嘗,你想知道這個糖果是紅色的還是藍色的。樸素貝葉斯算法就像是一個魔法規則&#xff0…

Transform組件的用法

文章目錄 1. 概念介紹2. 使用方法3. 示例代碼我們在上一章回中介紹了Checkbox Widget相關的內容,本章回中將介紹Transform Widget.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的Transform是一種容器類widget,它和Container組件類似。它可以包含其它的組件…

go面試問題

1 Go的內存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http狀態碼 300 請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 301 永久移動。請求的資源已被永久的移動到新U…

康冠科技嵌入式面試題及參考答案

LCD 驅動你自己做了哪些內容? 在 LCD 驅動開發中,首先是硬件層面的理解。需要仔細研究 LCD 的數據手冊,明確其引腳定義,包括電源引腳、數據引腳、控制引腳等。比如,對于常見的 RGB 接口 LCD,要清楚哪幾個引腳是用于傳輸紅、綠、藍三種顏色的數據,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加觸屏驅動

一)增加驅動代碼gt9xxx.c和ctiic.c到工程中的BSP目錄下: 二)更改觸摸文件STM32TouchController.cpp 1)在STM32TouchController.cpp文件中增加: #include “gt9xxx.h” 2)增加gt9xxx_init(); void STM32TouchControlle…

初識面向對象晨考day09

1.類和對象什么關系 類是對象的抽象 對象是類的具體 2.什么是屬性和方法 一類事物共有的特征,使用屬性描述 一類事物共有的行為,使用方法描述 3.普通方法的定義格式 public 返回值類型 方法名(參數列表){} 4.什么是形參,什么是實參 形參是方法…

資源型數字化平臺該如何順利運營?

一、引言 隨著信息技術的迅猛發展,資源型數字化平臺在各領域的重要性日益凸顯。此類平臺整合各類資源,以數字化手段提升資源利用效率與價值,但確保其順利運營面臨諸多挑戰。 二、資源型數字化平臺特點 資源型數字化平臺具有資源整合性&…

GitLab的安裝和使用

1.GitLab 環境說明 系統版本 CentOS 7.2 x86_64 軟件版本 gitlab-ce-10.8.4 GitLab 是一個用于倉庫管理系統的開源項目,使用Git作為代碼管理工具,并在此基礎上搭建起來的web服務。可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能…

Leetcode 串聯所有單詞的子串

算法思想(中文解釋) 這道題目要求我們在字符串 s 中找到所有子串,這些子串是字符串數組 words 中所有單詞的串聯,并且每個單詞只能使用一次,且順序可以任意。下面是代碼的算法思想: 1. 核心思路 分解問題…

解析在OceanBase創建分區的常見問題|OceanBase 用戶問題精粹

在《分區策略和管理分區計劃的實踐方案》這篇文章中,我們介紹了在ODC中制定分區策略及有效管理分區計劃的經驗。有不少用戶在該帖下提出了使用中的問題,其中一個關于創建分區的限制條件的問題,也是很多用戶遭遇的老問題。因此本文以其為切入&…