該專案是自己學習SpringCloud等微服務框架后開發的一個在線預約掛號系統,涵蓋SpringBoot、SpringCloud、Redis、RabbitMQ 、MongoDB、Docker 、阿里云OSS等熱門技術堆疊,能夠幫助從單機開發到分布式微服務開發進階的小伙伴快速掌握相關開發技能,專案已開源,喜歡的小伙伴可以自行下載學習,有任何問題都可以隨時評論交流,
Github開源地址:https://github.com/CONTINUE12/PMP
其他開源進階專案:
基于AWT、Swing及MYSQL開發的學校教務系統_SKS121的博客-CSDN博客
基于Javaweb的超市訂單管理系統SMBMS_SKS121的博客-CSDN博客
基于Spring+SpringMVC+Mybatis的圖書管理系統_SKS121的博客-CSDN博客
基于SpringBoot2.0+Mybatis的學生成績管理系統_SKS121的博客-CSDN博客
基于Spring Boot、Mybatis、MySQL、Lombok、Web Bluetooth API、Thymeleaf、AdminLTE3、JqGrid 的康復外骨骼RIREE遠程互動系統_SKS121的博客-CSDN博客
下面是對專案的整體框架進行概括
專案架構圖 
業務流程圖

一.功能分析
(一)平臺后臺管理系統
1、醫院設定管理
(1)醫院設定串列、添加、鎖定、洗掉
(2)醫院串列、詳情、排班、下線
2、資料管理
(1)資料字典樹形顯示、匯入、匯出
3、用戶管理
(1)用戶串列、查看、鎖定
(2)認證用戶審批
4、訂單管理
(1)訂單串列、詳情
5、統計管理
(1)預約統計
(二)用戶前臺系統
1、首頁資料顯示
(1)醫院串列
2、醫院詳情顯示
(1)醫院科室顯示
3、用戶登錄功能
(1)手機號登錄(短信驗證碼發送)
(2)微信掃描登錄
4、用戶實名認證
5、就診人管理
(1)串列、添加、詳情、洗掉
6、預約掛號功能
(1)排班和掛號詳情資訊
(2)確認掛號資訊
(3)生成預約掛號訂單
(4)掛號訂單支付(微信)
(5)取消預約訂單
7、就醫提醒功能
(三)醫院介面系統
1.醫院串列資訊
2.醫院科室資訊
3.科室排班資訊
4.醫生資訊
二.開發環境
Windows 10,IntelliJ IDEA 2020.2,mysql8.0,maven3.6.1,tomcat9
三.技術堆疊
(一)后端技術堆疊
1、SpringBoot
2、SpringCloud (1)Nacos注冊中心 (2)Feign (3)GateWay
3、Redis (1)使用Redis作為快取 (2)驗證碼有效時間、支付二維碼有效時間
4、MongoDB (1)使用MongoDB存盤醫院相關資料
5、EasyExcel (1)操作excel表格,進行讀和寫操作
6、MyBatisPlus
7、RabbitMQ (1)訂單相關操作時,用mq發送短信訊息給短信消費者
8、Docker (1)下載鏡像 docker pull (2)創建容器 docker run
9、阿里云OSS
10、容聯云短信服務
11、微信登錄/支付
12、定時任務
(二)前端技術堆疊
1、vue
2、Element-ui:管理系統
3、nuxt:用戶系統
4、npm
5、ECharts圖表
四.專案結構設計
(一)后端

1.hospital-manage:醫院介面模擬端(已開發,直接使用)
2.common:公共模塊父節點
common-util:工具類模塊,所有模塊都可以依賴于它
rabbit-util:rabbitmq業務封裝
service-util:service服務的工具包,包含service服務的公共配置類,所有service模塊依賴于它
3.server-gateway:服務網關
4.model:物體類模塊
5.service:api介面服務父節點
service-hosp:醫院api介面服務
service-cmn:公共api介面服務
service-user:用戶api介面服務
service-order:訂單api介面服務
service-oss:檔案api介面服務
service-sms:短信 api介面服務
service-task:定時任務服務
service-statistics:統計api介面服務
6.service-client:feign服務呼叫父節點
service-cmn-client:公共api介面
service-hosp-client:醫院api介面
service-order-client:訂單api介面
(二)前端
1.后臺管理系統

