diff --git a/docs/hooks-table使用检查.md b/docs/hooks-table使用检查.md new file mode 100644 index 0000000..ca60f16 --- /dev/null +++ b/docs/hooks-table使用检查.md @@ -0,0 +1,103 @@ +# hooks/table 使用方法检查 + +## 一、useTable 源码要点(`src/hooks/table.ts`) + +### 1. 入参 `BasicTableProps` + +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `createdIsNeed` | `boolean` | **true** | 是否在 `onMounted` 时自动请求列表 | +| `isPage` | `boolean` | true | 是否分页 | +| `queryForm` | `any` | `{}` | 查询条件,会合并到请求参数 | +| `pageList` | `(...arg: any) => Promise` | - | **必填**,分页接口方法 | +| `props` | `object` | `{ item: 'records', totalCount: 'total' }` | 列表/总数的数据路径 | +| `validate` | `Function` | - | 请求前校验,不通过则不请求 | +| `onLoaded` | `Function` | - | 请求成功、写入 `dataList` 后的回调 | +| `onCascaded` | `Function` | - | 级联回调 | +| `pagination` | `Pagination` | 见源码 | 分页配置 | + +### 2. 内部逻辑 + +- **请求参数**:`query()` 调用 `state.pageList({ ...state.queryForm, current, size, descs, ascs })`。 +- **响应处理**:用 `state.props.item`、`state.props.totalCount` 从 `res.data` 取列表和总数,写入 `state.dataList`、`state.pagination.total`。 +- **首次加载**:在 **hooks 内部的 `onMounted`** 里,若 `state.createdIsNeed === true` 则执行一次 `query()`。 +- **注意**:`useTable` **不 return state**,调用方需要自己持有一份 `state`(通常用 `reactive`)并传给 `useTable(state)`,表格数据、分页、loading 都写在这份 `state` 上。 + +### 3. 返回值 + +```ts +{ + getDataList, // (refresh?: any) => void,默认重置到第 1 页再请求;getDataList(false) 不重置页码 + currentChangeHandle, // 页码变化时调用 + sizeChangeHandle, // 每页条数变化时调用 + sortChangeHandle, // 排序变化时调用(若表格支持 sortable="custom") + tableStyle, // { cellStyle, headerCellStyle } + downBlobFile // 下载文件 +} +``` + +--- + +## 二、推荐用法(与 search-form 配合) + +### 1. 定义 state 并传入 useTable + +```ts +import { BasicTableProps, useTable } from '/@/hooks/table' + +const search = reactive({ deptCode: '', realName: '', teacherNo: '' }) + +const state = reactive({ + queryForm: search, // 与 search-form 的 :model 同一对象 + pageList: fetchList, // 或自定义方法合并额外参数 + // createdIsNeed 不写则默认为 true,首屏自动请求 +}) + +const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state) +``` + +- **state 由调用方定义并传入**,不要在解构时期望 `useTable` 返回 `state`(源码未返回)。 + +### 2. 模板绑定 + +- 表格:`:data="state.dataList"`、`v-loading="state.loading"`,`tableStyle` 用于 `cell-style` / `header-cell-style`。 +- 分页:`v-bind="state.pagination"` 或分别绑定 `current`/`size`/`total`,事件用 `@current-change="currentChangeHandle"`、`@size-change="sizeChangeHandle"`。 + +### 3. 查询 / 重置 / 刷新 + +- 点击「查询」:先更新 `search`(或额外参数),再 `getDataList()`(会回到第 1 页)。 +- 重置:清空 `search`(及 ref 里的额外参数),可选 `searchFormRef?.resetFields()`,再 `getDataList()`。 +- 只刷新当前页:`getDataList(false)`。 + +### 4. 与 createdIsNeed 的关系 + +- **createdIsNeed: true(默认)**:hooks 内部 onMounted 会自动调一次 `query()`,**页面里不需要再在 onMounted 里调 getDataList()**,否则会重复请求。 +- **createdIsNeed: false**:不在挂载时请求,需要自己在合适时机(例如 onMounted 或某个条件满足后)调用 `getDataList()`。 + +--- + +## 三、professionaltitlerelation/index.vue 检查结果 + +| 检查项 | 状态 | 说明 | +|--------|------|------| +| queryForm 使用 search | ✅ | 与 search-form 的 model 一致 | +| pageList 返回结构 | ✅ | 返回 `{ data: { records, total } }`,与默认 props 一致 | +| createdIsNeed | ✅ | 未配置即默认 true,首屏由 useTable 自动请求 | +| onMounted 不重复请求 | ✅ | 仅 `loadDictData()`,未再调 getDataList | +| 表格绑定 state.dataList / state.loading | ✅ | 正确 | +| 分页绑定 state.pagination + currentChangeHandle/sizeChangeHandle | ✅ | 正确 | +| 查询 handleFilter → getDataList() | ✅ | 正确 | +| 重置 resetQuery → 清空 search + getDataList() | ✅ | 正确 | +| 删除/审核后 getDataList() | ✅ | 正确 | +| tableStyle 用于 el-table | ✅ | 正确 | + +**结论**:当前 `professionaltitlerelation/index.vue` 对 hooks/table 的使用符合上述规范,无需修改。 + +--- + +## 四、常见注意点 + +1. **不要从 useTable 解构 state**:源码未返回 state,应自己在页面里 `const state = reactive({...})` 并传给 `useTable(state)`。 +2. **文档中若写 `const { state } = useTable(state)`**:属于文档笔误,实际应使用调用方定义的 `state`。 +3. **自定义 pageList 时**:返回结构需与 `props` 一致,默认即 `res.data.records`、`res.data.total`;若后端字段不同,可同时配置 `props: { item: 'xxx', totalCount: 'yyy' }`。 +4. **需要额外请求参数时**:在 `pageList` 里对入参做合并,例如 `return await fetchList({ ...queryParams, ...params.value })`。 diff --git a/src/api/professional/professionaluser/professionalteacherstationchange.ts b/src/api/professional/professionaluser/professionalteacherstationchange.ts index b83992a..5ce62eb 100644 --- a/src/api/professional/professionaluser/professionalteacherstationchange.ts +++ b/src/api/professional/professionaluser/professionalteacherstationchange.ts @@ -81,3 +81,12 @@ export const putObj = (obj: any) => { }); }; +export const print = (id: string | number) => { + return request({ + url: `/professional/professionalteacherstationchange/print`, + method: 'get', + params: { + id: id + } + }); +}; diff --git a/src/api/recruit/recruitschoolcode.ts b/src/api/recruit/recruitschoolcode.ts deleted file mode 100644 index 1704cc0..0000000 --- a/src/api/recruit/recruitschoolcode.ts +++ /dev/null @@ -1,61 +0,0 @@ -import request from '/@/utils/request'; - -/** - * 获取列表 - * @param query - */ -export const fetchList = (query?: any) => { - return request({ - url: '/recruit/recruitschoolcode/page', - method: 'get', - params: query, - }); -}; - -/** - * 新增 - * @param obj - */ -export const addObj = (obj: any) => { - return request({ - url: '/recruit/recruitschoolcode/add', - method: 'post', - data: obj, - }); -}; - -/** - * 获取详情 - * @param id - */ -export const getObj = (id: string | number) => { - return request({ - url: `/recruit/recruitschoolcode/getById`, - method: 'get', - params:{id:id} - }); -}; - -/** - * 删除 - * @param id - */ -export const delObj = (id: string | number) => { - return request({ - url: `/recruit/recruitschoolcode/deleteById`, - method: 'post', - data:{id:id} - }); -}; - -/** - * 更新 - * @param obj - */ -export const putObj = (obj: any) => { - return request({ - url: '/recruit/recruitschoolcode/edit', - method: 'post', - data: obj, - }); -}; diff --git a/src/api/recruit/recruitstudentschool.ts b/src/api/recruit/recruitstudentschool.ts index 154970b..ebf8108 100644 --- a/src/api/recruit/recruitstudentschool.ts +++ b/src/api/recruit/recruitstudentschool.ts @@ -16,9 +16,9 @@ export const fetchList = (query?: any) => { * 列表(按组ID) * @param query */ -export const list = (query?: any) => { +export const queryByGroupId = (query?: any) => { return request({ - url: '/recruit/recruitstudentschool/listByGroupId', + url: '/recruit/recruitstudentschool/queryByGroupId', method: 'get', params: query, }); diff --git a/src/components/AuditState/index.vue b/src/components/AuditState/index.vue index 59c3404..3ec8879 100644 --- a/src/components/AuditState/index.vue +++ b/src/components/AuditState/index.vue @@ -34,7 +34,8 @@ const props = withDefaults(defineProps(), { options: () => [ { value: '1', label: '已通过', type: 'success', icon: 'fa-solid fa-circle-check' , effect:"dark" }, { value: '-2', label: '已驳回', type: 'danger', icon: 'fa-solid fa-circle-xmark', effect:"dark" }, - { value: '0', label: '待审核', type: 'warning', icon: 'fa-regular fa-clock' ,effect:"light" } + { value: '0', label: '待审核', type: 'warning', icon: 'fa-regular fa-clock' ,effect:"light" }, + { value: '10', label: '部门通过', type: 'warning', icon: 'fa-regular fa-clock' ,effect:"dark" } ], showIcon: true, emptyText: '-' diff --git a/src/dept_change.docx b/src/dept_change.docx new file mode 100644 index 0000000..699ad73 Binary files /dev/null and b/src/dept_change.docx differ diff --git a/src/router/route.ts b/src/router/route.ts index 0c53ccc..ad73dbf 100644 --- a/src/router/route.ts +++ b/src/router/route.ts @@ -58,6 +58,15 @@ export const dynamicRoutes: Array = [ isHide: true, }, }, + { + path: '/professional/professionalteacherstationchange/print', + name: 'professionalteacherstationchange.print', + component: () => import('/@/views/professional/professionalteacherstationchange/print.vue'), + meta: { + isHide: true, // 隐藏路由,不在菜单中显示 + isAuth: true // 需要认证,在 layout 中显示 + }, + }, ...dynamicRoutesFlow ]; diff --git a/src/views/professional/common/commonSmallMultiPicUpload.vue b/src/views/professional/common/commonSmallMultiPicUpload.vue index 736d8d1..678297b 100644 --- a/src/views/professional/common/commonSmallMultiPicUpload.vue +++ b/src/views/professional/common/commonSmallMultiPicUpload.vue @@ -13,9 +13,8 @@ diff --git a/src/views/professional/professionalteacheracademicrelation/index.vue b/src/views/professional/professionalteacheracademicrelation/index.vue index ff46006..6f9512d 100755 --- a/src/views/professional/professionalteacheracademicrelation/index.vue +++ b/src/views/professional/professionalteacheracademicrelation/index.vue @@ -162,20 +162,36 @@ 通过 + 部门通过 + 驳回 + 部门驳回 + { } } -// 初始化 +// 初始化:仅加载下拉字典,表格数据由 useTable(createdIsNeed 默认 true)自动请求 onMounted(async () => { await loadDictData() - getDataList() }) diff --git a/src/views/professional/professionalteachercertificaterelation/index.vue b/src/views/professional/professionalteachercertificaterelation/index.vue index 811cdce..b1d13ee 100755 --- a/src/views/professional/professionalteachercertificaterelation/index.vue +++ b/src/views/professional/professionalteachercertificaterelation/index.vue @@ -56,16 +56,16 @@
新 增 + @click="handleAdd">新 增 导出信息 @@ -123,31 +123,50 @@ diff --git a/src/views/professional/professionalteacherhonor/index.vue b/src/views/professional/professionalteacherhonor/index.vue index 131865a..9484580 100755 --- a/src/views/professional/professionalteacherhonor/index.vue +++ b/src/views/professional/professionalteacherhonor/index.vue @@ -56,10 +56,10 @@
新 增 + @click="handleAdd">新 增 + + diff --git a/src/views/professional/professionalteachertype/index.vue b/src/views/professional/professionalteachertype/index.vue index 427324f..f76fbfb 100755 --- a/src/views/professional/professionalteachertype/index.vue +++ b/src/views/professional/professionalteachertype/index.vue @@ -8,7 +8,7 @@ type="primary" icon="FolderAdd" @click="handleAdd" - v-if="permissions.professional_professionalteachertype_add">新 增 + v-auth="'professional_professionalteachertype_add'">新 增
@@ -35,14 +35,14 @@