# 项目与补贴 — 项目 — 前端技术方案

> 依据：`项目与补贴-项目技术方案.md`；作为 `policy/projectSubsidy/index.vue` 中 **项目列表** Tab 实现。

---

## 1. 页面与路由

| 项 | 说明 |
| --- | --- |
| **组件文件** | `ruoyi-ui/src/views/policy/projectSubsidy/ProjectTab.vue` |
| **父页面** | `policy/projectSubsidy/index`（`el-tabs` 第一个 Tab） |
| **权限前缀** | `industryPolicy:subsidyProject:` |

---

## 2. API

| 文件 | Base Path |
| --- | --- |
| `ruoyi-ui/src/api/policy/subsidyProject.js` | `/industryPolicy/subsidyProject` |

方法：`listSubsidyProject`、`getSubsidyProject`、`addSubsidyProject`、`updateSubsidyProject`、`delSubsidyProject`、`publishSubsidyProject`、`offlineSubsidyProject`。

---

## 3. 列表与查询

- **筛选**：`keyword`、`execStatus`（1～3）、`publishStatus`（0/1）、`startDate`/`endDate`（项目开始日闭区间，前端校验 start ≤ end）。
- **表格**：项目名称、简介、投资金额、开始/预计完成日、执行状态、发布状态、发布时间、封面、创建时间。
- **操作**：未发布 → 查看/编辑/删除/发布；已发布 → 查看/下架（与产业政策宣传矩阵一致）。
- **批量删除 / 导出**：`industryPolicy/subsidyProject/export`。

---

## 4. 表单与校验

| 字段 | 规则 |
| --- | --- |
| `projectName` | 必填，1～20 字 |
| `introduction` | 选填，≤50 字 |
| `investmentAmount` | 必填，>0，2 位小数 |
| `projectStartDate` / `plannedEndDate` | 必填；预计 ≥ 开始 |
| `execStatus` | 必填，1 未开始 / 2 进行中 / 3 已完成 |
| `actualEndDate` | `execStatus=3` 时必填，≤ 今天 |
| `coverFileUrl` / `coverFilePath` | 选填，jpg/jpeg/png ≤10MB |

执行状态自动推算由**后端**在保存/列表时处理；前端在选「已完成」时强制填写实际完成日。

---

## 5. 国际化

`policy.js` 中 `subsidyProject` 节点；`pubNs: 'subsidyProject'` + `policyPublicityLocaleMixin`。

---

## 6. 修订记录

| 版本 | 说明 |
| --- | --- |
| 1.0 | 初版：嵌入项目与补贴 Tab；CRUD + 封面上传 |
| 1.1 | 草稿 §6：发布/下架、列表发布状态筛选、已发布禁改删 |
