# 健康守护者系统
**Repository Path**: wtcrazy/smart-healthcare
## Basic Information
- **Project Name**: 健康守护者系统
- **Description**: 基于知识图谱问答的健康守护者系统,包括浏览文章、自助问答、论坛帖子、购物买药、用户中心五大核心模块,相应有管理员后台进行对文章的发布、对用户、帖子、药品、订单、评论等管理和对应数据的展示
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2023-06-06
- **Last Updated**: 2026-01-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: SpringBoot, Vue, uni-app, Flask, Neo4j
## README
# 效果展示
**[项目访问入口](http://123.57.87.188:8080/#/pages/index/index)**
**扫码进入**:
## 项目用户端展示效果如下





















## 项目管理员端展示效果如下












#### 如果觉得有帮助的话给个支持吧~

# Neo4j
## 教程:Neo4j高性能图数据库从入门到实战
[Neo4j高性能图数据库从入门到实战](https://www.bilibili.com/video/BV1sG411s7zV/?p=13&spm_id_from=pageDriver&vd_source=5fb748893c7479700d3ecff6fbb98bac)
- [ ] 教程博客:[Neo4j](https://www.w3cschool.cn/neo4j/delete.html)
* 开启命令

# 医疗问答系统
## 算法教程:医学知识图谱问答系统
[医学知识图谱问答系统](https://www.bilibili.com/video/BV18G4y1E7sG/?spm_id_from=333.999.0.0&vd_source=5fb748893c7479700d3ecff6fbb98bac)
## 项目示例:neo4j知识图谱 Vue+flask 中药中医方剂大数据可视化系统
[neo4j知识图谱 Vue+flask 中药中医方剂大数据可视化系统](https://www.bilibili.com/video/BV1At4y1p7t4/?p=1&vd_source=5fb748893c7479700d3ecff6fbb98bac)
## 可视化技术:ECharts
[ECharts数据可视化项目](https://www.bilibili.com/video/BV1v7411R7mp/?spm_id_from=333.337.search-card.all.click&vd_source=5fb748893c7479700d3ecff6fbb98bac)、**D3js:**[数据可视化入门D3.js](https://www.bilibili.com/video/BV1qh411i7Jw/?spm_id_from=333.337.search-card.all.click&vd_source=5fb748893c7479700d3ecff6fbb98bac)
* 展示地址:[数据可视化](https://xiaofanzhou-code.github.io/test/)
* 子绝父相
* 立即执行函数(function(){})();
* ECharts官网:[Apache ECharts](https://echarts.apache.org/examples/zh/index.html)
*
随屏幕自适应变化

**Echarts可做数据大屏**

拐点

二选一:
- [ ] 数据可视化:[基于D3.js以及Neo4j的 知识图谱系统开发记录](https://www.bilibili.com/video/BV11Q4y1M7MS?p=1&vd_source=5fb748893c7479700d3ecff6fbb98bac)

- [ ] 数据可视化:[Echarts+Vue3.0数据可视化项目构建](https://www.bilibili.com/video/BV14u411D7qK/?spm_id_from=333.337.search-card.all.click&vd_source=5fb748893c7479700d3ecff6fbb98bac)

## flask教程:速成教程Flask web框架实战
[速成教程Flask web框架实战](https://www.bilibili.com/video/BV1wZ4y1G7ew/?spm_id_from=333.337.search-card.all.click&vd_source=5fb748893c7479700d3ecff6fbb98bac)
- [ ] flask教程[零基础玩转Python_Flask](https://www.bilibili.com/video/BV17z4y1X7UZ?p=1&vd_source=5fb748893c7479700d3ecff6fbb98bac)
爬取网站:http://www.zhongyoo.com/name/
数据处理:pandas
提取关键字:textrank、tf-idf

## [前后端分离springboot+vue](https://www.bilibili.com/video/BV1U44y1W77D?p=5&vd_source=5fb748893c7479700d3ecff6fbb98bac)
**全程干货:**[程序员青戈](https://space.bilibili.com/402779077/channel/collectiondetail?sid=358637)
**强推:**[1天搞定SpringBoot+Vue全栈开发](https://www.bilibili.com/video/BV1nV4y1s7ZN/?spm_id_from=333.999.0.0&vd_source=5fb748893c7479700d3ecff6fbb98bac)
## 宏观速成教程:4小时学会Spring Boot+Vue前后端分离开发
[4小时学会Spring Boot+Vue前后端分离开发](https://www.bilibili.com/video/BV137411B7vB/?spm_id_from=333.337.search-card.all.click)


左侧菜单点击跳转:

**一些小知识点:直接跳转用redirect、alert用来web弹出警告框、vue用axios请求来访问后端接口、跨域问题、created()方法类似于onLaunch()、:rules=""绑定校验规则、this.$refs用来获取dom元素或者组件**

$router.push('')适合在vue文件中跳转路由:

this.$route.query是接收参数的、js语法:window.location.reload()是动态刷新页面
# 学习
## uniapp云开发
> * 向前删除是shift,向后删除是pop,向前追加是unshift,向后追加是push
> * 属性和值一样的情况下直接写属性就行
> * “...”可以用来展开对象,是展开符
> * v-model实现双向绑定
> * onReachBottom是触底功能
> * onPullDownRefresh是下拉刷新
* [Icon图标链接](https://www.iconfont.cn/collections/detail?spm=a313x.7781069.1998910419.d9df05512&cid=42142)
> 箭头函数云对象:
>
> 
>
>JQL语法:
>
>
>
>**Schema中uni-id用户体系配置**


>
>**import导入的时候前面加个@**
**schema权限规则:**

**uni-id的logout退出登录:**

**JQL的联表查询:**

**as起别名、orderBy【desc降序,asc升序】排序、limit限制条数、skip跳过指定条数、只查询一条getOne:**

**unicloud-db前端组件的使用:**

**云端环境变量:**


**一些方法:【eg:loadMore、clear、reset、refresh】**

**uView的配置:**

> **css中,&是父选择器,空格代表后代选择器**,有name1 name2:last-child ,其中紧挨着:last-child的name2是用来对最后一个子元素名作限制的,也可以不写直接用name1 :last-child ,这样name2为空,代表不对元素名作限制,一般都是这样的用法,直接选择最后一个子元素,这样比较直观,也容易懂
>
> 
>
>block块级元素特点:独占一行一个
>
>inline内联元素特点:和其他元素都在一行上
>
>text-align: justify;//两端对齐
>
>```css
>text-overflow: -o-ellipsis-lastline;
>overflow: hidden;【用法见:https://blog.csdn.net/Amnesiac666/article/details/124001166】
>text-overflow: ellipsis;
>display: -webkit-box;
>-webkit-line-clamp: 2;
>line-clamp: 2;
>-webkit-box-orient: vertical;
>```
>
>align-items: center;//垂直居中
>
>justify-content: space-around; //居中排列
>
>
>**吸顶效果:**
>
>```css
>position: fixed; //吸顶效果
>top: var(--window-top);
>z-index: 10;
>```
>
>富文本的样式
>
>SelectorQuery实现富文本定制
>
>数据进行缓存setStorageSync提高性能
>
>typeof()查看数据类型,getStorageSync()获取缓存,setStorageSync()设置缓存
>
>
>[web端云数据库](https://unicloud.dcloud.net.cn/pages/cloud-database/cloud-database?pageid=mp-48727d0e-2ffc-45ea-bd3a-3bb4727047df)
## 知识图谱
[ KBQA(知识图谱问答)常用数据集](https://blog.csdn.net/u013250861/article/details/126525608?spm=1001.2014.3001.5502)
[这是巨佬](https://blog.csdn.net/u013250861?type=blog)
[【Neo4j】第 2 章:Cypher 查询语言](https://blog.csdn.net/sikh_0529/article/details/127241634?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-127241634-blog-123697717.235^v29^pc_relevant_default_base3&spm=1001.2101.3001.4242.2&utm_relevant_index=4)
> 人家处理好的数据如下:
```json
{
"_id": {
"$oid": "5bb578b6831b973a137e3ee6"
},
"name": "肺泡蛋白质沉积症",
"desc": "肺泡蛋白质沉积症(简称PAP),又称Rosen-Castle-man-Liebow综合征,是一种罕见疾病。该病以肺泡和细支气管腔内充满PAS染色阳性,来自肺的富磷脂蛋白质物质为其特征,好发于青中年,男性发病约3倍于女性。",
"category": ["疾病百科", "内科", "呼吸内科"],
"prevent": "1、避免感染分支杆菌病,卡氏肺囊肿肺炎,巨细胞病毒等。\n2、注意锻炼身体,提高免疫力。",
"cause": "病因未明,推测与几方面因素有关:如大量粉尘吸入(铝,二氧化硅等),机体免疫功能下降(尤其婴幼儿),遗传因素,酗酒,微生物感染等,而对于感染,有时很难确认是原发致病因素还是继发于肺泡蛋白沉着症,例如巨细胞病毒,卡氏肺孢子虫,组织胞浆菌感染等均发现有肺泡内高蛋白沉着。\n虽然启动因素尚不明确,但基本上同意发病过程为脂质代谢障碍所致,即由于机体内,外因素作用引起肺泡表面活性物质的代谢异常,到目前为止,研究较多的有肺泡巨噬细胞活力,动物实验证明巨噬细胞吞噬粉尘后其活力明显下降,而病员灌洗液中的巨噬细胞内颗粒可使正常细胞活力下降,经支气管肺泡灌洗治疗后,其肺泡巨噬细胞活力可上升,而研究未发现Ⅱ型细胞生成蛋白增加,全身脂代谢也无异常,因此目前一般认为本病与清除能力下降有关。",
"symptom": ["紫绀", "胸痛", "呼吸困难", "乏力", "毓卓"],
"yibao_status": "否",
"get_prob": "0.00002%",
"get_way": "无传染性",
"acompany": ["多重肺部感染"],
"cure_department": ["内科", "呼吸内科"],
"cure_way": ["支气管肺泡灌洗"],
"cure_lasttime": "约3个月",
"cured_prob": "约40%",
"cost_money": "根据不同医院,收费标准不一致,省市三甲医院约( 8000——15000 元)",
"check": ["胸部CT检查", "肺活检", "支气管镜检查"],
"recommand_drug": [],
"drug_detail": []
},
{
"_id": {
"$oid": "5bb578b6831b973a137e3ee7"
},
"name": "百日咳",
"desc": "百日咳(pertussis,whoopingcough)是由百日咳杆菌所致的急性呼吸道传染病。其特征为阵发性痉挛性咳嗽,咳嗽末伴有特殊的鸡鸣样吸气吼声。病程较长,可达数周甚至3个月左右,故有百日咳之称。多见于5岁以下的小儿,幼婴患本病时易有窒息、肺炎,脑病等并发症,病死率高。百日咳患者,阴性感染者及带菌者为传染源。潜伏期末到病后2-3周传染性最强。百日咳经呼吸道飞沫传播。典型患者病程6-8周,临床病程可分3期:1.卡他期,从发病到开始出现咳嗽,一般1-2周。2,痉咳期,一般2-4周或更长,阵发性痉挛性咳嗽为本期特点。3,恢复期,一般1-2周,咳嗽发作的次数减少,程度减轻,不再出现阵发性痉咳。一般外周血白细胞计数明显增高,分类以淋巴细胞为主。在诊断本病时要注意与支气管异物及肺门淋巴结结核鉴别。近年来幼婴及成人发病有增多趋势。",
"category": ["疾病百科", "儿科", "小儿内科"],
"prevent": "1、控制传染源:在流行季节,若有前驱症状应及早抗生素治疗。\n2、切断传播途径:由于百日咳杆菌对外界抵抗力较弱,无需消毒处理,但应保持室内通风,衣物在阳光下曝晒,对痰液及口鼻分泌物则应进行消毒处理。",
"cause": "(一)发病原因\n病原菌是鲍特菌属(Bordetella)中的百日咳鲍特菌(B.pertussis),常称百日咳杆菌,已知鲍特菌属有四种杆菌,除百日咳鲍特菌外还有副百日咳鲍特菌(B.parapertussis),支气管败血鲍特菌(B.bronchiseptica)和鸟型鲍特菌(B.avium),鸟型鲍特菌一般不引起人类致病,仅引起鸟类感染,百日咳杆菌长约1.0~1.5μm,宽约0.3~0.5μm,有荚膜,不能运动,革兰染色阴性,需氧,无芽孢,无鞭毛,用甲苯胺蓝染色两端着色较深,细菌培养需要大量(15%~25%)鲜血才能繁殖良好,故常以鲍-金(Border-Gengous)培养基(即血液,甘油,马铃薯)分离菌落,百日咳杆菌生长缓慢,在35~37℃潮湿的环境中3~7天后,一种细小的,不透明的菌落生长,初次菌落隆起而光滑,为光滑(S)型,又称I相细菌,形态高低一致,有荚膜和较强的毒力及抗原性,致病力强,如将分离菌落在普通培养基中继续培养,菌落由光滑型变为粗糙(R)型,称Ⅳ相细菌,无荚膜,毒力及抗原性丢失,并失去致病力,Ⅱ相,Ⅲ相为中间过渡型,百日咳杆菌能产生许多毒性因子,已知有五种毒素:\n1、百日咳外毒素(PT):是存在百日咳杆菌细胞壁中一种蛋白质,过去称作为白细胞或淋巴细胞增多促进因子(leukocytosis or lymphocyte promoting factor,LPE),组胺致敏因子(histamin sensitizing factor,HSF),胰岛素分泌活性蛋白(insulin activating protein,IAP),百日咳外毒素由五种非共价链亚单位(S1~S5)所组成,亚单位(S2~S5)为无毒性单位,能与宿主细胞膜结合,通过具有酶活力的亚单位S1介导毒性作用,S1能通过腺苷二磷酸(ADP)-核糖转移酶的活力,催化部分ADP-核糖从烟酰胺腺嘌呤二核苷酸(NAD)中分离出来,转移至细胞膜抑制鸟苷三磷酸(CTP)结合即G蛋白合成,导致细胞变生,同时还能促使淋巴细胞增高,活化胰岛细胞及增强免疫应答。\n2、耐热的内毒素(endotoxin,ET),100℃60min只能部分破坏,180℃才能灭活,此毒素能引起机体发热及痉咳。\n3、不耐热毒素(HLT)这种毒素加热55℃30min后能破坏其毒性作用,此毒素抗体对百日咳杆菌感染无保护作用。\n4、气管细胞毒素(TCT):能损害宿主呼吸道纤毛上皮细胞,使之变性,坏死。\n5、腺苷环化酶毒素(ACT):存在百日咳杆菌细胞表面的一种酶,此酶进入吞噬细胞后被调钙蛋白所激活,催化cAMP的生成,干扰吞噬作用,并抑制中性粒细胞的趋化和吞噬细胞杀菌能力,使其能持续感染,ACT也是一种溶血素,能起溶血作用,百日咳的重要抗原是百日咳菌的两种血凝活性抗原,一种为丝状血凝素(filamentous hemagglutinin,FHA),因来自菌体表面菌毛故又称菌毛抗原,FHA在百日咳杆菌黏附于呼吸道上皮细胞的过程中起决定作用,为致病的主要原因。实验发现,FHA免疫小鼠能对抗百日咳杆菌致死性攻击,因此FHA为保护性抗原,另一种凝集原(aggluginogens,AGG)为百日咳杆菌外膜及菌毛中的一种蛋白质成分,主要含1,2,3三种血清型凝血因子,AGG-1具有种特异性;AGG-2,3具有型特异性,通过检测凝集原的型别来了解当地流行情况,目前认为这两种血凝素抗原相应抗体是保护性抗体,百日咳杆菌根据不耐热凝集原抗原性不同分为七型凝集原,1型凝集原为所有百日咳杆菌均具备,7型凝集原为鲍特菌属(包括副百日咳杆菌,支气管败血性杆菌)所共有,2~6型以不同的配合将百日咳杆菌分为不同血清型,测定血清型主要是研究流行时菌株的血清型和选择特殊血清型菌株生产菌苗,此外,副百日咳杆菌与百日咳杆菌无交叉免疫,亦可引起流行,百日咳杆菌对外界理化因素抵抗力弱,55℃经30min即被破坏,干燥数小时即可杀灭,对一般消毒剂敏感,对紫外线抵抗力弱,但在0~10℃存活较长。\n(二)发病机制\n1、发病机制:百日咳发病机制不甚清楚,很可能是百日咳毒素对机体综合作用的结果,当细菌随空气飞沫浸入易感者的呼吸道后,细菌的丝状血凝素黏附于咽喉至细支气管黏膜的纤毛上皮细胞表面;继之,细菌在局部繁殖并产生多种毒素如百日咳外毒素,腺苷环化酶等引起上皮细胞纤毛麻痹和细胞变性,使其蛋白合成降低,上皮细胞坏死脱落,以及全身反应,由于上皮细胞的病变发生和纤毛麻痹使小支气管中黏液及坏死上皮堆聚潴留,分泌物排出受阻,不断刺激呼吸道的周围神经,传入大脑皮质及延髓咳嗽中枢,反射性引起痉挛性咳嗽,由于长期刺激使咳嗽中枢形成兴奋灶,以致非特异性刺激,如进食,咽部检查,冷风,烟雾以及注射疼痛等,均可引起反射性的痉咳,恢复期间亦可因哭泣及其他感染,诱发百日咳样痉咳,近来研究表明百日咳发生机制与百日咳杆菌毒素类物质损害宿主细胞免疫功能有关,CD4+T细胞和Th1细胞分泌的细胞因子所介导的免疫反应,在百日咳杆菌感染中起重要作用。\n2、病理解剖:百日咳杆菌侵犯鼻咽,喉,气管,支气管黏膜,可见黏膜充血,上皮细胞的基底部有多核白细胞,单核细胞浸润及部分细胞坏死。支气管及肺泡周围间质除炎症浸润外,可见上皮细胞胞质空泡形成,甚至核膜破裂溶解,坏死,脱落,但极少波及肺泡。若分泌物阻塞可引起肺不张,支气管扩张,有继发感染者,易发生支气管肺炎,有时可有间质性肺炎;若发生百日咳脑病,镜检或肉眼可见脑组织充血水肿,点状出血,皮质萎缩,神经细胞变性,脑水肿等改变,此时常可见到肝脏脂肪浸润等变化。",
"symptom": ["吸气时有蝉鸣音", "痉挛性咳嗽", "胸闷", "肺阴虚", "抽搐", "低热", "闫鹏辉", "惊厥"],
"yibao_status": "否",
"get_prob": "0.5%",
"easy_get": "多见于小儿",
"get_way": "呼吸道传播",
"acompany": ["肺不张"],
"cure_department": ["儿科", "小儿内科"],
"cure_way": ["药物治疗", "支持性治疗"],
"cure_lasttime": "1-2个月",
"cured_prob": "98%",
"common_drug": ["穿心莲内酯片", "百咳静糖浆"],
"cost_money": "根据不同医院,收费标准不一致,市三甲医院约(1000-4000元)",
"check": ["耳、鼻、咽拭子细菌培养", "周围血白细胞计数及分类检验", "血常规", "酶联免疫吸附试验", "白细胞分类计数"],
"do_eat": ["南瓜子仁", "圆白菜", "樱桃番茄", "小白菜"],
"not_eat": ["螃蟹", "海蟹", "海虾", "海螺"],
"recommand_eat": ["清蒸鸡蛋羹", "百合双耳鸡蛋羹", "排骨汤", "罗汉果雪耳鸡汤", "小黄瓜凉拌面", "黄瓜三丝汤", "黄瓜拌兔丝", "黄瓜拌皮丝"],
"recommand_drug": ["琥乙红霉素片", "琥乙红霉素颗粒", "百咳静糖浆", "穿心莲内酯片", "红霉素肠溶片", "环酯红霉素片"],
"drug_detail": ["惠普森穿心莲内酯片(穿心莲内酯片)", "北京同仁堂百咳静糖浆(百咳静糖浆)", "邦琪药业百咳静糖浆(百咳静糖浆)", "东新药业百咳静糖浆(百咳静糖浆)", "达发新(环酯红霉素片)", "康美药业红霉素肠溶片(红霉素肠溶片)", "旺龙药业琥乙红霉素颗粒(琥乙红霉素颗粒)", "白云山医药琥乙红霉素片(琥乙红霉素片)", "国瑞琥乙红霉素片(琥乙红霉素片)", "利君制药红霉素肠溶片(红霉素肠溶片)", "东信药业琥乙红霉素颗粒(琥乙红霉素颗粒)", "石药欧意红霉素肠溶片(红霉素肠溶片)", "平光制药红霉素肠溶片(红霉素肠溶片)", "北京曙光药业红霉素肠溶片(红霉素肠溶片)", "迪瑞制药琥乙红霉素颗粒(琥乙红霉素颗粒)", "永定制药百咳静糖浆(百咳静糖浆)", "东信药业琥乙红霉素片(琥乙红霉素片)", "利君制药琥乙红霉素片(琥乙红霉素片)", "北京中新制药琥乙红霉素片(琥乙红霉素片)", "华南药业红霉素肠溶片(红霉素肠溶片)", "佐今明百咳静糖浆(百咳静糖浆)", "恒益药业琥乙红霉素颗粒(琥乙红霉素颗粒)", "利君沙(琥乙红霉素颗粒)"]
}
```
# 项目整体进度
**整个项目的阶段应该包括:开发、测试、生产**
## 用户移动端
### 新知识
需要了解ES6的语法,譬如箭头函数、`.map`等
[.map() .filter() .reduce() 的用法](https://www.jianshu.com/p/e87b195f6943)【reduce是求总和、filter是过滤筛选、map是提取出想得到的属性】
[vue.config.js的完整配置](https://blog.csdn.net/web22050702/article/details/127122145)

[vue + ivew 校验form表单俩次密码输入是否一致](https://blog.csdn.net/weixin_43900414/article/details/116598811)
> 富文本和markdown的区别
**富文本编辑器**,以Word为例,输入文字后,选择不同的功能(通常是通过点击某个图标),例如加粗或者调整字体大小,处理后的效果直接显示在屏幕上,与打印出来的效果相同。所以富文本编辑器又叫“**所见即所得**”编辑器。
**Markdown编辑器**,输入文字后,通常是在文字的前后同时输入一些标记字符,输入后在编辑窗口也不会即时显示出效果,需要手动切换预览模式查看处理效果。因为这些标记字符的存在,所以Markdown本身是一种**标记语言**。 Markdown的核心就在于通过输入字符同时进行排版和内容输入
### 一些平台
* [开始 | Vuex](https://vuex.vuejs.org/zh/guide/)
* [个人中心页面实现](https://www.bilibili.com/video/BV1Db4y1Y7nv/?spm_id_from=333.788.recommend_more_video.3&vd_source=5fb748893c7479700d3ecff6fbb98bac)
* [iniCloud控制台](https://unicloud.dcloud.net.cn/)
* [高德地图API](https://lbs.amap.com/api/webservice/summary)

### 用户中心页面
`flex-wrap`自动换行 `slice(0,9)`截取 `splice()`删除指定元素
[uniCloud云开发进阶篇多用户社区博客](https://www.bilibili.com/video/BV1yG4y1h7ck/?spm_id_from=333.999.0.0&vd_source=5fb748893c7479700d3ecff6fbb98bac)
个人中心页面:[个人中心页面实现](https://www.bilibili.com/video/BV1Db4y1Y7nv/?spm_id_from=333.880.my_history.page.click&vd_source=5fb748893c7479700d3ecff6fbb98bac)
聊天页面:[微信聊天小程序—聊天页面](https://blog.csdn.net/qq_54462755/article/details/126168118?csdn_share_tail={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"126168118"%2C"source"%3A"qq_54462755"}&ctrtid=aA3Ej)
### VueX
状态管理工具
### 浏览记录功能教程:浏览记录
[浏览记录](https://www.bilibili.com/video/BV1mT411K7nW?p=57&vd_source=5fb748893c7479700d3ecff6fbb98bac)
* `/
浏览器显示你的连接不是专用连接怎么解决

> 阿里云收费问题

> [uni-App 去掉顶部导航栏](https://blog.csdn.net/zsm4623/article/details/127989021)
> 切记运行的目录`E:\3Study\2项目\2023大学生创新创业大赛\医药问答\web\web前端\medical>`
> [如何在word里面优雅地插入代码](https://blog.csdn.net/weixin_43668420/article/details/126701766)
> 需要用到的插件
* uni-id-pages
* uView2
* uni-dateformat 日期格式化
![\[]](https://img-blog.csdnimg.cn/81d6f77871a64ea587e9aa421bd09fdb.png)
> 如果一个文件夹下没有\__init__.py文件,不会被当做一个module
> 正规的json是双引号,flask如何返回一个json数据[ Flask——返回json数据的方法](https://blog.csdn.net/weixin_43215588/article/details/121189959?ops_request_misc=%7B%22request%5Fid%22%3A%22168612365916800227468059%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168612365916800227468059&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-121189959-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=flask怎么返回json数据&spm=1018.2226.3001.4187)
> flask解决跨域问题[解决Flask跨域问题的几种方式](https://blog.csdn.net/kevinjin2011/article/details/104915608?ops_request_misc=%7B%22request%5Fid%22%3A%22168612354516800225528427%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168612354516800225528427&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-104915608-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=flask解决跨域问题&spm=1018.2226.3001.4187)
> 解决uniapp中的异步同步问题[uni-app中使用异步请求](https://blog.csdn.net/m0_46678928/article/details/123399201?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-123399201-blog-115548999.235^v38^pc_relevant_default_base3&spm=1001.2101.3001.4242.1&utm_relevant_index=1)
> `DOMException: Failed to execute open' on ' XML HttpRequest' :`在edge中报错,在小程序和google中正常
> 问答聊天核心实现,`WTcrazy`的精华
```js
async getAnswer(str) {
console.log('查询答案中!');
return new Promise((resolve, reject) => {
uni.request({
url: str,
success: res => {
console.log(res);
resolve(res.data.answer);
}
})
})
},
//发送消息
async handleSend() {
console.log("查询次数:" + this.questionCnt);
console.log('chatmsg==' + this.chatMsg);
//如果消息不为空或者不为空白字符(包括换行符、空格等)
// if (!this.chatMsg || /^\s+$/.test(this.chatMsg)) {
if (this.chatMsg != '') {
let URL = "http://127.0.0.1:5000/query?content=" + this.chatMsg; //本地机运行
console.log('url:' + URL);
let str = (this.questionCnt == 0 ? "第一次查询时间稍长 请耐心等待..." : "查询中 请稍后...")
uni.showLoading({
title: str
})
// console.log(str);
await this.getAnswer(URL).then((res) => {
this.ansMsg = res
})
let obj = {
botContent: this.ansMsg,
recordId: 0,
titleId: 0,
userContent: this.chatMsg,
userId: 0
}
this.msgList.push(obj);
uni.hideLoading(); //
console.log('下面是obj');
console.log(obj);
this.chatMsg = '';
this.scrollToBottom()
console.log('下面是msgList');
console.log(this.msgList);
} else {
uni.showToast({
title: "请输入问题",
duration: 1500,
icon: "error"
})
}
this.questionCnt = this.questionCnt + 1;
}
}
```
> 学会看报错,看懂debug真的很过瘾
![\[)]](https://img-blog.csdnimg.cn/ae2889f91bb749de9a8c7816650d1117.png)
> json.dumps是字典转json、json.loads是字符串转字典
> [Flask设置返回json格式数据](https://blog.csdn.net/angus_17/article/details/80455838)
> 核心接口,较为快速的回答问题
```py
@app.route('/query', methods=["GET", "POST"])
def Query():
if request.method == 'GET':
ques = request.args.get('content', '')
ans = handler.chat_main(ques)
dic = {"question": ques, "answer": ans}
tmpStr = str(dic).replace("\\h", "")
tmpStr = tmpStr.replace("\\xa0", "")#主要是为了解决json中转义字符问题
json_str = tmpStr.replace("'", "\"")
return Response(json.dumps(json.loads(json_str)), mimetype='application/json')
# return json_str # 单返回这个好像也可以
elif request.method == 'POST':
return 'post'
```
对应服务器截图:
![\]](https://img-blog.csdnimg.cn/aaca48c2bf1647b982512cbe1875140b.png)
> json格式[在线JSON校验格式化工具](https://www.bejson.com/)
> 下面这个json格式有误,主要在\\xa0上
```json
{
"question": "心脏病",
"answer": "病、心肌脏病。\n\x一、先天性心脏病\n1.可能由于母亲在怀孕早期的疾病或服用的药物有关。\n2.与遗传有关。\n二、后天性心脏病\n1.冠状动脉心脏病:抽"
}
```
> uniapp小程序调试超额的话可以尝试分包
> [[微信小程序开发者工具\] [error] Error: Fail to open IDE 问题解决方法](https://blog.csdn.net/weixin_42878504/article/details/126405738)
> [uni-app微信小程序主包大小哪里看图解](https://blog.csdn.net/xuelang532777032/article/details/129172265?ops_request_misc=%7B%22request%5Fid%22%3A%22168627903016800222834001%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fall.%22%7D&request_id=168627903016800222834001&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-129172265-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=小程序的主包大小怎么算的&spm=1018.2226.3001.4187)
> [subPackages分包加载配置](https://www.bilibili.com/video/BV1yG4y1h7ck?p=89&vd_source=5fb748893c7479700d3ecff6fbb98bac)
> [ECharts 在线构建](https://echarts.apache.org/zh/builder.html)
> 小程序周期函数执行顺序:**onLaunch–onLoad–onShow–onReady–onHide.**
> [uniCloud入门-增删改查、条件查询](https://blog.csdn.net/qq_40323256/article/details/113618871)
> npm报错[个人遇坑全面整理npm install 报错没有匹配版本:npm ERR! code ETARGET npm ERR! notarget No matching version found for](https://blog.csdn.net/qq_41043722/article/details/116198639)
> [ 解决npm install版本不匹配问题: npm ERR! code ETARGET npm ERR! notarget No matching version found for_is](https://blog.csdn.net/qq_46108215/article/details/129274029)
> 报错解决方案:[Module build failed: Error: Vue packages version mismatch](https://blog.csdn.net/Long861774/article/details/82968983)
> [ 解决报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location:](https://blog.csdn.net/m0_46615524/article/details/125898988)
> [uview组件u-button设置fontsize不起作用的问题](https://zhuanlan.zhihu.com/p/497397606?utm_id=0)
> [uniapp 背景图片全屏显示在整个页面](https://blog.csdn.net/qq_36016297/article/details/129836183)
> 引用iconfont彩色图标变黑白问题[如何UNI-APP中使用iconfont彩色图标](https://blog.csdn.net/weixin_45319327/article/details/126029067),这时候前面要加t-icon

对应指令:
```js
npm install -g iconfont-tools
iconfont-tools
//然后一路enter
```
![\]](https://img-blog.csdnimg.cn/187222629fb6468091e7c0bd759d4649.png)
> 密码框小眼睛问题
> uniapp可选链和空值合并操作问题
```js
console.log(obj.arr?.abc??[])
```
> [ uniapp小程序:追加数组中的对象属性,属性数据已经添加,视图不会改变](https://blog.csdn.net/weixin_44967080/article/details/128587116)
> [(uni-app)踩坑,数据改变,视图不变_unipopup 弹出层视图不更新](https://blog.csdn.net/muge1161105403/article/details/107634294)
> [uni-app中使用 async + await 实现异步请求同步化](https://developer.aliyun.com/article/1085614)
> 微信小程序的胶囊按钮问题
> up主讲的很清晰[2.18.滑动滚动条动态改变自定义子组件的信息](https://www.bilibili.com/video/BV1ts4y1B7rp?p=20&spm_id_from=pageDriver&vd_source=5fb748893c7479700d3ecff6fbb98bac)

[js ( => ) 箭头函数](https://blog.csdn.net/qq_38735931/article/details/94717773)
> 数据转换前后
```json
{"data":{"id":"28ef42f0012a4799954e944c85bf6ac0","time":1689089721097,"cost":46,"uid":"3ab67008e3c64226a02dac1c798b5405","addressid":"1659827abc24435b895c5385971a02c5","goodnum":3,"way":"alipay","content":"{\"cheap\":6,\"carList\":[{\"id\":\"0a81645066cb4eb391c917742db222c6\",\"name\":\"异维A酸红霉素凝胶\",\"num\":1,\"price\":8,\"preprice\":10,\"picurls\":\"http://172.25.71.194:8081/Files/2023/07/10/da51b039dc264aa4bc668ccf217c09a2.crdownload\"},{\"id\":\"cdc5b14cc7024c5fae23277661bd2346\",\"name\":\"磺胺醋酰钠滴眼液\",\"num\":1,\"price\":18,\"preprice\":20,\"picurls\":\"http://172.25.71.194:8081/Files/2023/07/10/fffab9700fbe492a949c7c42a5376530.jpg\"},{\"id\":\"3a354e9b6688448cbaebc8ede67be5fd\",\"name\":\"马来噻吗洛尔滴眼液\",\"num\":1,\"price\":20,\"preprice\":22,\"picurls\":\"http://172.25.71.194:8081/Files/2023/07/10/243827e6897d426faae29b36bcf3c3d6.webp\"}]}","address":{"id":"1659827abc24435b895c5385971a02c5","content":"中国石油大学","hostname":"郭邦豪","hostphone":"15467841256","uid":"3ab67008e3c64226a02dac1c798b5405","isDefault":false},"listProduct":null},"statusCode":200,"header":{"content-type":"application/json"},"errMsg":"request:ok"}
```
```json
{
"data":{
"id":"28ef42f0012a4799954e944c85bf6ac0",
"time":1689089721097,
"cost":46,
"uid":"3ab67008e3c64226a02dac1c798b5405",
"addressid":"1659827abc24435b895c5385971a02c5",
"goodnum":3,
"way":"alipay",
"content":"{\"cheap\":6,\"carList\":[{\"id\":\"0a81645066cb4eb391c917742db222c6\",\"name\":\"异维A酸红霉素凝胶\",\"num\":1,\"price\":8,\"preprice\":10,\"picurls\":\"http://172.25.71.194:8081/Files/2023/07/10/da51b039dc264aa4bc668ccf217c09a2.crdownload\"},{\"id\":\"cdc5b14cc7024c5fae23277661bd2346\",\"name\":\"磺胺醋酰钠滴眼液\",\"num\":1,\"price\":18,\"preprice\":20,\"picurls\":\"http://172.25.71.194:8081/Files/2023/07/10/fffab9700fbe492a949c7c42a5376530.jpg\"},{\"id\":\"3a354e9b6688448cbaebc8ede67be5fd\",\"name\":\"马来噻吗洛尔滴眼液\",\"num\":1,\"price\":20,\"preprice\":22,\"picurls\":\"http://172.25.71.194:8081/Files/2023/07/10/243827e6897d426faae29b36bcf3c3d6.webp\"}]}",
"address":{
"id":"1659827abc24435b895c5385971a02c5",
"content":"中国石油大学",
"hostname":"郭邦豪",
"hostphone":"15467841256",
"uid":"3ab67008e3c64226a02dac1c798b5405",
"isDefault":false
},
"listProduct":null
},
"statusCode":200,
"header":{
"content-type":"application/json"
},
"errMsg":"request:ok"
}
```
> [uniapp 报错之 uview 中 u-icon 点击 阻止冒泡](https://blog.csdn.net/YZRHANYU/article/details/127961460?ops_request_misc=%7B%22request%5Fid%22%3A%22168917238116782427438535%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168917238116782427438535&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-127961460-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=uniapp阻止冒泡&spm=1018.2226.3001.4187)
> uniapp解析markdown直接用相应插件,但原理应该是先把markdown转变成html语言,然后用解析html
### CSS坑
> [flex:1 到底代表什么](https://blog.csdn.net/xiaoxiannv666/article/details/120667793)
> [对于height:100%的理解](https://blog.csdn.net/weixin_44233892/article/details/106967156)
> [详解 CSS 属性 - :before && :after_after属性介绍](https://blog.csdn.net/wwdz_rwx/article/details/50916398?ops_request_misc=&request_id=&biz_id=102&utm_term=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-50916398.nonecase&spm=1018.2226.3001.4187)
==每个页面的CSS拼写尽量不一样,**否则有bug**==
> [浅谈display:inline-block_display: inline-block;](https://blog.csdn.net/bigboom_/article/details/116058695)
## 管理员前端Web
[Echarts画知识图谱官网](http://chartlib.datains.cn/echarts)
[医疗后台前端界面规划](https://www.bilibili.com/video/BV1BS4y1e71G?p=2&vd_source=5fb748893c7479700d3ecff6fbb98bac)
> [vue项目中修改页面title的方法](https://zhuanlan.zhihu.com/p/570272839)、[vue中修改浏览器图标和名字的几种方式](https://www.jb51.net/article/265276.htm)
> 自定义配置vue启动

[vue怎么获取缓存](https://www.yzktw.com.cn/post/1283037.html)
## 后端Server
[从0开始带你手撸一套SpringBoot+Vue后台管理系统](https://www.bilibili.com/video/BV1U44y1W77D/?spm_id_from=333.999.0.0)
### 新知识

### 初始准备
> 后端接口检测可以用`Swagger`,推荐用`postman`

> pom配置;在`D:\Personal-Download\Java\maven-repository\org\springframework\boot\spring-boot`找本地springboot的仓库版本【别轻易改pom】
```xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.5.RELEASE
com.wtcrazy
springboot
0.0.1-SNAPSHOT
springboot
医疗app后端
11
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-thymeleaf
net.sf.json-lib
json-lib
jdk15
2.4
org.springframework.boot
spring-boot-devtools
runtime
true
com.baomidou
mybatis-plus-boot-starter
3.5.1
com.baomidou
mybatis-plus-generator
3.5.1
org.apache.velocity
velocity
1.7
org.springframework.boot
spring-boot-starter-mail
org.apache.commons
commons-email
1.5
mysql
mysql-connector-java
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.3.1
cn.hutool
hutool-all
5.1.0
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
io.springfox
springfox-swagger2
2.7.0
io.springfox
springfox-swagger-ui
2.7.0
lib
BOOT-INF/lib/
**/*.jar
src/main/java
**/*.properties
**/*.xml
**/*.yml
**/*.txt
src/main/resources
**/*.properties
**/*.xml
**/*.yml
**/*.txt
false
org.apache.maven.plugins
maven-surefire-plugin
true
org.springframework.boot
spring-boot-maven-plugin
```
> banner图
```xml
___ __ _________ ________ ________ ________ ________ ___ ___ .::::.
|\ \ |\ \|\___ ___\\ ____\|\ __ \|\ __ \|\_____ \ |\ \ / /| .::::::::.
\ \ \ \ \ \|___ \ \_\ \ \___|\ \ \|\ \ \ \|\ \\|___/ /| \ \ \/ / / :::::::::::
\ \ \ __\ \ \ \ \ \ \ \ \ \ \ _ _\ \ __ \ / / / \ \ / / ':::::::::::..
\ \ \|\__\_\ \ \ \ \ \ \ \____\ \ \\ \\ \ \ \ \ / /_/__ \/ / / :::::::::::::::'
\ \____________\ \ \__\ \ \_______\ \__\\ _\\ \__\ \__\\________\__/ / / ':::::::::::.
\|____________| \|__| \|_______|\|__|\|__|\|__|\|__|\|_______|\___/ / .::::::::::::::'
\|___|/ .:::::::::::...
::::::::::::::''
.:::. '::::::::''::::
.::::::::. ':::::' '::::
.::::':::::::. ::::: '::::.
.:::::' ':::::::::. ::::: ':::.
.:::::' ':::::::::.::::: '::.
.::::'' ':::::::::::::: '::.
.::'' ':::::::::::: :::...
..:::: ':::::::::' .:' ''''
..''''':' ':::::.'
```
> alt+insert可以方便代码编写
### Postman测试数据
```json
{
"username":"WTcrazy",
"password":"123",
"phone":"45648964",
"mail":"48746846@qq.com",
"id":"45645648654456"
}
```
**postman里面Params和Body可以同时发挥作用**
### 集成Swagger
访问地址:http://localhost:8081/swagger-ui.html
```java
/**
* 跨域配置后swagger2可能不能访问,需要增加如下配置
* @param registry
* 对静态资源的配置
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
```
### 拦截器
```java
@Configuration//别忘记加注解
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {//拦截器
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/login");
}
}
```
> 拦截器拦截token

> 结合前端

uniapp中H5环境而导致自定义请求头字段失效
[uni-app设置请求头无效](https://blog.csdn.net/qq_45369827/article/details/114716081)
[后端接收不到前端传入的header参数信息](https://www.cnblogs.com/wandoubaguo/p/17022383.html)
### JWT
头部、载荷、签名
> 创建JWT

> 验证JWT

> 解析JWT

> 原理图

**request用来解析请求头,前端可以把token放在请求头里让后端解析,也可以直接放表单里面携带**
后端token可以放到redis里面【springboot整合redis】
前端token一般放入cookie或者请求头Authorization
### Redis
一般联合JWT,将生成的token存储到redis中,因为redis查询速度块,效率高
### Docker
在部署中需要用到的容器
### 共享本机数据库【安全性重要!】
[让别人连接自己的mysql数据库,共享mysql数据库](https://blog.csdn.net/qq_43548154/article/details/105691768)

### 邮箱验证

### Mybatis多表联查、分页查询
**association用于一对一或者多对一**
> 按照查询嵌套处理

> 按照结果嵌套处理
![\]](https://img-blog.csdnimg.cn/4057f576f3a84e4b898816c589466652.png)
**collection用于一对多处理**
> 按结果嵌套查询

> 按照查询嵌套处理

> 分页

> [ Mybaits中collection的用法详解](https://blog.csdn.net/weixin_45001200/article/details/118231169)
### 文件上传
> 在uni-app中 使用 `uni.request()` 是无法发送文件的 因为 request data参数无法接受Fromdata格式数据
> 那么只能曲线救国通过 `uni.uploadFile()` 上传文件
[robotframework调用上传文件接口报错“the request was rejected because no multipart boundary was found”](https://blog.csdn.net/sun_977759/article/details/88868509)
==**配置资源映射步骤:**==[ SpringBoot上传图片到指定位置,并返回URL](https://blog.csdn.net/RuanBigShuai/article/details/105244630?ops_request_misc=&request_id=&biz_id=102&utm_term=springboot上传图片后怎么获取图片的url&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-105244630.142^v88^control_2,239^v2^insert_chatgpt&spm=1018.2226.3001.4187)
[SpringBoot路径映射配置](https://blog.csdn.net/Steven_1617/article/details/127502228?ops_request_misc=&request_id=&biz_id=102&utm_term=springboot配置资源映射&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-127502228.142^v88^control_2,239^v2^insert_chatgpt&spm=1018.2226.3001.4187)
**JSON与字符串转化**
==**新增**==:[Spring上传文件路径配置_](https://blog.csdn.net/adaivskean/article/details/128327672)
```js
let param_json = JSON.stringify(this.$data)//转为字符串
let bookkeeping_data = JSON.parse(bookkeeping_data_string)//转换为JSON
```
**uniapp的前端传来的数据一定要和Java的entity实体类里面的字段类型要一一对应**
**数据交互:**[Java中常用的几种JSON格式的转换](https://blog.csdn.net/qq_44709970/article/details/129795706?ops_request_misc=%7B%22request%5Fid%22%3A%22168823036816800186563099%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168823036816800186563099&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-129795706-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=Java列表转json&spm=1018.2226.3001.4187)
[request.getSchema(),request.getServerName(),request.getServerPort(),request.getContextPath()的含义及使用](https://blog.csdn.net/qq_25644609/article/details/78163900?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-78163900-blog-115343781.235^v38^pc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-78163900-blog-115343781.235^v38^pc_relevant_default_base3&utm_relevant_index=1&ydreferer=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU0MzEwOC9hcnRpY2xlL2RldGFpbHMvMTE1MzQzNzgx)
yml部分内容
```yml
mvc:
# files是虚拟路径,classpath是类路径【编译完放入类路径target/classes[Files访问固定服务器资源、files访问动态服务器资源]】
static-path-pattern: /files/**
resources: # upload前面的/即对应tomcat服务器的路径
static-locations: /upload/
```
### 缓存问题
### 权限问题
### 跨域问题

**代码配置CorsConfig**
```java
package com.wtcrazy.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 一小时内不需要再预检
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedHeaders(CorsConfiguration.ALL)
.allowedMethods(CorsConfiguration.ALL)
.maxAge(3600);
}
}
```
### 发行
**局域网访问:**
```js
//修改yml配置文件即可
server:
IP: 172.25.71.194
port: 8081
address: 0.0.0.0 #局域网访问
```
### 问题
> [java: 无法访问org.springframework.web.bind.annotation.RequestMapping.](https://blog.csdn.net/Shipley_Leo/article/details/131033855)
> [SpringBoot-03-修改Banner图](https://blog.csdn.net/q343814703/article/details/124987509)
> [Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. No message available 解决方法](https://zhuanlan.zhihu.com/p/347189293)
> [SpringBoot 开启热部署](https://blog.csdn.net/ceaningking/article/details/129133155)
> [pom依赖报错com.mysql:mysql-connector-j](https://blog.csdn.net/zys_yyds/article/details/128742175)
> [ SpringBoot项目报错解决:“Error starting ApplicationContext. To display the conditions report re-run ...”_](https://blog.csdn.net/m0_50762431/article/details/122143601)
> [SpringBoot 中 application.yml 文件不生效](https://blog.csdn.net/cywleo/article/details/115282081)
> 在资源过滤的时候一定要注意啊,.txt/.yml都是我们需要过滤的对象
> Restful风格

> [MyBatis xml一次执行多条sql](http://www.5ityx.com/cate100/284289.html)
> http响应中状态码400和500的区别:
> 1)400-参数与控制器层所需要的参数不符合,并没有进入后台服务器(控制器)里。
> 2)500-传入的参数在业务处理中出现了异常,进入了后台服务器(控制器)里。
## 部署与运维
**部署在Linux上,要熟悉常用命令行,以下部署基于CentOS7完成**
### 上传Gitee
**上传gitee:**[Git 开发必备 .gitignore 详解](https://blog.csdn.net/nyist_zxp/article/details/119887324)
[如何将项目上传到Gitee上_项目上传gitee](https://blog.csdn.net/efew212efe/article/details/124042986)
[uni-app本地访问接口跨域](https://www.cnblogs.com/yeziyou/p/13740269.html)
**局域网访问:[Vue项目配置在局域网下访问方式](https://www.jb51.net/article/281277.htm)**
**项目部署:**[20.SpringBoot+Vue项目云端部署](https://www.bilibili.com/video/BV1nV4y1s7ZN?p=20&vd_source=5fb748893c7479700d3ecff6fbb98bac)
### 项目部署准备
买的相当于一台裸机,这个项目所需要的配置都要自己重新安装部署
**清除控制台的打印信息**:https://www.cnblogs.com/qianxiaox/p/13704870.html
**一些文件的说明:**[vue中的process.env.NODE_ENV和环境变量](https://blog.csdn.net/qq_43886365/article/details/128370109)
[新人免费试用阿里云仨月](https://ecs-buy.aliyun.com/trialCenter?spm=5176.8789780.J_4267641240.4.200945b5qxUSBJ#/create)

**阿里云控制中心:**[云服务器管理控制台 ](https://ecs.console.aliyun.com/server/region/cn-beijing?instanceId=i-2zed872iys6113bk0nkz#/)
> 进入安全组开放所需端口
![\)\]](https://img-blog.csdnimg.cn/9a042a53bac641cfa60b3991661f5cd9.png)
> 使用Xshell连接服务器

### 后端部署
【要下载适合于Linux版本的安装包】
#### 安装与配置MySQL
【建议先看完别跟着操作,因为后面有坑我重新下的】
查看mysql版本

**MySQL下载地址**:[MySQL :: Download MySQL Community Server](https://dev.mysql.com/downloads/mysql/)
卸载Centos7自带mariadb
```shell
# 查找
rpm -qa|grep mariadb
# 卸载
rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps
```
![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9aTfexCA-1691565098687)(T:\MarkdownImage\image-20230807221721251.png)\]](https://img-blog.csdnimg.cn/138207c3f8cf48a1bc661083b806f724.png)
**解压mysql**
```shell
# 创建mysql安装包存放点
mkdir /usr/server/mysql
# 解压-C可以指定解压目录【.tar用xvf,.gz用zxvf】rpm是离线安装包
tar xvf mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar -C mysql#
```

**执行安装**
```shell
# 切换到安装目录
cd /usr/server/mysql/
yum -y install libaio #先安装依赖
yum -y install libncurses*
yum -y install perl perl-devel
# 安装【强制安装、忽略依赖安装,多个一起安装,最后一个是不会执行的,要再次按回车】
rpm -ivh mysql-community-common-8.0.28-1.el7.x86_64.rpm#【我是安装这个版本的,其他版本bug给我整玉玉了】
rpm -ivh mysql-community-client-plugins-8.0.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.28-1.el7.x86_64.rpm
```
【更换mysql 8.0.28版本没有出现此问题】[MySQL 安装warning: mysql-community-libs-5.7.28-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID_](https://blog.51cto.com/u_15704423/5435728)

下错包了,我Linux是x86,不能用ARM
![\[]](https://img-blog.csdnimg.cn/ed0a27928cf240d58335ea1540aa3425.png)
> 重新下载x86安装包后,安装成功

**启动Mysql**
【**更换mysql 8.0.28版本没有出现此问题**】[解决报错libssl.so.1.1: cannot open shared object file: No such file or directory_](https://blog.csdn.net/estelle_belle/article/details/111181037)
```shell
systemctl status mysqld.service#查看mysql状态
journalctl -xe#查看详细的系统日志
cat /var/log/mysqld.log | grep ERROR #只查看具体的报错日志,省略了其他类型的日志
#启动mysql
systemctl start mysqld.service
#查看生成的临时root密码
cat /var/log/mysqld.log | grep password# _Y6.FQ0LdLjZ
```

**修改初始随机密码**
```shell
# /etc/my.cnf 文件中
skip-grant-tables #跳过密码验证
# 登录mysql【-u指定用户,-p指定密码】
mysql -u root -p
Enter password: #输入在日志中生成的临时密码
# 更新root密码 设置为root【进入mysql切记加分号结尾】版本不同,修改密码的语法也不同
update user set password=password('password') where user='root';#5.6版本
update mysql.user set authentication_string=password('password') where user='root' and Host ='localhost';#5.7以上版本
alter user 'root'@'localhost' identified by 'password';
set password for root @localhost = password('password');#8.0以上版本
# 下面操作正确
set global validate_password.policy=LOW;#设置密码策略【设置简单了】
set global validate_password.length=1;# 【正常是不少于8位、有字母数字啥的】
flush privileges;# 刷新权限
systemctl restart mysqld #重启MySQL
```
> 版本问题太恶心辣:[Linux系统下修改mysql数据库密码](https://blog.csdn.net/Fang_Alin/article/details/126463406)

**授予远程连接权限**
```shell
select host,user from user; #查看有哪些用户
create user 'remote'@'%' identified by 'password';#创建用户
drop user '用户名'@'主机';#删除创建的用户
grant all privileges on *.* to 'remote'@'%' with grant option;#授权#因为我们要运行SQL脚本【by后面是密码】%是通配符,表示所有IP
# 刷新
flush privileges;#让其生效
```

**控制命令**
```shell
#mysql的启动和关闭 状态查看
systemctl stop mysqld
systemctl status mysqld
systemctl start mysqld
#【建议】设置为开机自启动服务
systemctl enabl是e mysqld
#查看是否已经设置自启动成功
systemctl list-unit-files | grep mysqld
```
**关闭防火墙**【阿里云自带已经关了防火墙】
```bash
firewall-cmd --state #查看防火墙状态
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
```
**连接服务器后进行数据库的迁移:**

#### 配置JDK
使用Xftp来上传文件

jdk11下载链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
**解压**【这里jdk也要下载x86的】
```shell
tar -zvxf jdk-11.0.20_linux-x64_bin.tar.gz
```
编辑 /etc/profile 文件
```shell
vim /etc/profile
# 文件末尾增加
export JAVA_HOME=/usr/server/jdk-11.0.20
export PATH=${JAVA_HOME}/bin:$PATH
```
编辑`vim ~/.bash_profile`文件【为后面的neo4j做准备】
```shell
export JAVA_HOME=/usr/server/jdk-11.0.20
export PATH=$JAVA_HOME/bin:$PATH
```
**执行source命令,使配置立即生效**
```shell
source /etc/profile
```
检查是否安装成功
```shell
java -version
```

**打包Java项目**
修改yml配置【包括数据库配置和公网IP】
![\]](https://img-blog.csdnimg.cn/eb728134ea49411497d1cbc0bc9ea85e.png)
```shell
nohup java -jar springboot-0.0.1-SNAPSHOT.jar > logName.log 2>&1 & # 后台执行,日志输出到对应的log文件
```

#### 配置Neo4j
按`Quit()`或者`Ctrl+D`可以退出python的命令界面
Linux运行python文件:`python3 *.py`
Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此在安装Neo4j前必须安装JAVA SE的JDK;而与jdk11配对的neo4j为4.3.2下载Linux下neo4j的地址:[Neo4j Download Center - Graph Database & Analytics](https://neo4j.com/download-center/#community)
**解压**
```shell
tar -zxvf neo4j-community-4.4.24-unix.tar.gz
```
**进入neoj4的bin目录下**
```bash
#默认账号密码:neo4j/neo4j
#修改配置文件
vim ./conf/neo4j.conf
# 允许远程访问
dbms.connectors.default_listen_address=0.0.0.0
# 开启bolt服务,默认端口7687
dbms.connector.bolt.listen_address=:7687
# 开启http服务,默认端口7474
dbms.connector.http.listen_address=:7474
# 开启https服务,默认端口7473
dbms.connector.https.listen_address=:7473
#前台启动命令:
./neo4j console
#后台启动命令
/usr/server/neo4j-community-4.4.24/bin/neo4j start
#状态/usr/server/neo4j-community-4.4.24/bin/
/usr/server/neo4j-community-4.4.24/bin/neo4j status
#停止
./neo4j stop
#重启
./neo4j restart
#http访问
http://yourip:7474
#重置密码
connect:bolt://yourip:7687/
username:*
password:*
#在vim中按ESC退出编辑模式,然后按/+内容可以关键字搜索
```
输入`curl localhost:7474`命令,返回下面数据,表示启动成功
```json
{
"bolt_routing" : "neo4j://localhost:7687",
"transaction" : "http://localhost:7474/db/{databaseName}/tx",
"bolt_direct" : "bolt://localhost:7687",
"neo4j_version" : "4.4.24",
"neo4j_edition" : "community"
}
```

**尽量注释和代码别在一行,可能会报错**

```shell
# 查看python3.6安装了哪些库
ls /usr/lib/python3.6/site-packages/
```
yum是CentOS的默认包管理器
```shell
# 安装python3
sudo yum install python3
python --version # 等同于 python2
python3 --version
pip3 install 包名 #使用该命令来安装python第三方包
python3 -m site --user-site #查找site-packages的目录
cd /root/.local/lib/python3.6/site-packages#查看python3安装的库
```
**安装py2neo**
```shell
pip3 install pytz
pip3 install neobolt
pip3 install neotime
pip3 install py2neo
```
**安装pyahocorasick**
```bash
pip3 install pyahocorasick
```
* 针对报错sudo: cypher-shell: command not found,说明`cypher-shell`命令的路径未添加到超级用户(root)的环境变量中,直接走绝对路径
```shell
sudo /usr/server/neo4j-community-4.4.24/bin/cypher-shell
```
* 针对报错'readonly' option is set (add!to override)” `:wq!以上命令是强制保存退出,然后就可以了!`
**Neo4j的远程连接:**[neo4j配置远程连接_neo4j远程访问](https://blog.csdn.net/qq_45735705/article/details/124709017)
之前一直没配好无法远程,不知道是不是因为环境变量的问题NEOJ_HOME

**修改config.py文件下的IP和build_medicalgraph.py下的neo4j的用户名、密码**
Neo4j数据库要求在使用实例之前更改密码,即使您提供的凭据是有效的。这是为了确保在生产环境中不使用默认凭据。如果您不使用默认凭据,那么管理员要求您更改密码,因此您会收到此错误消息。**即neo4j要求必须更改密码**
```bash
ALTER USER neo4j SET PASSWORD 'yourpassword' # 在浏览器中执行语句修改密码
```
**可以看到可以正常外网访问服务器的neo4j数据库**

**服务器1核2G性能太差了,整个算法跑不起来,只能把图谱建的小一点了,先删除之前建好的数据**
![\]](https://img-blog.csdnimg.cn/1c265efff7214bcaacdaf35e86173cdc.png)
* 运行`build_medicalgraph.py`,将图谱建到CentOS上

](https://img-blog.csdnimg.cn/4803fb2678b24d8c90112680a3705ce2.png)
neo4j可能会因一次性查询数据太多,而挂掉
当python程序在执行Cypher查询,刚开始程序运行正常,过了一段时间,发现程序跑到一半会挂掉,原因是内存不足。
服务器系统为CentOS7,2G内存,安装的Neo4j3.4.4社区版
* 运行**app.py**文件,启动AI算法的后台
我的neo4j的bin目录在`/usr/server/neo4j-community-4.4.24/bin`
### 移动端部署
修改entity.js和api/base.js的IP为公网IP
**先进行H5的配置与打包**

**==重新打包Java项目上线的时候,要杀死Java进程重新部署、当然杀死进程后,对应之前的静态资源链接都将失效,所以尽可能一次性上传成功Java项目==**【移动端部署成功】

](https://img-blog.csdnimg.cn/ad722189850848ffaba81108eeb29af7.png)
### Web端部署
#### 安装Nginx
Nginx下载地址:[nginx: download](http://nginx.org/en/download.html)
```shell
yum install epel-release#更新yml源
yum update
yum -y install nginx #【在linux里面安装,之前上传的安装包就没用了】
```
Nginx命令
```shell
systemctl start nginx #开启nginx服务
systemctl stop nginx #停止nginx服务
systemctl restart nginx #重启nginx服务
```
网页放到云端,但是是下载到本地上的,所有发请求应该向服务器的IP发送
**运行指定打包vue项目**
```s
npm run build
```
将生成的dist目录放到服务器至/user/web
进入到/etc/nginx/conf.d目录,创建web.conf文件,内容如下
```js
server {
listen 8082;//监听端口
server_name locahost;//域名服务
location / {//IP下面的路径
root /usr/web/dist;//根目录
index index.html;//首页
}
}
server {
listen 8080;//监听端口
server_name locahost;//域名服务
location / {//IP下面的路径
root /usr/web/h5;//根目录
index index.html;//首页
}
}
```

使配置生效
```js
nginx -s reload
```
**访问成功**
![\]](https://img-blog.csdnimg.cn/1f173716e52b43538a0b39a1c7e4eb82.png)
### 常用Linux命令
```shell
mv old.cnf new.conf#重命名
chmod 777 neo4j #修改权限
ln -s JAVA_HOME/bin/java /usr/bin/java #软链接
```
> 使用`env`显示所有环境变量
![\]](https://img-blog.csdnimg.cn/49d4ca4ba17b462096dc2126c7acd35b.png)
## 核心算法

# 其他
> Idea如何恢复项目打开的询问弹窗,按`ctrl`+`shift`+`a`搜搜`Confirm`
![\]](https://img-blog.csdnimg.cn/147f2442de6a4943bc4572004aa1695e.png)