# MedicalWeb **Repository Path**: JD30/medical-web ## Basic Information - **Project Name**: MedicalWeb - **Description**: 实现基于WEB的3D医疗数据解析平台,其中包含医疗数据的导入、分割、可视化和数据分析功能四大基础功能,且飞桨模型可在本地或云端部署进行推理。通过稳定的软件功能和优秀的人机交互,为非AI专业人员提供良好用户体验。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-25 - **Last Updated**: 2023-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 开始时间2023-9 结束时间2023-10 项目名称:基于Flask的3D医疗数据解析平台 PaddlePaddle+Flask+Vue 项目描述:实现基于WEB的3D医疗数据解析平台,其中包含医疗数据的导入、分割、可视化和数据分析功能四大基础功能,且飞桨模型可在本地或云端部署进行推理。通过稳定的软件功能和优秀的人机交互,为非AI专业人员提供良好用户体验。 开发工具:HBuilder X、Pycharm 项目环境:Python 3.9、Flask 2.3.3、PaddlePaddle等 项目步骤(WEB开发部分): #### 1.编写好需求文档,设计(数据库,url,返回)、原型图 #### 2.启动flask **编写app.py和入口文件server.py**(为什么不直接在app.py搞定,server.py导进来的意义是?),**加载Flask配置** **拆分的思想**贯彻整个项目!!! config/settings 在Python中,if \_\_name\_\_ == ' \_\_main\_\_' 是一种常见的模块检查模式,检查当前文件是否正在作为独立的程序运行。如果是,那么该语句后的代码将被执行。在你的代码中,这意味着jd_app将在指定的主机、端口和调试模式下运行。 #### 3.标准化返回 业务逻辑不能用http状态码判断,应该有自己的逻辑判断。 正常标准化返回:自己约定数据格式(json)即可 异常标准化返回: ​ werkzeug.exceptions库中的HTTPException可以直接用;还可以**自定义异常类** #### 4.flask和数据库 **连接(pymysql)**:**连接数据库设置**:lib/conn_mysql.py,结合SQLAlchemy底层会自动读取jd_app.config里的关于数据库的操作。 **生效表模型(flask_migrate)**:用书数据库迁移和版本管理。结合flask_cli绑定好app和migrate, `(venv) D:\jd-flask>flask --app server:jd_app db init` `(venv) D:\jd-flask>flask --app server:jd_app db migrate` `(venv) D:\jd-flask>flask --app server:jd_app db upgrade/downgrade` Python对象映射到数据库flask_sqlalchemy(**SQLAlchemy**): models/__init__.py **(初始化+导入)** (1)**orm**持久化对象:orm数据库**连接设置**,以便 SQLAlchemy 知道如何连接到数据库;对对象的操作就可以生效到数据库中,不需要sql语句,只需操作对象属性和方法。 表-类 字段-属性 一行记录-对象 (2)**表模型** API授权表模型: 中间表app_permission,字段:api_id permission_id api_token表:存放的是授权密钥,以及授权id api_permission表:存放的授权的url #### **5.前后端联调** **用于注册登录(安全加密功能,数据校验版):**表userdb,字段:id username _password role add_time **前后端接口flask_restful(遵循restful规范)**:一种接口规范也是一种接口设计风格,一般来说api的设计都会遵循,他是表现层状态转移,将每一类数据看做成资源,每一类资源又为其设计一种url,这种资源的增删改查通过http的动作(get post put delete)等方法来实现。 安全加密(注册):使用**属性包装装饰器**(models/user.py) 数据校验(注册+登录):**wtforms库**(DataRequired, Regexp, ValidationError(各自啥用?)) **注册(用户名重复)+登录(账号密码)校验**:(forms/user.py) 验证:**api验证+登录token验证**(libs/auth.py)两种授权认证即**auth_required()** 导入current_app(什么意思) 1.定义双重验证auth_required() 2.token登录验证:利用jwt库**生成token** Header Payload {“alg”:“HS256”,“typ”:“JWT”}{“uid”:3,“exp”:1694932229.343911} Signature 为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。 例如: HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret) 服务端token**验证**:拿到token之后,按照里面的header+payload+服务端保存的secretkey一起进行相同算法加密。得到新的签名,再和客户端传递的签名比较,一致就验证通过 3.API授权认证: ``` #api授权流程 # 1.客户端向服务端申请授权,服务端向客户端提供appid和secretkey,以及加密算法 # 2.客户端按照服务端提供的信息、算法,生成签名,请求时发送给服务端 # 3.服务端收到信息,验证是否成功(服务端生成此时的签名即客户端一样的appid+salt还有自己的key和此时的时间戳,再同样算法对其加密比较签名) ``` 先创建md5()对象,再用update将签名从字符串转为字节流,才可以继续通过hexdigest()获取哈希结果 **定义路由** 1.定义蓝图(router/user/__init__.py)----绑定jd_app(先导入/router/__init__.py为app注册蓝图绑定,再与jd_app真正绑定成功) 2.再对蓝图进行处理(即路由和视图函数的处理并反过来与蓝图绑定,间接和app绑定) 蓝图在Flask应用中主要有两个作用: 1. 模块化:蓝图可以将应用的不同模块分组并归入单独的蓝图中。每个蓝图可以包含其自身的路由和视图函数,这使得相同模块的视图函数可以放在同一个蓝图下,方便代码的管理和维护。通过这种方式,蓝图为应用提供了更加清晰和模块化的结构。 2. 层级解耦:蓝图的出现使得代码的分层和解耦变得容易。按照职责和功能的不同,不同的蓝图可以放在不同的层次中。例如,可以有一个蓝图专门处理和用户认证相关的功能,而另一个蓝图处理和用户管理相关的功能。此外,蓝图还可以使得视图函数更专注于其自身的业务逻辑,而不需要过多关注其他的应用层逻辑。 总的来说,蓝图是一种优雅的方式,可以使我们的Flask应用更加模块化和结构清晰,方便项目的开发和维护。 对router/user/user.py视图函数处理(注册登录)遵循restful接口规范 **注册登录的视图函数和url并做好校验** 在开发这个基于Flask的3D医疗数据解析平台的过程中,我获得了许多宝贵的经验和教训。以下是我对项目的一些感悟和心得: 需求分析和设计的重要性: 在开始一个项目之前,进行详细的需求分析和设计是至关重要的。在这个项目中,我们花费了大量的时间在需求分析和原型设计上,以确保我们有一个清晰的理解我们需要实现什么,以及如何实现。需求分析的不足会导致开发过程中的不断返工和更改,影响开发效率和代码质量。 合理拆分与模块化: 在开发过程中,我们将功能拆分成多个模块,每个模块都有其特定的任务和功能。这种拆分的方式有助于我们在开发过程中更好地管理和理解代码。同时,我们还将前端和后端进行了分离,使得两者可以独立开发和测试,提高了开发效率。 ORM与数据库管理: 使用SQLAlchemy进行ORM映射可以大大简化数据库操作。通过使用Migrate工具,我们能够方便地进行数据库版本管理,确保数据库的一致性和稳定性。 前后端分离与API设计: 通过blueprint模块进行路由管理,前后端联调实现登录注册功能,遵循restful规范,保证了前后端数据的同步和交互的顺畅。在设计API时,我们特别注重了其易用性和安全性,通过wtforms库做数据校验、pyjwt库生成token、验证token及API授权认证丰富登录注册功能,提高了系统的安全性。 团队协作与沟通: 尽管这个项目是我一个人负责的,但是在开发过程中,我与团队成员保持了紧密的沟通和协作。他们的反馈和建议帮助我不断改进和提高。 有待改进的地方: 虽然这个项目已经取得了一定的成果,但还有很多可以改进的地方。例如,我们可以进一步优化数据解析的算法,提高处理效率;还可以加强系统的稳定性,确保在大量用户同时访问时仍能保持良好的性能。 总的来说,这个项目让我深刻体验到了软件开发的复杂性,但也同样让我收获了许多宝贵的经验和知识。我相信这些经验将对我的未来工作和学习产生积极的影响。