# 养殖标准管理 — 前端技术方案 > 依据:`ruoyi-ui/src/views/breedingStandards/breedingManage/index.vue` 当前实现;后端约定见同目录 `养殖标准管理技术方案.md`、`养殖标准管理功能需求.md`。请求与表单字段统一 **小驼峰**。 --- ## 1. 页面与路由 | 项 | 说明 | | --- | --- | | **Vue 路径** | `ruoyi-ui/src/views/breedingStandards/breedingManage/index.vue` | | **组件名** | `BreedingManageStandard` | | **菜单配置** | 若依「菜单管理」组件路径:`breedingStandards/breedingManage/index` | | **Mixin** | `breedingStdLocaleMixin`(`stdNs = "bm"` → `breedingStd.bm.*`) | | **权限前缀** | `breeding:standard:list|query|add|edit|remove|syncKb|removeKb|publish|offline` | --- ## 2. API 模块 | 文件 | Base Path | | --- | --- | | `ruoyi-ui/src/api/breedingStandards/breedingManage.js` | `/breeding/standard` | | `ruoyi-ui/src/api/category/informationCategory.js` | `/category/informationCategory/children` | **养殖标准接口** | 方法 | HTTP | URI | 说明 | | --- | --- | --- | --- | | `listBreedingStandard` | GET | `/list` | 分页列表 | | `getBreedingStandard` | GET | `/{id}` | 详情 | | `addBreedingStandard` | POST | `/` | 新增 | | `updateBreedingStandard` | PUT | `/` | 修改(仅未发布) | | `delBreedingStandard` | DELETE | `/{ids}` | 删除 | | `syncKbBreedingStandard` | POST | `/syncKb/{id}` | 手动同步知识库 | | `removeKbBreedingStandard` | POST | `/removeKb/{id}` | 移出知识库 | | `publishBreedingStandard` | POST | `/publish/{id}` | 发布 | | `offlineBreedingStandard` | POST | `/offline/{id}` | 下架 | **标准类型下拉**:`listInformationCategoryChildren('001', '1')`,与后端 `BreedingStandardTypeValidator` 参数一致。 **上传**:`POST /common/upload` → 正文写入 `contentFileUrl`、`contentFilePath`、`contentFileName`;封面写入 `coverFileUrl`、`coverFilePath`。 --- ## 3. 页面结构 布局为双 `el-card`(筛选 + 列表),中间 `
` 分隔。 ### 3.1 筛选区 | 绑定字段 | 说明 | | --- | --- | | `queryParams.keyword` | 名称/简介模糊 | | `queryParams.standardType` | 资讯类别编码精确匹配,可清空 | | `queryParams.pageNum` / `pageSize` | 默认 1 / 20 | 工具栏:搜索、重置、新增。 ### 3.2 列表列 | 列 | 字段 / 展示 | | --- | --- | | 文件名称 | `standardName` | | 文件类型 | `typeLabel(standardType)` | | 文件简介 | `introduction` | | 标准文件 | `contentFileName` 链至 `contentFileUrl` | | 上架状态 | `publishStatusText(publishStatus)` | | 知识库同步 | `kbSyncStatusText(kbSyncStatus)` | | 发布日期 | `publishTime`(`yyyy-MM-dd`) | | 创建时间 | `createTime`(完整时间) | | 操作 | 见 §5 | ### 3.3 新增/编辑弹窗 - 标题:`dialogAdd` / `dialogEdit`;`:key="formKey"` 重置表单。 - 字段:`standardName`(1~20)、`standardType`、`introduction`(≤50)、正文上传、封面上传(`picture-card`,`:limit="1"`)。 - 编辑时 `canEditFormRow`:仅 `publishStatus=0` 且 `kbSyncStatus=0` 可改字段及换附件;已同步点编辑提示 `ruleSyncedNoEdit`。 - 提交 Body:`standardName`、`standardType`、`introduction`、`contentFileUrl`、`contentFilePath`、`contentFileName`、`coverFileUrl`、`coverFilePath`;编辑带 `id`。 ### 3.4 查看弹窗 只读展示主字段、封面(`image-preview`)、上架/同步状态、发布时间、下架时间。 --- ## 4. 标准类型 `created` 调用 `loadStandardTypeOptions()`,不再写死 `1~4`。 `mapCategoryItem` 将接口项映射为 `{ value, label }`,兼容 `code`/`name` 字段。 `typeLabel` 优先匹配 `standardTypeOptions`;存量值 `1~4` 回退 `stdT('type1')`…`type4'`。 示例编码(资讯类别):`001001` 繁育作业、`001002` 饲养工作、`001003` 免疫程序、`001004` 环境调控。 --- ## 5. 状态常量与操作矩阵 **脚本常量** | 常量 | 值 | 含义 | | --- | --- | --- | | `PUBLISH_STATUS.UNPUBLISHED` | 0 | 未发布(含下架回流) | | `PUBLISH_STATUS.PUBLISHED` | 1 | 已发布 | | `KB_SYNC_STATUS.UNSYNCED` | 0 | 未同步 | | `KB_SYNC_STATUS.SYNCED` | 1 | 已同步 | 合法稳态:`(0,0)`、`(0,1)`、`(1,1)`。下架成功后为 **未发布 + 已同步**(知识库保留副本,≠ 移出)。 | 组合 | 编辑 | 同步 | 移出 | 发布 | 下架 | 删除 | | --- | --- | --- | --- | --- | --- | --- | | 未发布 + 未同步 | ✓ | ✓ | — | — | — | ✓ | | 未发布 + 已同步 | ✗ | — | ✓ | ✓ | — | ✗ | | 已发布 + 已同步 | ✗ | — | — | — | ✓ | ✗ | **`can*` 方法**(均 `Number()` 比较)+ **`v-hasPermi`** + **`v-if`** 控制按钮。 | 方法 | 条件 | | --- | --- | | `canEdit` | `publishStatus === 0` 且 `kbSyncStatus === 0` | | `canSyncKb` | 未发布且未同步 | | `canRemoveKb` | 未发布且已同步 | | `canPublish` | 未发布且已同步 | | `canOffline` | 已发布 | | `canDelete` | 未发布且未同步 | **交互提示** - 已发布点编辑:`rulePublishedNoEdit` - 已同步点编辑:`ruleSyncedNoEdit` - 已同步点删除:`ruleDeleteNeedRemoveKb` - 标准类型加载失败:`errStdTypeLoad` - 同步/移出/发布/下架/删除:二次确认后调接口,成功 `getList()` 刷新 **状态文案**:`breedingStdLocaleMixin.publishStatusText` / `kbSyncStatusText`;历史 `publishStatus=2` 按「未发布」展示。 --- ## 6. 表单与上传校验 | 项 | 前端规则 | | --- | --- | | 标准名称 | 必填,1~20 字(`ruleLen120`) | | 标准类型 | 必选 | | 简介 | 选填,≤50 字 | | 正文 | 必填(校验 `contentFilePath`);后缀 `pdf/md/doc/docx/xls/xlsx/pptx`;≤30MB;文件名不含英文逗号 | | 封面 | 选填;`jpg/jpeg/png`;≤10MB | 上传地址:`VUE_APP_BASE_API + '/common/upload'`,Header `Authorization: Bearer {token}`。上传过程 `$modal.loading`,结束 `closeLoading`。 已同步记录为只读;改内容须先移出知识库后再编辑、同步。 --- ## 7. 国际化 | 命名空间 | 路径 | | --- | --- | | 模块文案 | `breedingStd.bm.*`(`lang/zh/breedingStd.js`、`lang/bo/breedingStd.js`) | | 公共文案 | `breedingStd.common.*`、`breedingStd.status.*` | --- ## 8. 依赖组件与工具 | 项 | 说明 | | --- | --- | | `pagination` | 分页,`pageNum` / `pageSize` 双向绑定 | | `parseTime` | 全局原型方法,格式化列表与查看时间 | | `image-preview` | 查看弹窗封面预览 | | `resetForm` | 重置查询表单 | | `$modal` | confirm / msgSuccess / msgWarning / msgError / loading | --- ## 9. 联调检查项 1. 标准类型下拉与保存编码(如 `001001`)一致。 2. 未发布+未同步:可新增、同步、编辑、删除。 3. 未发布+已同步:不可编辑(前端拦截),可移出、发布;不可删。 4. 已发布:仅查看、下架;下架后回到未发布+已同步。 5. 正文 `contentFileName` 在列表与详情正确展示;双语切换正常。 --- ## 10. 文件清单 | 类型 | 路径 | | --- | --- | | 页面 | `ruoyi-ui/src/views/breedingStandards/breedingManage/index.vue` | | 业务 API | `ruoyi-ui/src/api/breedingStandards/breedingManage.js` | | 类别 API | `ruoyi-ui/src/api/category/informationCategory.js` | | Mixin | `ruoyi-ui/src/mixins/breedingStdLocaleMixin.js` | | i18n | `ruoyi-ui/src/lang/zh/breedingStd.js`、`lang/bo/breedingStd.js` | --- ## 11. 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 根据 `breedingManage/index.vue` 生成:双卡片 CRUD、资讯类别编码、双维状态机、附件上传、知识库与发布/下架 | | **1.1** | **2026-06-01**:标准类型改资讯类别编码(`parentCode=001&categoryType=1`);存量 `1`~`4` 回退展示;编辑/上传仅 **未发布+未同步**;类型加载失败与已同步编辑提示;下架回流 **(0,1)** 操作矩阵修正 | | **1.2** | **2026-05-20**:正文 `contentFileExts` 与提示文案对齐:`pdf`、`md`、`doc`、`docx`、`xls`、`xlsx`、`pptx`(移除 `ppt`) |