文档补充
This commit is contained in:
parent
e386994f04
commit
2dcf81c155
135
sub-government-affairs-service/doc/API定义规范.md
Normal file
135
sub-government-affairs-service/doc/API定义规范.md
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
|
||||||
|
# 前端 API 定义规范(REST 风格)
|
||||||
|
|
||||||
|
> 版本:v1.0
|
||||||
|
> 日期:2025-07-01
|
||||||
|
> 风格:**RESTful**
|
||||||
|
> 适用范围:Vue3 / React / 模块化 JS 项目
|
||||||
|
> 目标:提升接口命名一致性,增强可维护性与可读性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌐 RESTful 命名规范
|
||||||
|
|
||||||
|
REST(Representational State Transfer)强调以资源为中心的接口设计,以下为规范核心:
|
||||||
|
|
||||||
|
### ✅ 基本动词与 HTTP 方法对应
|
||||||
|
|
||||||
|
| 动作 | HTTP 方法 | 路径示例 | 命名示例(函数) |
|
||||||
|
|--------------|------------|-------------------------------|---------------------------|
|
||||||
|
| 获取列表 | GET | `/users` | `fetchUserList` |
|
||||||
|
| 获取详情 | GET | `/users/:id` | `getUserById` |
|
||||||
|
| 创建 | POST | `/users` | `createUser` |
|
||||||
|
| 修改 | PUT/PATCH | `/users/:id` | `updateUser` |
|
||||||
|
| 删除 | DELETE | `/users/:id` | `deleteUserById` |
|
||||||
|
| 导出 | GET | `/users/export` | `exportUserExcel` |
|
||||||
|
| 上传 | POST | `/files/upload` | `uploadFile` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📁 文件组织结构
|
||||||
|
|
||||||
|
```bash
|
||||||
|
src/
|
||||||
|
├── apis/
|
||||||
|
│ ├── landResourceManagement/ # 土地资源管理
|
||||||
|
│ │ ├── plantingPlan/ # 种植规划
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── operationRecord/ # 作业记录
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── landIllegal/ # 土地违法处理
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── landManagement/ # 土地管理
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── landInspection/ # 土地巡查
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── gridManagement/ # 网格管理
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── gridMemberManagement/ # 网格员管理
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── basicInfoMaintenance/ # 基础信息维护
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── cropsManagement/ # 种植作物
|
||||||
|
│ │ │ ├── index.js
|
||||||
|
│ │ ├── index.js # 土地资源管理模块统一入口
|
||||||
|
│ ├── productionEntityManagement/ # 生产经营主体管理
|
||||||
|
│ │ ├── index.js
|
||||||
|
│ ├── inputManagement/ # 投入品管理
|
||||||
|
│ │ ├── index.js
|
||||||
|
│ ├── productTraceability/ # 农产品溯源
|
||||||
|
│ │ ├── index.js
|
||||||
|
│ ├── index.js # 项目统一入口文件
|
||||||
|
├── utils/
|
||||||
|
│ ├── axios.js # 封装的请求工具
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧱 函数命名规范
|
||||||
|
|
||||||
|
接口定义应以 **动词+资源名** 格式命名函数(驼峰式 camelCase):
|
||||||
|
|
||||||
|
```js
|
||||||
|
// 用户模块 API 示例
|
||||||
|
import request from '@/utils/request';
|
||||||
|
|
||||||
|
export function fetchUserList(params) {
|
||||||
|
return request('/api/users', { method: 'GET', params });
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getUserById(id) {
|
||||||
|
return request(`/api/users/${id}`, { method: 'GET' });
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createUser(data) {
|
||||||
|
return request('/api/users', { method: 'POST', data });
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateUser(id, data) {
|
||||||
|
return request(`/api/users/${id}`, { method: 'PUT', data });
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteUserById(id) {
|
||||||
|
return request(`/api/users/${id}`, { method: 'DELETE' });
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 组件方法命名建议
|
||||||
|
|
||||||
|
组件内部方法(UI逻辑处理)请统一以 `handle` 前缀区分,避免与 API 冲突:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const handleAddUser = () => { ... };
|
||||||
|
const handleEditUser = (row) => { ... };
|
||||||
|
const handleDeleteUser = (id) => { ... };
|
||||||
|
const handleExportExcel = () => { ... };
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚫 命名反例
|
||||||
|
|
||||||
|
| 错误命名 | 问题说明 | 推荐命名 |
|
||||||
|
|------------------|----------------------------------------|--------------------------|
|
||||||
|
| `listUser` | 动词语义模糊 | `fetchUserList` |
|
||||||
|
| `editUserById` | 与 REST 风格不符 | `updateUser` |
|
||||||
|
| `addOrEditUser` | 接口职责不清晰 | `createUser` 或 `updateUser` |
|
||||||
|
| `removeUser` | 与 HTTP 方法不一致 | `deleteUserById` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧾 附录:接口语义对照表
|
||||||
|
|
||||||
|
| 类型 | HTTP 方法 | REST URI 示例 | 函数命名示例 |
|
||||||
|
|-------------|------------|---------------------------|--------------------------|
|
||||||
|
| 查询列表 | GET | `/entities` | `fetchEntityList` |
|
||||||
|
| 查询详情 | GET | `/entities/:id` | `getEntityById` |
|
||||||
|
| 新增 | POST | `/entities` | `createEntity` |
|
||||||
|
| 修改 | PUT | `/entities/:id` | `updateEntity` |
|
||||||
|
| 删除 | DELETE | `/entities/:id` | `deleteEntityById` |
|
||||||
|
| 导出 | GET | `/entities/export` | `exportEntityExcel` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
257
sub-government-affairs-service/doc/组件文档.md
Normal file
257
sub-government-affairs-service/doc/组件文档.md
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
# 文件上传组件 (FileUploader)
|
||||||
|
|
||||||
|
## 组件说明
|
||||||
|
|
||||||
|
文件上传组件用于实现文件的上传、预览和管理功能。支持图片上传、多文件上传、文件预览等功能。
|
||||||
|
|
||||||
|
## 基本用法
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<file-uploader
|
||||||
|
v-model="fileList"
|
||||||
|
:limit="5"
|
||||||
|
accept="image/*"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
const fileList = ref([]);
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Props
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 默认值 | 说明 |
|
||||||
|
| ---------- | ----------------- | ------------------------------------------------- | --------------- |
|
||||||
|
| modelValue | `Array \| String` | `[]` | 绑定值,图片路径数组或单个路径 |
|
||||||
|
| ossUrl | `String` | `'http://gov-cloud.oss-cn-chengdu.aliyuncs.com/'` | 回显时拼接图片完整路径使用 |
|
||||||
|
| limit | `Number` | `5` | 最多上传几张图片 |
|
||||||
|
| accept | `String` | `'image/*'` | 允许上传的文件类型 |
|
||||||
|
| readonly | `Boolean` | `false` | 是否只读模式,不可上传删除 |
|
||||||
|
|
||||||
|
|
||||||
|
## 事件
|
||||||
|
| 事件名 | 参数 | 说明 |
|
||||||
|
|-------|------|------|
|
||||||
|
| update:modelValue | 新的文件列表值(数组或字符串) | 当文件列表发生变化时触发 |
|
||||||
|
|
||||||
|
## 插槽
|
||||||
|
该组件没有提供插槽。
|
||||||
|
|
||||||
|
### 数据适配处理
|
||||||
|
|
||||||
|
- `selectedFiles`:用于统一处理单文件和多文件场景,读时返回数组,写时根据 `limit` 决定是否回传为字符串或数组。
|
||||||
|
- `fileList`:用于 `el-upload` 的回显列表,拼接完整 URL。
|
||||||
|
- `previewList`:用于图片预览的 URL 列表。
|
||||||
|
|
||||||
|
## 样式
|
||||||
|
|
||||||
|
组件使用了Element Plus的el-upload和el-image-viewer组件,并添加了自定义样式以适应不同的布局需求。
|
||||||
|
|
||||||
|
## 依赖项
|
||||||
|
|
||||||
|
- `element-plus`
|
||||||
|
- `@element-plus/icons-vue` 中的 `Plus`
|
||||||
|
- 自定义 API:`CommonUpload`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# UrlSelect 远程下拉选择组件
|
||||||
|
|
||||||
|
该组件基于 `el-select` 和自定义 axios 请求封装,支持从指定接口拉取选项列表,并支持 label/value 字段自定义。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
- 下拉选项从远程接口加载(通过 `url` 和 `params` 指定)
|
||||||
|
- 支持自定义 label/value 字段名(`labelKey` / `valueKey`)
|
||||||
|
- 支持插槽透传(可扩展 options 或添加分组)
|
||||||
|
- 内部使用双向绑定模型 `internalValue` 实现响应式
|
||||||
|
- 默认使用 `res.data.records` 作为解析逻辑,可自定义 `responseParser`
|
||||||
|
|
||||||
|
## 使用示例
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<UrlSelect
|
||||||
|
v-model="form.industry"
|
||||||
|
url="/api/base/industries"
|
||||||
|
:params="{ enabled: true }"
|
||||||
|
label-key="name"
|
||||||
|
value-key="id"
|
||||||
|
placeholder="请选择行业"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Props 参数
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 默认值 | 说明 |
|
||||||
|
| -------------- | --------------------------- | --------------------------- | ------------------------------ |
|
||||||
|
| modelValue | `String \| Number \| Array` | `null` | 绑定的值 |
|
||||||
|
| url | `String` | `null` | 请求数据的接口地址 |
|
||||||
|
| params | `Object` | `{}` | 请求时的参数 |
|
||||||
|
| labelKey | `String` | `'label'` | 数据项中作为 label 显示的字段 |
|
||||||
|
| valueKey | `String` | `'value'` | 数据项中作为 value 的字段 |
|
||||||
|
| responseParser | `Function` | `(res) => res.data.records` | 处理响应数据的函数,需返回数组 |
|
||||||
|
|
||||||
|
## 事件说明
|
||||||
|
|
||||||
|
组件继承并透传了 `el-select` 的常用事件:
|
||||||
|
|
||||||
|
| 事件名 | 说明 |
|
||||||
|
| ------------------- | ---------------------------- |
|
||||||
|
| `update:modelValue` | v-model 绑定更新 |
|
||||||
|
| `change` | 选项变化时触发 |
|
||||||
|
| `blur` | 失焦时触发 |
|
||||||
|
| `focus` | 聚焦时触发 |
|
||||||
|
| `clear` | 点击清空按钮时触发 |
|
||||||
|
| `visible-change` | 下拉框显示/隐藏变化时触发 |
|
||||||
|
| `remove-tag` | 多选时移除 tag 触发 |
|
||||||
|
| `scroll` | 滚动触发(需设置高度才有效) |
|
||||||
|
|
||||||
|
## 核心逻辑说明
|
||||||
|
|
||||||
|
### 1. 内部绑定值
|
||||||
|
|
||||||
|
```JavaScript
|
||||||
|
const internalValue = ref(props.modelValue);
|
||||||
|
watch(() => props.modelValue, (newVal) => internalValue.value = newVal);
|
||||||
|
watch(internalValue, (newVal) => emit('update:modelValue', newVal));
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 拉取远程选项
|
||||||
|
|
||||||
|
```JavaScript
|
||||||
|
async function fetchOptions() {
|
||||||
|
if (!props.url) return;
|
||||||
|
const res = await request.get(props.url, { params: props.params });
|
||||||
|
const records = props.responseParser(res);
|
||||||
|
options.value = Array.isArray(records) ? records : [];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
组件挂载时会立即请求一次远程数据。
|
||||||
|
|
||||||
|
### 3. 插槽支持
|
||||||
|
|
||||||
|
支持透传所有 `$slots`,并提供默认的 `option` 渲染逻辑。也可通过 `option-group` 插槽实现复杂渲染。
|
||||||
|
|
||||||
|
## 依赖项
|
||||||
|
|
||||||
|
- `element-plus` 的 `el-select`、`el-option`
|
||||||
|
- 项目中的 `request` 请求封装(例如基于 axios)
|
||||||
|
|
||||||
|
## 可拓展点
|
||||||
|
|
||||||
|
- 支持分页加载远程选项(下拉滚动触发)
|
||||||
|
- 支持懒加载(点击展开时再加载)
|
||||||
|
- 支持 loading/loading-text 状态
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# AreaSelect.vue 组件文档
|
||||||
|
|
||||||
|
## 组件简介
|
||||||
|
|
||||||
|
`AreaSelect` 是一个基于 Element Plus 的级联选择组件,封装了行政区域选择功能。支持省/市/县三级联动,数据源通过接口自动获取。
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
### 1. 引入组件
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<AreaSelect v-model="areaCodeList" />
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 配置示例
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<AreaSelect
|
||||||
|
v-model="selectedArea"
|
||||||
|
:label="'所属区域:'"
|
||||||
|
:placeholder="'请选择区域'"
|
||||||
|
:emit-path="true"
|
||||||
|
:width="600"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
## Props 参数说明
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 默认值 | 说明 |
|
||||||
|
| ------------- | ----------------- | ---------------- | ------------------------------------------------------------ |
|
||||||
|
| `modelValue` | `Array | String` | `[]` | 双向绑定的值。如果 `emitPath` 为 `true`,则为数组,否则为字符串。 |
|
||||||
|
| `label` | `String` | `所属行政区域:` | 左侧 label 标签内容。 |
|
||||||
|
| `placeholder` | `String` | `请选择行政区域` | 选择框中的占位符提示文字。 |
|
||||||
|
| `width` | `Number | String` | `500` | 整体组件宽度(单位:px)。 |
|
||||||
|
| `emitPath` | `Boolean` | `true` | 是否返回完整路径的值数组。为 `false` 时只返回最后一级节点的值。 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
## Events 说明
|
||||||
|
|
||||||
|
| 事件名 | 说明 |
|
||||||
|
| ------------------- | ------------------------- |
|
||||||
|
| `update:modelValue` | 用于 `v-model` 双向绑定。 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
## 返回值说明
|
||||||
|
|
||||||
|
- 当 `emitPath = true` 时,返回一个数组,例如:
|
||||||
|
|
||||||
|
```json
|
||||||
|
['530000', '530100', '530102']
|
||||||
|
```
|
||||||
|
|
||||||
|
- 当 `emitPath = false` 时,只返回最后一级,例如:
|
||||||
|
|
||||||
|
```json
|
||||||
|
'530102'
|
||||||
|
```
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
## 接口说明
|
||||||
|
|
||||||
|
该组件内部自动发起请求:
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /system/area/region?areaCode=530000
|
||||||
|
```
|
||||||
|
|
||||||
|
接口返回行政区域数据,格式如下:
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"areaName": "云南省",
|
||||||
|
"areaCode": "530000",
|
||||||
|
"areaChildVOS": [
|
||||||
|
{
|
||||||
|
"areaName": "昆明市",
|
||||||
|
"areaCode": "530100",
|
||||||
|
"areaChildVOS": [...]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 外部不应主动更新 `modelValue`,避免造成循环依赖。
|
||||||
|
- 默认展示为“云南省”下的行政区域。
|
||||||
|
- 默认字段映射为:
|
||||||
|
- `label`: `areaName`
|
||||||
|
- `value`: `areaCode`
|
||||||
|
- `children`: `areaChildVOS`
|
Loading…
x
Reference in New Issue
Block a user