天天熱門:尚醫(yī)通day01-【項目環(huán)境搭建和醫(yī)院設(shè)置詳細步驟】(內(nèi)附源碼)
功能模塊:尚醫(yī)通(預(yù)約掛號平臺、管理平臺、接口系統(tǒng))、醫(yī)院系統(tǒng)(接口系統(tǒng))
業(yè)務(wù)流程:
3、尚醫(yī)通技術(shù)架構(gòu)架構(gòu)設(shè)計需要考慮的幾個方面:
(資料圖片)
可擴展性:系統(tǒng)功能會隨著用戶量的增加以及多變的互聯(lián)網(wǎng)用戶需求不斷地擴展,因此考慮到系統(tǒng)的可擴展性的要求,需要使用微服務(wù)架構(gòu)
,引入消息中間件
。性能:考慮訪問頻率,每個用戶每天的訪問次數(shù)。一般項目初始階段用戶的訪問量可能并不大,如果考慮做運營推廣,可能會迎來服務(wù)器訪問量驟增,因此要考慮分布式部署
,引入緩存
。安全性: 系統(tǒng)的信息有一定的隱私性,例如用戶的個人身份信息,因此使用賬號密碼管理
。另外涉及到身份證照片的上傳,需要有加密和權(quán)限控制功能的文件服務(wù)器
。系統(tǒng)涉及第三方微信登錄和微信支付,引入微信登錄接口和支付接口
,確保登錄和支付的安全。高可用:系統(tǒng)一旦宕機,將會帶來不可挽回的損失,因此必須做負載均衡
,甚至是異地多活
這類復(fù)雜的方案。如果數(shù)據(jù)丟失,修復(fù)將會非常麻煩,只能靠人工逐條修復(fù),這個很難接受,因此需要考慮存儲高可靠
。我們需要考慮多種異常情況:機器故障、機房故障,針對機器故障,我們需要設(shè)計 MySQL 同機房主備
方案;針對機房故障,我們需要設(shè)計 MySQL 跨機房同步
方案。為了減輕MySQL服務(wù)器的訪問壓力,我們引入更靈活的MongoDB
數(shù)據(jù)庫。成本:互聯(lián)網(wǎng)程序的主要成本在于服務(wù)器成本、流量成本、存儲成本、流媒體研發(fā)成本,中小型公司可以考慮使用云服務(wù)器和云服務(wù)
。系統(tǒng)中我們是用了阿里云OSS和阿里云市場短信。第02章-啟動項目工程整個項目基于一個已經(jīng)開發(fā)好的“通用權(quán)限系統(tǒng)”
進行二次開發(fā),因此我們先將“通用權(quán)限系統(tǒng)”搭建并運行起來
資料:資料>權(quán)限系統(tǒng)>guigu_common_system.sql
mkdir -p /atguigu/syt/redis/{data,conf}
2.2、復(fù)制配置文件在 /atguigu/syt/redis/conf
目錄中創(chuàng)建文件 redis.conf
,文件從
資料:資料>權(quán)限系統(tǒng)>redis-6.2.7.tar.gz
中解壓獲取
修改默認配置(從上至下依次):
#bind 127.0.0.1 #注釋掉這部分,這是限制redis只能本地訪問protected-mode no #默認yes,開啟保護模式,限制為本地訪問daemonize no #默認no,改為yes意為以守護進程方式啟動,可后臺運行,#注意?。?!此處是no,否則redis無法通過配置文件啟動
也可以直接從資料目錄復(fù)制,這里是已經(jīng)修改好的配置文件
資料:資料>權(quán)限系統(tǒng)>redis.conf
docker run -d --restart=always --name atguigu_syt_redis \-p 6379:6379 \-v /atguigu/syt/redis/conf/redis.conf:/redis.conf \-v /atguigu/syt/redis/data:/data \redis:6.2.7 \redis-server /redis.conf \--appendonly yes --requirepass "123456"
參數(shù)解釋:
-d 后臺運行-p 端口映射到主機的端口-v 將主機目錄掛載到容器的目錄redis-server --appendonly yes : 在容器執(zhí)行redis-server啟動命令,并打開appendonly持久化配置–requirepass :設(shè)置密碼
常見問題:以下IPv4問題會導(dǎo)致無法遠程鏈接redis服務(wù)
解決方案:
#修改配置文件:vim /usr/lib/sysctl.d/00-system.conf#追加net.ipv4.ip_forward=1#接著重啟網(wǎng)絡(luò)systemctl restart network
2.4、進入redis容器docker exec -it atguigu_syt_redis redis-cli
2.5、輸入密碼auth 123456
2.6、測試set name "xiaogu"
2.7、遠程連接測試在本機使用客戶端工具遠程鏈接redis,測試是否能成功連接
3、運行后端項目3.1、啟動后端Java項目資料:資料>權(quán)限系統(tǒng)>guigu-syt-parent.zip
將壓縮包解壓,并放在自己的工作目錄下,啟動前注意檢查:
配置文件:修改application-dev.yml中MySQL和redis的相關(guān)參數(shù)
idea的Maven配置:配置到自己的Maven配置文件和本地倉庫目錄中
idea中配置的jdk版本:1.8.0_300以上(微信支付安全策略要求)
idea的項目編碼:utf8
MySQL版本:8.0
3.2、測試后端Java項目訪問Swagger測試頁面:http://localhost:8800/doc.html
執(zhí)行登錄測試,并獲取token:用戶名是admin
,密碼是111111
資料:資料>權(quán)限系統(tǒng)>guigu-syt-ui.zip
將壓縮包解壓,并放在自己的工作目錄下,啟動前注意檢查:
node.js版本:v16.16.0執(zhí)行以下命令啟動項目
npm i #安裝項目依賴模塊npm run dev #運行程序
4.2、測試前端vue項目訪問前端頁面:http://localhost:9528/
5、項目結(jié)構(gòu)介紹5.1、后端項目|-guigu-syt-parent:項目父節(jié)點,管理多個子模塊|-common:公共模塊父節(jié)點|-common-log:系統(tǒng)日志|-common-util:通用工具類|-model:實體類|-service-util:微服務(wù)通用配置|-spring-security:用戶認證和授權(quán)|-service:微服務(wù)父節(jié)點|-service-system:認證和授權(quán)管理微服務(wù)
說明:model
模塊中的com.atguigu.syt
是尚醫(yī)通項目中的實體類
這里列出重要的目錄和文件:
|-node_modules 下載的模塊依賴|-public|-index.html 入口頁面|-src|-api 后端api請求模塊|-assets 公共資源文件|-components 通用組件|-layout 頁面布局|-router 路由配置|-utils 通用工具|-request.js axios封裝|-views 頁面組件|-dashboard 首頁面|-login 登錄頁面|-system 通用權(quán)限頁面|-App.vue 根組件|-main.js 入口js|-settings.js 應(yīng)用基本配置|-package.json 當(dāng)前項目基本信息和依賴信息|-vue.config.js webpack相關(guān)配置
第03章-醫(yī)院設(shè)置微服務(wù)1、需求當(dāng)醫(yī)院入駐尚醫(yī)通平臺后,尚醫(yī)通管理員會為每個醫(yī)院創(chuàng)建一條醫(yī)院設(shè)置記錄,這里會為每個醫(yī)院分配一個唯一的醫(yī)院編碼,分配一個用于遠程接口調(diào)用的密鑰,并配置每個醫(yī)院的遠程接口主機地址,以及醫(yī)院信息系統(tǒng)的聯(lián)系人、聯(lián)系方式等相關(guān)信息。只有平臺為醫(yī)院添加了醫(yī)院設(shè)置信息,醫(yī)院才可以上傳醫(yī)院基本信息、醫(yī)院預(yù)約規(guī)則信息、醫(yī)院科室信息、醫(yī)院排班信息等內(nèi)容到平臺中。
1.1、醫(yī)院設(shè)置列表1.2、醫(yī)院設(shè)置表單2、創(chuàng)建數(shù)據(jù)庫資料:資料>醫(yī)院設(shè)置微服務(wù)>guigu_syt_hosp.sql
hosname:醫(yī)院名稱hoscode:醫(yī)院編號(平臺分配,全局唯一,api接口必填信息)api_url:醫(yī)院接口調(diào)用的主機地址(如:預(yù)約下單,我們要調(diào)用該地址去醫(yī)院下單)sign_key:雙方api接口調(diào)用的簽名key,由平臺生成contacts_name:醫(yī)院聯(lián)系人姓名contacts_phone:醫(yī)院聯(lián)系人手機status:狀態(tài)(鎖定/解鎖)
3、創(chuàng)建service-hosp模塊在service下創(chuàng)建子模塊,選擇 maven類型的模塊,輸入模塊名稱service-hosp
,完成創(chuàng)建
創(chuàng)建后刪除默認的主類Main.java
4、添加依賴在service-hosp中添加依賴:
com.atguigu model 1.0 com.atguigu service-util 1.0 com.atguigu spring-security 1.0 mysql mysql-connector-java org.springframework.boot spring-boot-starter-test test
5、代碼生成器在service-util中添加代碼生成器:
5.1、添加依賴 com.baomidou mybatis-plus-generator org.apache.velocity velocity-engine-core mysql mysql-connector-java provided
5.2、編寫代碼生成器在service-util的test目錄中,創(chuàng)建包com.atguigu.syt
,
從資料中復(fù)制代碼生成器
資料:資料>醫(yī)院設(shè)置微服務(wù)>CodeGen.java
確認代碼生成器中變量moduleName
的值為hosp
,以及數(shù)據(jù)源配置,然后運行程序
然后刪除service-hosp微服務(wù)中的entity包,修改mapper層和service層引入的實體類,并引入model模塊中的實體類
6、創(chuàng)建配置文件在service-hosp模塊中resources目錄下創(chuàng)建文件
application.yml
:
spring: application: name: service-hosp profiles: active: dev,redis
application-dev.yml
:
server: port: 8201mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath:com/atguigu/syt/hosp/mapper/xml/*.xmlspring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver password: 123456 url: jdbc:mysql://localhost:3306/guigu_syt_hosp?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: root jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
7、創(chuàng)建SpringBoot啟動類在包com.atguigu.syt.hosp
中創(chuàng)建啟動類ServiceHospApplication.java
package com.atguigu.syt.hosp;@SpringBootApplication@ComponentScan(basePackages = {"com.atguigu"})public class ServiceHospApplication { public static void main(String[] args) { SpringApplication.run(ServiceHospApplication.class, args); }}
8、實現(xiàn)基本CRUD簡單的功能我們可以直接在controller中實現(xiàn)
8.1、編寫Controller代碼注意:將@RequestMapping路徑前面添加 /admin
前綴
package com.atguigu.syt.hosp.controller.admin;@Api(tags = "醫(yī)院設(shè)置管理")@RestController@RequestMapping("/admin/hosp/hospitalSet")public class AdminHospitalSetController { @Resource private HospitalSetService hospitalSetService; @ApiOperation(value = "根據(jù)id查詢醫(yī)院設(shè)置") @GetMapping("/getHospSet/{id}") public Result getById( @ApiParam(value = "醫(yī)院設(shè)置id",required = true) @PathVariable Long id){ HospitalSet hospitalSet = hospitalSetService.getById(id); return Result.ok(hospitalSet); } @ApiOperation(value = "根據(jù)id刪除醫(yī)院設(shè)置") @DeleteMapping("/{id}") public Result removeById( @ApiParam(value = "醫(yī)院設(shè)置id",required = true) @PathVariable Long id){ boolean result = hospitalSetService.removeById(id); if(result){ return Result.ok().message("刪除成功"); }else{ return Result.fail().message("刪除失敗"); } } @ApiOperation(value = "新增醫(yī)院設(shè)置") @PostMapping("/saveHospSet") public Result save( @ApiParam(value = "醫(yī)院設(shè)置對象", required = true) @RequestBody HospitalSet hospitalSet){ //設(shè)置狀態(tài) 1可用 0鎖定 hospitalSet.setStatus(1); //生成簽名秘鑰 Random random = new Random(); hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+""+random.nextInt(1000))); boolean result = hospitalSetService.save(hospitalSet); if(result){ return Result.ok().message("添加成功"); }else{ return Result.fail().message("添加失敗"); } } @ApiOperation(value = "根據(jù)ID修改醫(yī)院設(shè)置") @PutMapping("/updateHospSet") public Result updateById( @ApiParam(value = "醫(yī)院設(shè)置對象", required = true) @RequestBody HospitalSet hospitalSet){ boolean result = hospitalSetService.updateById(hospitalSet); if(result){ return Result.ok().message("修改成功"); }else{ return Result.fail().message("修改失敗"); } } @ApiOperation(value = "批量刪除醫(yī)院設(shè)置") //[1,2,3] @DeleteMapping("/batchRemove") public Result batchRemoveHospitalSet( @ApiParam(value = "id列表", required = true) @RequestBody List idList) { boolean result = hospitalSetService.removeByIds(idList); if(result){ return Result.ok().message("刪除成功"); }else{ return Result.fail().message("刪除失敗"); } } @ApiOperation(value = "醫(yī)院設(shè)置鎖定和解鎖") @PutMapping("/lockHospitalSet/{id}/{status}") public Result lockHospitalSet( @ApiParam(value = "醫(yī)院設(shè)置id",required = true) @PathVariable Long id, @ApiParam(value = "狀態(tài)", required = true) @PathVariable Integer status) { if(status != 0 && status != 1){ return Result.fail().message("非法數(shù)據(jù)"); } HospitalSet hospitalSet = new HospitalSet(); hospitalSet.setId(id); hospitalSet.setStatus(status); boolean result = hospitalSetService.updateById(hospitalSet); if(result){ return Result.ok().message("操作成功"); }else{ return Result.fail().message("操作失敗"); } }}
8.2、Swagger測試注意:先登錄,獲取token,然后設(shè)置全局token
9、分頁和條件查詢復(fù)雜的功能我們需要添加service層
9.1、ControllerAdminHospitalSetController中添加分頁方法
@ApiOperation("分頁條件查詢")@GetMapping("/{page}/{limit}")public Result pageList( @ApiParam(value = "頁碼",required = true) @PathVariable Long page, @ApiParam(value = "每頁記錄數(shù)",required = true) @PathVariable Long limit, @ApiParam(value = "查詢對象",required = false) HospitalSetQueryVo hospitalSetQueryVo){ Page pageParam = hospitalSetService.selectPage(page, limit, hospitalSetQueryVo); return Result.ok(pageParam);}
9.2、Service接口:HospitalSetService
/** * 分頁查詢 * @param page 頁碼 * @param limit 每頁記錄數(shù) * @param hospitalSetQueryVo 查詢對象 * @return 分頁對象 */Page selectPage(Long page, Long limit, HospitalSetQueryVo hospitalSetQueryVo);
實現(xiàn):HospitalSetServiceImpl
@Overridepublic Page selectPage(Long page, Long limit, HospitalSetQueryVo hospitalSetQueryVo) { //分頁參數(shù) Page pageParam = new Page<>(page, limit); //查詢參數(shù) QueryWrapper queryWrapper = new QueryWrapper<>(); String hosname = hospitalSetQueryVo.getHosname(); queryWrapper.like(!StringUtils.isEmpty(hosname),"hosname", hosname); String hoscode = hospitalSetQueryVo.getHoscode(); queryWrapper.eq(!StringUtils.isEmpty(hoscode), "hoscode", hoscode); //執(zhí)行查詢 baseMapper.selectPage(pageParam, queryWrapper); return pageParam;}
第04章-統(tǒng)一日志1、Logback日志spring boot內(nèi)部使用Logback
作為日志實現(xiàn)的框架。
通過日志查看程序的運行過程,運行信息,異常信息等
統(tǒng)一日志處理的目的:
將日志記錄在文件中,方便運維和開發(fā)做錯誤排查文件日志需要做滾動輸出(輸出到更多的日志文件中),避免單日志體積過大,拖垮服務(wù)器可以方便的在開發(fā)環(huán)境和生產(chǎn)環(huán)境等環(huán)境中切換輸出方式,例如在控制臺和日志文件中靈活輸出1.2、設(shè)置日志級別日志記錄器(Logger)的行為是分等級的。如下表所示:
從高到低分為:ERROR、WARN、INFO、DEBUG、TRACE
可以在service-hosp的application-dev.yml文件中,通過以下配置設(shè)置日志級別
logging: level: root: info
1.3、測試日志的輸出啟動service-hosp微服務(wù),可以看到微服務(wù)的啟動日志在控制臺上輸出了info級別的內(nèi)容
也可以修改成debug、error等其他級別查看日志輸出情況
1.4、測試日志的打印在AdminHospitalSetController類上添加注解:
@Slf4j
添加測試方法:
@ApiOperation(value = "日志測試")@GetMapping("/log")public Result log(){ log.trace("getHospSet trace"); log.debug("getHospSet debug"); log.info("getHospSet info"); log.warn("getHospSet warn"); log.error("getHospSet error"); return Result.ok();}
在application-dev.yml文件中修改日志級別,可以看到日志的輸出情況。
2、Logback日志文件可以創(chuàng)建獨立的日志配置文件,配置更強大的日志功能
2.1、創(chuàng)建Logback日志文件在service-util的resources目錄 中創(chuàng)建 logback-spring.xml
(默認日志文件的名字)
在logback-spring.xml中配置如下內(nèi)容:
syt ${CONSOLE_LOG_PATTERN} ${charset}
啟動service-hosp,微服務(wù)的啟動信息在控制臺按照CONSOLE_LOG_PATTERN
中設(shè)置的格式和顏色輸出,并且輸出的級別由root節(jié)點的level屬性
指定
控制臺日志只在開發(fā)環(huán)境下使用,生產(chǎn)環(huán)境下我們不使用控制臺日志,而是需要將日志輸出到文件中。
在logback-spring.xml中配置如下內(nèi)容:
syt true ${logging.level} ${logging.position}${logging.path}/syt-log.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${charset} ${logging.position}${logging.path}/syt-log-%d{yyyy-MM-dd}.%i.log 1MB 30
在service-hosp的application-dev.yml文件中,通過以下配置設(shè)置日志級別和日志路徑
logging: level: root: info file: path: hosp
所以控制臺中將只會打印出Spring Boot的bannar之后就啥也不打印了,所有的啟動信息都會被打印在日志文件syt-log.log中。
但是實際上我們不希望業(yè)務(wù)日志
中包括這些啟動信息
。所以這個時候我們就需要通過logger標簽來搞事情了。將上面的配置文件進行簡單修改:將
2.4、只打印error的appender通過如下的方式設(shè)置
true ERROR ACCEPT DENY ${logging.position}${logging.path}/syt-error-log.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${charset} ${logging.position}${logging.path}/syt-error-log-%d{yyyy-MM-dd}.%i.log 1MB 30
2.5、完整的日志配置文件可以從資料文件夾中復(fù)制完整的日志配置文件到service-util中
資料:資料>醫(yī)院設(shè)置微服務(wù)>logback-spring.xml
文件中添加了
修改service-hosp中的application.yml配置文件如下:則日志輸出在控制臺
spring: application: name: service-hosp profiles: active: dev,redis
修改service-hosp中的application.yml配置文件如下:則日志輸出在文件中
spring: application: name: service-hosp profiles: active: prod,redis
在service-system中的application-dev中添加如下配置:
logging: level: root: info file: path: system
源碼:https://gitee.com/dengyaojava/guigu-syt-parent
下一篇:最后一頁
講解百科 利潤分配為什么增加記在借方
利潤分配增加記在借方原因如下:利潤分配科目屬于權(quán)益類科目,而權(quán)益類科目的貸方核算增加數(shù),借方核算減少數(shù)。利潤分配是借方記減少,貸方
2022-12-18科普知識 出口貨物的發(fā)票應(yīng)該如何開
出口貨物發(fā)票開具方法如下:1、商業(yè)發(fā)票,是自制發(fā)票,直接打印在A4紙上,每個出口企業(yè)都有自己的發(fā)票格式,商業(yè)發(fā)票包含商品名稱、數(shù)量、單
2022-12-18知識庫 居委會職責(zé)
1、在政府有關(guān)部門指導(dǎo)下,組織社區(qū)成員進行自治管理,搞好社區(qū)的衛(wèi)生物業(yè),計生,流動人口和治安管理,完成社區(qū)成員代表大會,社區(qū)議事委
2022-12-18知識大全 七阿姨到底是什么人
七阿姨是屬于抖音上面的一個紅人,根據(jù)資料顯示七阿姨就是娛樂圈內(nèi)的人,她的爸爸是一家娛樂公司的老板,所以因為爸爸的關(guān)系能有很多機會見
2022-12-18知識領(lǐng)域 怎么學(xué)習(xí)炒股
1、首先要知道自己的策略到底是在短線、中線、長線中,自己是哪一種,只有這樣你才可以集中在是看公司、趨勢還是主力。不同的主線所采取的
2022-12-18知識探索 微信朋友圈怎么只發(fā)文字
1、步驟:打開微信點擊【發(fā)現(xiàn)】->點擊【朋友圈】->按住右上角的【相機圖標】1秒左右就可以進入發(fā)純文字界面,然后輸入發(fā)布的文字信息點擊發(fā)
2022-12-18探索百科 推薦幾部一點都不虐的總裁甜文
1、《早安,檢察官嬌妻》,作者:月七兒。2、《杉杉來吃》,作者:顧漫。3、《霸寵甜甜妻》,作者:雪籬笆。4、《首領(lǐng)霸愛:癡戀灰姑娘》,
2022-12-18百科大全 什么是高等職業(yè)學(xué)院
高等職業(yè)技術(shù)學(xué)院是根椐教育部相關(guān)規(guī)定,從上世紀末起非師范、非醫(yī)學(xué)、非公安類??茖哟稳罩破胀ǜ叩葘W(xué)校逐步規(guī)范校名為"職業(yè)技術(shù)學(xué)院",
2022-12-18百科全書 廣州哪有寵物市場我想買只寵物狗
1、清平市場 :如果在廣州火車站,可以乘坐開往文化公園、南方大廈方向的公交車,在文化公園或南方大廈下車,然后步行5分鐘即可到達。 如
2022-12-18知識智庫 海參怎么發(fā)最好
1、把購買回來的干海參,先浸泡,后煮制是發(fā)海參的最佳方法。發(fā)海參是需要準備不帶油的不銹鋼鍋或者陶瓷鍋,把干海參放進去,加入清水浸泡3
2022-12-18X 關(guān)閉
X 關(guān)閉
- 知識百科 銀行賬戶類型有哪些
- 最新全國疫情中高風(fēng)險地區(qū)名單:全國現(xiàn)有高中風(fēng)險地區(qū)15+64個(統(tǒng)計時間:5月19日6時)
- 北京疫情最新消息|5月18日北京新增50例本土確診病例和5例無癥狀感染者
- 上海疫情最新消息|5月18日上海新增本土確診病例82例和本土無癥狀感染者637例
- 鄭州限號|今天是2022年5月19日,鄭州限行尾號是4和9
- 發(fā)碼總數(shù)超68萬!鄭州市“場所碼”覆蓋精度再提升
- 鄭州發(fā)布100號通告:調(diào)整封控管控區(qū)域
- 【“鄭”在抗疫】鄭州互聯(lián)網(wǎng)企業(yè)開展愛心購瓜網(wǎng)絡(luò)公益活動
- 10歲頑童因“想媽媽”爬樓頂,暖心民警化身“心理醫(yī)生”解心結(jié)
- 洛陽馨悅社工:以微薄之力讓社區(qū)更安全