它的核心功能可以分为以下几个模块:
1. 会员信息管理(核心)
管理会员单位的基础档案,包括:
· 基本信息:单位名称、会员类型(如“会员单位”)、入会日期。
· 状态追踪:证书颁发状态(如“未颁发”)、单位在会状态(如“正常在会”)。
· 联系信息:联系人、联系电话。
· 操作审计:记录创建人和更新人。
· 提供了完整的 RESTful API(如你之前遇到的 /api/v1/members/1 接口,支持增删改查)。
2. 财务管理(会费缴纳)
关联 fee_payments 表,记录每个会员单位的缴费记录(包含缴费日期、年度区间、金额等)。之前的 _preprocess 函数专门用来清理这张表的重复缴费数据。
3. 历史变更追踪
关联 membership_changes 表,记录会员单位的变更历史(如类型变更、状态变更等),并同样配有去重逻辑。
4. 数据维护(去重工具)
程序中包含 _preprocess 预处理函数,用于自动清理数据库中的重复记录(分别针对缴费记录和变更记录),这正是我们之前解决 MySQL 报错时修改的核心逻辑。
5. 技术架构
· 后端框架:Flask
· 数据库 ORM:SQLAlchemy(现已从 SQLite 切换至 MySQL)
· 部署:Docker 容器化运行(主机名 zsxh),监听 8011 端口,支持跨域请求(CORS)。
1. 代码分层结构(核心)
项目严格遵循关注点分离原则,主要分为三层:
· 路由表现层(/app/routes/):
· 负责接收 HTTP 请求(如 DELETE /api/v1/members/1)和返回 JSON 响应。
· 只做参数校验和结果封装,不直接写 SQL。例如 members.py 中的 delete_member 函数,会调用下层的事务管理器。
· 业务逻辑/核心胶水层(/app/core.py):
· 根据日志,它使用了 asgiref.sync 将 async 语法包装到 Flask 的 WSGI 同步环境中。这意味着项目虽然基于 Flask,但内部视图函数可能采用了异步写法(async def),通过 core.py 中的装饰器(wrapper)来适配运行。
· 数据访问层(/app/database_manager.py + ORM 模型):
· 事务管理器:dbm.transaction() 是一个关键封装,负责管理 Session 的生命周期(开启、提交、回滚),业务逻辑只需传入 lambda 回调即可。
· ORM 模型:使用了 SQLAlchemy 2.0 的 Mapped 注解(如 Mapped[str] = mapped_column(String(100))),定义了 Member、FeePaymentOrm 等实体。
2. 部署与运行架构
· 容器化:通过 Docker 运行(主机名 zsxh),环境隔离。
· Web 服务器:Flask 内置开发服务器(Werkzeug),监听 8011 端口,并绑定 0.0.0.0 以便容器内外通信。
· 数据库:目前配置为 MySQL(解决迁移问题后),通过 SQLAlchemy 连接。
· 跨域支持:配置了 Flask-CORS,允许前端(可能为独立 Vue/React 项目)跨域调用 API。
3. 模块划分(功能蓝图)
项目采用模块化蓝图设计,各模块相对独立:
· 成员管理模块(members):核心档案维护(增删改查)。
· 财务模块(fee_payments):会费缴纳记录管理,并配有内部预处理去重逻辑。
· 变更追踪模块(membership_changes):审计日志记录,同样有数据清洗脚本。
4. 数据流走向(以“删除会员”为例)
1. 请求进入:Nginx/客户端 -> Docker 容器 8011 端口。
2. 路由匹配:Flask 路由接收到 DELETE 请求,触发 members.py 中带装饰器的 async 函数。
3. 上下文转换:core.py 将异步上下文转为同步执行。
4. 事务执行:调用 dbm.transaction(lambda s: _delete_members_insession(s, i