Files
hzdyjs/跟教务系统同步学生异动信息/api_service/README.md
T
2026-06-26 15:30:24 +08:00

145 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 学生异动视图只读 API
从 MySQL 视图 `vw_jw_student_change_export` 拉取数据,供教务或其它系统调用。
- **Python**:开发与生产建议 **3.7.9**(与现网一致)。
- **依赖**:见 `requirements.txt`(Flask 2.0.x + PyMySQL)。
- **异动类型映射**:见上级目录 [`异动类型映射说明.md`](../异动类型映射说明.md)
## 配置文件与环境对应关系
| 本目录文件 | 后端配置来源 | Spring 环境 |
|------------|----------------|-------------|
| **`config.dev.ini`** | `backend/ruoyi-admin/src/main/resources/application-dev.yml`(`spring.datasource.dynamic.datasource.master`) | dev(测试/开发) |
| **`config.prod.ini`** | `backend/ruoyi-admin/src/main/resources/application-prod.yml`(同上) | prod(生产) |
主机、端口、库名、用户名、密码已与上述 YAML 中 **master** 数据源保持一致;后端配置变更时请同步修改对应 INI。
## 安装
### 开发机(推荐虚拟环境)
```bash
cd 跟教务系统同步学生异动信息/api_service
python3.7 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
```
### Linux 生产环境
```bash
cd /path/to/api_service
python3 -m pip install -r requirements.txt
python3 -c "import pymysql, flask; print('ok')"
```
## 选用配置并启动
**测试/开发**:
```bash
cp config.dev.ini config.ini
python app.py
```
**生产**:
```bash
export JW_CX_CONFIG=/opt/jw-cx/config.prod.ini
python app.py
```
### INI 节说明
**`[database]`**:`host`、`port`、`user`、`password`、`database`
**`[api]`**:
| 键 | 说明 |
|----|------|
| `api_key` | 与请求头 `X-Jw-Cx-Key` 一致 |
| `bind_host` / `bind_port` | HTTP 监听(仅直接运行 `python app.py` 时生效) |
| `default_year` | **默认筛选年份**(按视图列「异动生效时间」);未配置则使用当前自然年;请求可带 `year` 覆盖 |
## 密钥校验
所有 **`/api/v1/student-changes`** 请求必须在 HTTP Header 中携带:
```http
X-Jw-Cx-Key: <与配置文件中 [api] api_key 相同,默认 JWCX001>
```
**`/health`** 不做密钥校验。
## 生产进程(gunicorn)
```bash
pip install 'gunicorn>=20.1.0,<21'
export JW_CX_CONFIG=/path/to/config.prod.ini
gunicorn -w 2 -b 0.0.0.0:5050 app:app
```
## 接口说明
### GET `/health`
返回 `{"status":"ok"}`。
### GET `/api/v1/student-changes`
**数据范围**:**`异动生效时间` 落在指定自然年**内的已办结记录,**一次返回全部**(不分页);年份由 **`year`** 指定,**未传则使用当前自然年**(或配置 `default_year`)。
| Query | 说明 | 未传时的默认值 |
|--------|------|------------------|
| `year` | 按「异动生效时间」所在自然年筛选,有效范围 2000~2100 | 当前自然年 |
**响应 `data` 每条记录字段**(与教务对接清单一致):
| 字段 | 说明 |
|------|------|
| 提交时间 | `YYYY-MM-DD` |
| 异动生效学期 | 本系统无数据,为 `null` |
| 异动类型 | **教务中文名称**(退学、休学、复学、转班级) |
| 申请人学号 / 姓名 | |
| 异动前/后 年级、院系、专业、班级、学制 | 学籍异动「前」优先取处理前快照 |
| 异动前/后 所在校区 | 本系统无数据,为 `null` |
| 异动后班主任工号 / 姓名 | |
| 新名字 | 本系统无改名流水,为 `null` |
| 审核状态 | 固定「已通过」 |
成功响应元数据:
| JSON 字段 | 说明 |
|-----------|------|
| `total` | 本次返回的记录总数(等于 `data` 数组长度) |
| `filter_year` | 本次请求实际生效的筛选年份 |
| `filter_by_column` | 固定为 `异动生效时间` |
**未授权**(HTTP 401):未带或错误的 `X-Jw-Cx-Key`。
## 调用示例
```bash
# 拉取当前自然年(如 2026)全部异动
curl -s -H "X-Jw-Cx-Key: JWCX001" \
"http://127.0.0.1:5050/api/v1/student-changes"
# 指定 2026 年
curl -s -H "X-Jw-Cx-Key: JWCX001" \
"http://127.0.0.1:5050/api/v1/student-changes?year=2026"
```
## 部署前:重建视图
代码更新后,请在目标库执行:
```bash
mysql -h <host> -u root -p hzdyjs_xg < docs/设计文档/database/vw_jw_student_change_export.sql
```
## 安全说明
1. `config.dev.ini` / `config.prod.ini` 含数据库凭据,请按公司规范控制仓库可见性与部署权限。
2. 建议数据库侧使用**仅对视图** `vw_jw_student_change_export` 有 `SELECT` 的专用账号,与后端 `root` 分离。
3. 生产将 **`api_key`** 换为强随机串,并走 HTTPS;必要时加网络白名单。