提交 08581ef2 authored 作者: 王鹏飞's avatar 王鹏飞

refactor(admin): migrate teachers list module

上级 bcb25df1
# Teachers list migration
## Delivered
- Moved the teacher-list route to `modules/teachers/list`, retaining the existing filters, columns, permissions, drawers, modal flows, validation, role lookup, status/password/delete actions, and commission settings.
- Extracted form-encoded API calls, query construction, and list state into `api.ts`, `query.ts`, and `useTeacherList.ts`.
- Replaced only the legacy `TableCom` and `PaginationCom` list frame with controlled `AppList` pagination.
- Deleted the old `pages/teacher/query` implementation after the live module route stopped importing it.
## Verification
- `pnpm build`: passed for both learning and admin.
- `pnpm test`: admin 11/11 passed. The workspace command still fails in pre-existing learning tests, including `src/api/http-auth.test.ts`, `src/modules/my/routes.test.tsx`, and router tests missing a `QueryClientProvider`.
- `git diff --check`: passed.
## Compatibility note
The obsolete `src/routes/routes.jsx` still contains a dead legacy teacher-page declaration, but the live `app/routes.tsx` does not import that file. It is outside this migration's permitted route scope.
import { message } from 'antd'
import { get } from 'lodash-es'
import qs from 'qs'
import axios from '@/utils/request.js'
async function request(
path: string,
payload: Record<string, unknown>,
{ success = false, returnData = false }: { success?: boolean; returnData?: boolean } = {},
) {
try {
const response = await axios.post(path, qs.stringify(payload))
const code = get(response, 'data.code', 0)
const data = get(response, 'data.data', [])
const text = get(response, 'data.message', '数据获取失败!')
if (code !== 200) {
message.error(text)
return false
}
if (success) message.success(text)
return returnData ? data : true
} catch {
return false
}
}
export const getTeacherList = (payload: Record<string, unknown>) =>
request('/user/teacher/getList', payload, { returnData: true })
export const addTeacher = (payload: Record<string, unknown>) =>
request('/user/teacher/add', payload, { success: true })
export const getTeacherInfo = (payload: Record<string, unknown>) =>
request('/user/teacher/getInfoById', payload, { returnData: true })
export const editTeacher = (payload: Record<string, unknown>) =>
request('/user/teacher/edit', payload, { success: true })
export const deleteTeacher = (payload: Record<string, unknown>) =>
request('/user/teacher/del', payload, { success: true })
export const changeTeacherStatus = (payload: Record<string, unknown>) =>
request('/user/teacher/changeStatus', payload, { success: true })
export const changeTeacherPassword = (payload: Record<string, unknown>) =>
request('/user/teacher/editPass', payload, { success: true })
export const getTeacherSystem = (payload: Record<string, unknown>) =>
request('/system/config/getSystem', payload, { returnData: true })
export const updateTeacherSystem = (payload: Record<string, unknown>) =>
request('/system/config/systemEdit', payload, { success: true })
export function buildTeacherQuery({
page,
pageSize,
filters = {},
}: {
page: number
pageSize: number
filters?: Record<string, unknown>
}) {
const query: Record<string, unknown> = { page, page_size: pageSize }
Object.entries(filters).forEach(([key, value]) => {
if (value) query[key] = value
})
return query
}
import { lazy } from 'react'
import { Navigate, useRoutes } from 'react-router'
const TeacherListView = lazy(() => import('./views/TeacherListView'))
export default function TeacherListRoutes() {
return useRoutes([
{ index: true, Component: TeacherListView },
{ path: '*', element: <Navigate to="/teacher/list" /> },
])
}
import { useCallback, useEffect, useRef, useState } from 'react'
import { getTeacherList } from './api'
import { buildTeacherQuery } from './query'
export function useTeacherList() {
const [rows, setRows] = useState<any[]>([])
const [total, setTotal] = useState(0)
const [page, setPage] = useState(1)
const [pageSize, setPageSize] = useState(10)
const [loading, setLoading] = useState(true)
const [error, setError] = useState<Error | null>(null)
const requestId = useRef(0)
const init = useCallback(
async (
filters: Record<string, unknown> = {},
nextPage = page,
nextPageSize = pageSize,
) => {
const id = ++requestId.current
setLoading(true)
setError(null)
try {
const result = await getTeacherList(
buildTeacherQuery({ page: nextPage, pageSize: nextPageSize, filters }),
)
if (id === requestId.current && result) {
setRows((result as { list?: any[] }).list ?? [])
setTotal((result as { total?: number }).total ?? 0)
}
} catch (reason) {
if (id === requestId.current) {
setError(reason instanceof Error ? reason : new Error('数据获取失败!'))
}
} finally {
if (id === requestId.current) setLoading(false)
}
},
[page, pageSize],
)
useEffect(() => {
void init({}, 1, 10)
}, [])
const changePage = useCallback(
(nextPage: number, filters: Record<string, unknown>) => {
setPage(nextPage)
void init(filters, nextPage, pageSize)
},
[init, pageSize],
)
const changePageSize = useCallback(
(nextPageSize: number, filters: Record<string, unknown>) => {
setPage(1)
setPageSize(nextPageSize)
void init(filters, 1, nextPageSize)
},
[init],
)
return { rows, total, page, pageSize, loading, error, init, changePage, changePageSize }
}
...@@ -3,7 +3,7 @@ import { Navigate, useRoutes } from "react-router"; ...@@ -3,7 +3,7 @@ import { Navigate, useRoutes } from "react-router";
import ModuleBoundary from "@/app/ModuleBoundary"; import ModuleBoundary from "@/app/ModuleBoundary";
const TeachersLayout = lazy(() => import("@/pages/teacher/index")); const TeachersLayout = lazy(() => import("@/pages/teacher/index"));
const TeacherList = lazy(() => import("@/pages/teacher/query/index")); const TeacherListRoutes = lazy(() => import("./list/routes"));
export default function TeachersRoutes() { export default function TeachersRoutes() {
const routes = useRoutes([ const routes = useRoutes([
...@@ -11,7 +11,7 @@ export default function TeachersRoutes() { ...@@ -11,7 +11,7 @@ export default function TeachersRoutes() {
Component: TeachersLayout, Component: TeachersLayout,
children: [ children: [
{ index: true, element: <Navigate to="/teacher/list" /> }, { index: true, element: <Navigate to="/teacher/list" /> },
{ path: "list", Component: TeacherList }, { path: "list/*", Component: TeacherListRoutes },
], ],
}, },
{ path: "*", element: <Navigate to="/" /> }, { path: "*", element: <Navigate to="/" /> },
......
.custom-error-message {
font-size: 10px; /* 调整为合适的文字大小 */
}
import axios from "@/utils/request.js";
import qs from "qs";
import { get } from "lodash-es";
import { message } from "antd";
// 老师列表
const getTeacherList = async (obj) => {
try {
const res = await axios.post("/user/teacher/getList", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 添加老师
const addTeacher = async (obj) => {
try {
const res = await axios.post("/user/teacher/add", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 老师详情
const TeacherInfo = async (obj) => {
try {
const res = await axios.post("/user/teacher/getInfoById", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改老师
const editTeacher = async (obj) => {
try {
const res = await axios.post("/user/teacher/edit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 删除老师
const delTeacher = async (obj) => {
try {
const res = await axios.post("/user/teacher/del", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 启用
const changeStatus = async (obj) => {
try {
const res = await axios.post("/user/teacher/changeStatus", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 修改密码
const changePassword = async (obj) => {
try {
const res = await axios.post("/user/teacher/editPass", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return false;
}
};
// 获取设置信息
const getSystem = async (obj) => {
try {
const res = await axios.post("/system/config/getSystem", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
return data;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
// 修改设置
const systemEdit = async (obj) => {
try {
const res = await axios.post("/system/config/systemEdit", qs.stringify(obj));
const code = get(res, "data.code", 0);
const data = get(res, "data.data", []);
const msg = get(res, "data.message", "数据获取失败!");
if (code === 200) {
message.success(msg);
return true;
} else {
message.error(msg);
return false;
}
} catch (error) {
return error;
}
};
export {
getTeacherList,
addTeacher,
TeacherInfo,
editTeacher,
delTeacher,
changeStatus,
changePassword,
getSystem,
systemEdit,
};
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论