(1)api:用于和后端互動獲取資料
(2)assets:靜態資源
(3)router:路由跳轉
(4)views:顯示頁面
2.用戶系統

(1)api:用于和后端互動獲取資料
(2)assets:靜態資源
(3)layouts:默認頁面
(4)pages:自定義顯示頁面
五.資料庫設計:
1.醫院介面資訊資料庫yygh_cmn
(1)資料資訊表dict

2.平臺管理醫院資訊資料庫yygh_hosp
(1)醫院資訊表hospital_set

3.醫院管理資料庫yygh_manage
(1)醫院資訊表hospital_set

(2)訂單表order_info

(3)醫生排班表schedule

4.用戶訂單資料庫yygh_order
(1)訂單資訊表order_info

(2)訂單支付資訊表payment_info

(3)退款資訊表refund_info

5.用戶資訊資料庫yygh_user
(1)用戶資訊表user_info

(2)就診人資訊表patient

五.維護日志
(1)后臺管理系統中增加用戶訂單管理功能
六.技術要點總結
1.反向代理服務器nginx
(1)使用原因:由于后端有很多服務模塊,每個模塊都有對應的訪問路徑,為了提供統一的api介面,使用nginx作為反向代理服務器
(2)詳情:將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取資料后,再回傳給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址,
注:可用Spring Cloud Gateway網關代替
2.API網關
(1)使用原因:不同的微服務一般會有不同的網路地址,而外部客戶端可能需要呼叫多個服務的介面才能完成一個業務需求,如果讓客戶端直接與各個微服務通信,會有以下的問題:
- 客戶端會多次請求不同的微服務,增加了客戶端的復雜性,
- 存在跨域請求,在一定場景下處理相對復雜,
- 認證復雜,每個服務都需要獨立認證,
- 難以重構,隨著專案的迭代,可能需要重新劃分微服務,例如,可能將多個服務合并成一個或者將一個服務拆分成多個,如果客戶端直接與微服務通信,那么重構將會很難實施,
- 某些微服務可能使用了防火墻 / 瀏覽器不友好的協議,直接訪問會有一定的困難,
(2)工具:Spring Cloud Gateway,是介于客戶端和服務器端之間的中間層,所有的外部請求都會先經過API 網關這一層,也就是說,API 的實作方面更多的考慮業務邏輯,而安全、性能、監控可以交由 API 網關來做,這樣既提高業務靈活性又不缺安全性,
3.跨域問題
(1)原因:瀏覽器對于javascript的同源策略的限制,是瀏覽器對于ajax請求的一種安全限制,
(2)型別:域名不同;域名相同但埠不同等
(3)解決方案:一是直接在Controller類上添加@CrossOrigin注解
二是使用Spring Cloud Gateway網關創建全域配置類CorsConfig,通過配置類解決跨域問題
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
4.注冊中心與服務呼叫
(1)使用原因:微服務專案中,不同的功能分布在不同的模塊中,為了實作模塊之間的相互呼叫,需要將服務注冊到遠程注冊中心,再進行呼叫
(2)Spring Cloud相關基礎服務組件:
- 服務注冊——Netflix Eureka (Nacos)
- 服務呼叫——Netflix Feign
- 熔斷器——Netflix Hystrix
- 服務網關——Spring Cloud GateWay
- 分布式配置——Spring Cloud Config (Nacos)
- 訊息總線 —— Spring Cloud Bus (Nacos)
總結:Nacos = Eureka + Config + Bus
5.資料字典
(1)定義:管理系統常用的分類資料或者一些固定資料,例如:省市區三級聯動資料、民族資料、行業資料、學歷資料等,
(2)工具:阿里巴巴開源的EasyExcel,基于Java的簡單、省記憶體的讀寫Excel的開源專案,在盡可能節約記憶體的情況下支持讀寫百M的Excel,
6.服務端渲染技術
(1)定義:Server Side Render(SSR)是在服務端完成頁面的內容,而不是在客戶端通過AJAX獲取資料,
(2)優勢:更好的 SEO(推廣),由于搜索引擎爬蟲抓取工具可以直接查看完全渲染的頁面,
(3)工具:NUXT,Nuxt.js 是一個基于 Vue.js 的輕量級應用框架,可用來創建服務端渲染 (SSR) 應用,也可充當靜態站點引擎生成靜態站點應用,具有優雅的代碼結構分層和熱加載等特性,
7.手機驗證碼登錄
(1)JWT工具,是為了在網路應用環境間傳遞宣告而執行的一種基于JSON的開放標準,最重要的作用就是對 token資訊的防偽作用,
(2)阿里云短信業務,創建簽名和模板,程式中通過使用簽名和模板的keyId進行驗證碼發送,
(3)登錄全域事件:注冊一個全域登錄事件,當需要登錄層是,發送一個登錄事件,頭部組件監聽登錄事件,然后觸發登錄按鈕的點擊事件即可打開登錄層進行登錄,
(4)用戶認證與API網關整合:
1)首先,在網關處攔截需要登錄的url,從header頭資訊中獲取用戶token,若token合法,直接回傳用戶id和200狀態碼,放行;若不合法,回傳208狀態碼,
2)其次,在前端頁面中發送請求并接受狀態碼,若狀態碼為200,表示已經登錄,放行;若狀態碼為208,表示需要登錄,觸發登錄事件進行登錄,
3)最后,呼叫阿里云短信服務介面給用戶發送驗證碼,并將驗證碼放入redis快取,接收用戶輸入的驗證碼并和redis快取的驗證碼進行對比,若一致則登錄成功,否則失敗,
8.微信登錄
(1)OAuth2協議,

(2)微信工具準備,
1)注冊:微信開放平臺:https://open.weixin.qq.com
2)郵箱激活
3)完善開發者資料
4)開發者資質認證:準備營業執照,1-2個作業日審批、300元
5)創建網站應用:提交審核,7個作業日審批
6)內網穿透:ngrok的使用
(3)授權流程:獲取access_token時序圖

第一步:請求code(生成授權URL)
第二步:通過code獲取access_token(開發回呼URL)
9.阿里云物件存盤OSS服務
(1)使用原因:用戶認證需要上傳證件圖片、首頁輪播也需要上傳圖片,因此需要做檔案服務來存盤檔案,
(2)實作:通過阿里云賬戶的keyid和OSS創建的Bucket的id連接遠程OSS存盤庫,進行存盤和訪問,
10.預約下單成功后處理邏輯(使用訊息佇列)
(1)工具:RabbitMQ,是一個開源的訊息代理的佇列服務器,用來通過普通協議在完全不同的應用之間共享資料,
(2)作用:
1)訊息佇列提供一個異步通信機制,訊息的發送者不必一直等待到訊息被成功處理才回傳,而是立即回傳,
2)如果網路連接不可用,訊息被暫存于佇列當中;當網路暢通的時候再將訊息轉發給相應的應用程式或者服務,
3)如果在商品服務和訂單服務之間使用訊息中間件,既可以提高并發量,又降低服務之間的耦合度,
(3)典型應用場景:
1)異步處理,把訊息放入訊息中間件中,等到需要的時候再去處理,
2)流量削峰,例如秒殺活動,在短時間內訪問量急劇增加,使用訊息佇列,當訊息佇列滿了就拒絕回應,跳轉到錯誤頁面,這樣就可以使得系統不會因為超負載而崩潰,
3)日志處理,
4)應用解耦,
(4)實作程序:
1)下單成功后給用戶發送預約成功的短信通知,先創建MQ的監聽器,當有短信任務被放入訊息佇列時,擇機完成任務,
2)下單成功后更新剩余預約號的數量,先創建MQ的監聽器,當有更新任務被放入訊息佇列時,擇機完成任務,
11.就醫提醒(定時任務)
(1)業務邏輯:通過定時任務,每天8點執行提醒服務,提醒當天就醫的用戶就診,
(2)Cron運算式:是一個具有時間含義的字串,字串以5個空格隔開,分為6個域,格式為X X X X X X,分別表示秒、分、時、日、月等,
(3) @Scheduled注解:用于定時任務方法上,例如: @Scheduled(cron = "0 0 8 * * ?")表示每天早上八點執行,
12.其他
(1)Redis:作快取,用于驗證碼有效時間、支付二維碼有效時間、醫院資料等
(2)MongoDB:存盤醫院相關資料
(3)RabbitMQ:進行訂單相關操作,發送mq訊息
(4)Docker:下載鏡像(MongoDB,RabbitMQ),創建容器
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/433343.html
標籤:其他
上一篇:【電商秒殺專案】專案總結:Redis 實作分布式 Session、用戶認證、超賣、系統壓測、RabbitMQ 異步下單、介面限流
