|
@@ -1,258 +1,280 @@
|
|
|
-/**
|
|
|
- * 商品分类 Mock 处理器
|
|
|
- */
|
|
|
-import { http, HttpResponse } from 'msw';
|
|
|
-
|
|
|
-// 生成分类数据
|
|
|
-const generateCategories = (count = 20) => {
|
|
|
- const categories = [];
|
|
|
- const categoryNames = [
|
|
|
- '电子产品',
|
|
|
- '服装鞋帽',
|
|
|
- '家居用品',
|
|
|
- '美妆护肤',
|
|
|
- '食品饮料',
|
|
|
- '运动户外',
|
|
|
- '图书音像',
|
|
|
- '母婴用品',
|
|
|
- '汽车用品',
|
|
|
- '办公用品',
|
|
|
- '珠宝首饰',
|
|
|
- '手机数码',
|
|
|
- '家用电器',
|
|
|
- '箱包皮具',
|
|
|
- '玩具乐器',
|
|
|
- '医疗保健',
|
|
|
- '五金工具',
|
|
|
- '建材装修',
|
|
|
- '农资园艺',
|
|
|
- '宠物用品',
|
|
|
- ];
|
|
|
-
|
|
|
- for (let i = 1; i <= count; i++) {
|
|
|
- const createTime = new Date(Date.now() - Math.random() * 365 * 24 * 60 * 60 * 1000);
|
|
|
- const updateTime = new Date(createTime.getTime() + Math.random() * 30 * 24 * 60 * 60 * 1000);
|
|
|
-
|
|
|
- categories.push({
|
|
|
- id: i,
|
|
|
- title: categoryNames[i - 1] || `分类${i}`,
|
|
|
- sort: Math.floor(Math.random() * 100),
|
|
|
- status: Math.random() > 0.2 ? 1 : 0, // 80% 启用
|
|
|
- create_time: createTime.toISOString().slice(0, 19).replace('T', ' '),
|
|
|
- update_time: updateTime.toISOString().slice(0, 19).replace('T', ' '),
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- return categories.sort((a, b) => b.id - a.id); // 按ID倒序
|
|
|
-};
|
|
|
-
|
|
|
-// 模拟数据
|
|
|
-let mockCategories = generateCategories(20);
|
|
|
-
|
|
|
-// 分页函数
|
|
|
-const paginate = (data, page = 1, perPage = 10) => {
|
|
|
- const start = (page - 1) * perPage;
|
|
|
- const end = start + perPage;
|
|
|
- const paginatedData = data.slice(start, end);
|
|
|
-
|
|
|
- return {
|
|
|
- data: paginatedData,
|
|
|
- current_page: page,
|
|
|
- per_page: perPage,
|
|
|
- total: data.length,
|
|
|
- last_page: Math.ceil(data.length / perPage),
|
|
|
- };
|
|
|
-};
|
|
|
-
|
|
|
-// 搜索过滤函数
|
|
|
-const filterCategories = (categories, searchParams) => {
|
|
|
- let filtered = [...categories];
|
|
|
-
|
|
|
- // 按名称搜索
|
|
|
- if (searchParams.name) {
|
|
|
- filtered = filtered.filter((item) =>
|
|
|
- item.title.toLowerCase().includes(searchParams.name.toLowerCase()),
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- return filtered;
|
|
|
-};
|
|
|
-
|
|
|
-// 排序函数
|
|
|
-const sortCategories = (categories, sort, order) => {
|
|
|
- if (!sort) return categories;
|
|
|
-
|
|
|
- return [...categories].sort((a, b) => {
|
|
|
- let aVal = a[sort];
|
|
|
- let bVal = b[sort];
|
|
|
-
|
|
|
- // 处理数字类型
|
|
|
- if (sort === 'id' || sort === 'sort') {
|
|
|
- aVal = Number(aVal);
|
|
|
- bVal = Number(bVal);
|
|
|
- }
|
|
|
-
|
|
|
- if (order === 'asc') {
|
|
|
- return aVal > bVal ? 1 : -1;
|
|
|
- } else {
|
|
|
- return aVal < bVal ? 1 : -1;
|
|
|
- }
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
-export const categoryHandlers = [
|
|
|
- // 获取分类列表
|
|
|
- http.get('https://shop.trust-will.com/shop/admin/category_tag', ({ request }) => {
|
|
|
- const url = new URL(request.url);
|
|
|
- const page = parseInt(url.searchParams.get('page') || '1');
|
|
|
- const list_rows = parseInt(url.searchParams.get('list_rows') || '10');
|
|
|
- const sort = url.searchParams.get('sort') || 'id';
|
|
|
- const order = url.searchParams.get('order') || 'desc';
|
|
|
- const name = url.searchParams.get('name') || '';
|
|
|
-
|
|
|
- // 搜索过滤
|
|
|
- let filtered = filterCategories(mockCategories, { name });
|
|
|
-
|
|
|
- // 排序
|
|
|
- filtered = sortCategories(filtered, sort, order);
|
|
|
-
|
|
|
- // 分页
|
|
|
- const result = paginate(filtered, page, list_rows);
|
|
|
-
|
|
|
- return HttpResponse.json({
|
|
|
- error: 0,
|
|
|
- msg: 'success',
|
|
|
- data: result,
|
|
|
- });
|
|
|
- }),
|
|
|
-
|
|
|
- // 获取分类详情
|
|
|
- http.get('https://shop.trust-will.com/shop/admin/category_tag/:id', ({ params }) => {
|
|
|
- const { id } = params;
|
|
|
- const category = mockCategories.find((item) => item.id == id);
|
|
|
-
|
|
|
- if (category) {
|
|
|
- return HttpResponse.json({
|
|
|
- error: 0,
|
|
|
- msg: 'success',
|
|
|
- data: category,
|
|
|
- });
|
|
|
- } else {
|
|
|
- return HttpResponse.json({
|
|
|
- error: 1,
|
|
|
- msg: '分类不存在',
|
|
|
- data: null,
|
|
|
- });
|
|
|
- }
|
|
|
- }),
|
|
|
-
|
|
|
- // 新增分类
|
|
|
- http.post('https://shop.trust-will.com/shop/admin/category_tag', async ({ request }) => {
|
|
|
- const body = await request.json();
|
|
|
- const { title, sort = 0 } = body;
|
|
|
-
|
|
|
- if (!title) {
|
|
|
- return HttpResponse.json({
|
|
|
- error: 1,
|
|
|
- msg: '分类名称不能为空',
|
|
|
- data: null,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- const newId = Math.max(...mockCategories.map((item) => item.id)) + 1;
|
|
|
- const now = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
|
-
|
|
|
- const newCategory = {
|
|
|
- id: newId,
|
|
|
- title,
|
|
|
- sort: parseInt(sort),
|
|
|
- status: 1,
|
|
|
- create_time: now,
|
|
|
- update_time: now,
|
|
|
- };
|
|
|
-
|
|
|
- mockCategories.unshift(newCategory);
|
|
|
-
|
|
|
- return HttpResponse.json({
|
|
|
- error: 0,
|
|
|
- msg: '添加成功',
|
|
|
- data: newCategory,
|
|
|
- });
|
|
|
- }),
|
|
|
-
|
|
|
- // 编辑分类
|
|
|
- http.put(
|
|
|
- 'https://shop.trust-will.com/shop/admin/category_tag/:id',
|
|
|
- async ({ params, request }) => {
|
|
|
- const { id } = params;
|
|
|
- const body = await request.json();
|
|
|
- const { title, sort } = body;
|
|
|
-
|
|
|
- const index = mockCategories.findIndex((item) => item.id == id);
|
|
|
-
|
|
|
- if (index === -1) {
|
|
|
- return HttpResponse.json({
|
|
|
- error: 1,
|
|
|
- msg: '分类不存在',
|
|
|
- data: null,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- if (!title) {
|
|
|
- return HttpResponse.json({
|
|
|
- error: 1,
|
|
|
- msg: '分类名称不能为空',
|
|
|
- data: null,
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- const now = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
|
-
|
|
|
- mockCategories[index] = {
|
|
|
- ...mockCategories[index],
|
|
|
- title,
|
|
|
- sort: parseInt(sort || 0),
|
|
|
- update_time: now,
|
|
|
- };
|
|
|
-
|
|
|
- return HttpResponse.json({
|
|
|
- error: 0,
|
|
|
- msg: '更新成功',
|
|
|
- data: mockCategories[index],
|
|
|
- });
|
|
|
- },
|
|
|
- ),
|
|
|
-
|
|
|
- // 删除分类
|
|
|
- http.delete('https://shop.trust-will.com/shop/admin/category_tag/:id', ({ params }) => {
|
|
|
- const { id } = params;
|
|
|
- const ids = id.split(',').map((item) => parseInt(item));
|
|
|
-
|
|
|
- // 批量删除
|
|
|
- mockCategories = mockCategories.filter((item) => !ids.includes(item.id));
|
|
|
-
|
|
|
- return HttpResponse.json({
|
|
|
- error: 0,
|
|
|
- msg: '删除成功',
|
|
|
- data: null,
|
|
|
- });
|
|
|
- }),
|
|
|
-
|
|
|
- // 获取分类选择列表(用于其他模块选择分类)
|
|
|
- http.get('https://shop.trust-will.com/shop/admin/category_tag/select', () => {
|
|
|
- const selectData = mockCategories
|
|
|
- .filter((item) => item.status === 1)
|
|
|
- .map((item) => ({
|
|
|
- value: item.id,
|
|
|
- label: item.title,
|
|
|
- sort: item.sort,
|
|
|
- }))
|
|
|
- .sort((a, b) => a.sort - b.sort);
|
|
|
-
|
|
|
- return HttpResponse.json({
|
|
|
- error: 0,
|
|
|
- msg: 'success',
|
|
|
- data: selectData,
|
|
|
- });
|
|
|
- }),
|
|
|
-];
|
|
|
+// /**
|
|
|
+// * 商品分类 Mock 处理器
|
|
|
+// */
|
|
|
+// import { http, HttpResponse } from 'msw';
|
|
|
+
|
|
|
+// // 生成分类数据
|
|
|
+// const generateCategories = (count = 20) => {
|
|
|
+// const categories = [];
|
|
|
+// const categoryNames = [
|
|
|
+// '电子产品',
|
|
|
+// '服装鞋帽',
|
|
|
+// '家居用品',
|
|
|
+// '美妆护肤',
|
|
|
+// '食品饮料',
|
|
|
+// '运动户外',
|
|
|
+// '图书音像',
|
|
|
+// '母婴用品',
|
|
|
+// '汽车用品',
|
|
|
+// '办公用品',
|
|
|
+// '珠宝首饰',
|
|
|
+// '手机数码',
|
|
|
+// '家用电器',
|
|
|
+// '箱包皮具',
|
|
|
+// '玩具乐器',
|
|
|
+// '医疗保健',
|
|
|
+// '五金工具',
|
|
|
+// '建材装修',
|
|
|
+// '农资园艺',
|
|
|
+// '宠物用品',
|
|
|
+// ];
|
|
|
+
|
|
|
+// for (let i = 1; i <= count; i++) {
|
|
|
+// const createTime = new Date(Date.now() - Math.random() * 365 * 24 * 60 * 60 * 1000);
|
|
|
+// const updateTime = new Date(createTime.getTime() + Math.random() * 30 * 24 * 60 * 60 * 1000);
|
|
|
+
|
|
|
+// categories.push({
|
|
|
+// id: i,
|
|
|
+// title: categoryNames[i - 1] || `分类${i}`,
|
|
|
+// sort: Math.floor(Math.random() * 100),
|
|
|
+// status: Math.random() > 0.2 ? 1 : 0, // 80% 启用
|
|
|
+// create_time: createTime.toISOString().slice(0, 19).replace('T', ' '),
|
|
|
+// update_time: updateTime.toISOString().slice(0, 19).replace('T', ' '),
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// return categories.sort((a, b) => b.id - a.id); // 按ID倒序
|
|
|
+// };
|
|
|
+
|
|
|
+// // 模拟数据
|
|
|
+// let mockCategories = generateCategories(20);
|
|
|
+
|
|
|
+// // 分页函数
|
|
|
+// const paginate = (data, page = 1, perPage = 10) => {
|
|
|
+// const start = (page - 1) * perPage;
|
|
|
+// const end = start + perPage;
|
|
|
+// const paginatedData = data.slice(start, end);
|
|
|
+
|
|
|
+// return {
|
|
|
+// data: paginatedData,
|
|
|
+// current_page: page,
|
|
|
+// per_page: perPage,
|
|
|
+// total: data.length,
|
|
|
+// last_page: Math.ceil(data.length / perPage),
|
|
|
+// };
|
|
|
+// };
|
|
|
+
|
|
|
+// // 搜索过滤函数
|
|
|
+// const filterCategories = (categories, searchParams) => {
|
|
|
+// let filtered = [...categories];
|
|
|
+
|
|
|
+// // 按名称搜索
|
|
|
+// if (searchParams.name) {
|
|
|
+// filtered = filtered.filter((item) =>
|
|
|
+// item.title.toLowerCase().includes(searchParams.name.toLowerCase()),
|
|
|
+// );
|
|
|
+// }
|
|
|
+
|
|
|
+// return filtered;
|
|
|
+// };
|
|
|
+
|
|
|
+// // 排序函数
|
|
|
+// const sortCategories = (categories, sort, order) => {
|
|
|
+// if (!sort) return categories;
|
|
|
+
|
|
|
+// return [...categories].sort((a, b) => {
|
|
|
+// let aVal = a[sort];
|
|
|
+// let bVal = b[sort];
|
|
|
+
|
|
|
+// // 处理数字类型
|
|
|
+// if (sort === 'id' || sort === 'sort') {
|
|
|
+// aVal = Number(aVal);
|
|
|
+// bVal = Number(bVal);
|
|
|
+// }
|
|
|
+
|
|
|
+// if (order === 'asc') {
|
|
|
+// return aVal > bVal ? 1 : -1;
|
|
|
+// } else {
|
|
|
+// return aVal < bVal ? 1 : -1;
|
|
|
+// }
|
|
|
+// });
|
|
|
+// };
|
|
|
+
|
|
|
+// export const categoryHandlers = [
|
|
|
+// // 获取分类列表
|
|
|
+// http.post('*/category/list', async ({ request }) => {
|
|
|
+// const data = await request.json();
|
|
|
+// const { page = 1, size = 10, sort = 'id', order = 'desc', name = '' } = data;
|
|
|
+
|
|
|
+// // 搜索过滤
|
|
|
+// let filtered = filterCategories(mockCategories, { name });
|
|
|
+
|
|
|
+// // 排序
|
|
|
+// filtered = sortCategories(filtered, sort, order);
|
|
|
+
|
|
|
+// // 分页处理
|
|
|
+// const total = filtered.length;
|
|
|
+// const startIndex = (page - 1) * size;
|
|
|
+// const endIndex = startIndex + size;
|
|
|
+// const list = filtered.slice(startIndex, endIndex);
|
|
|
+
|
|
|
+// return HttpResponse.json({
|
|
|
+// code: '200',
|
|
|
+// message: '操作成功',
|
|
|
+// data: {
|
|
|
+// list: list,
|
|
|
+// total: total,
|
|
|
+// pageNum: page,
|
|
|
+// pageSize: size,
|
|
|
+// pages: Math.ceil(total / size),
|
|
|
+// size: list.length,
|
|
|
+// startRow: startIndex + 1,
|
|
|
+// endRow: startIndex + list.length,
|
|
|
+// hasNextPage: page < Math.ceil(total / size),
|
|
|
+// hasPreviousPage: page > 1,
|
|
|
+// isFirstPage: page === 1,
|
|
|
+// isLastPage: page >= Math.ceil(total / size),
|
|
|
+// firstPage: 1,
|
|
|
+// lastPage: Math.ceil(total / size),
|
|
|
+// navigatePages: 8,
|
|
|
+// navigatepageNums: [],
|
|
|
+// navigateFirstPage: 1,
|
|
|
+// navigateLastPage: Math.ceil(total / size),
|
|
|
+// nextPage: page < Math.ceil(total / size) ? page + 1 : 0,
|
|
|
+// prePage: page > 1 ? page - 1 : 0,
|
|
|
+// },
|
|
|
+// });
|
|
|
+// }),
|
|
|
+
|
|
|
+// // 获取分类详情
|
|
|
+// http.post('*/category/detail', async ({ request }) => {
|
|
|
+// const data = await request.json();
|
|
|
+// const { id } = data;
|
|
|
+// const category = mockCategories.find((item) => item.id == id);
|
|
|
+
|
|
|
+// if (category) {
|
|
|
+// return HttpResponse.json({
|
|
|
+// code: '200',
|
|
|
+// message: '操作成功',
|
|
|
+// data: category,
|
|
|
+// });
|
|
|
+// } else {
|
|
|
+// return HttpResponse.json({
|
|
|
+// code: '500',
|
|
|
+// message: '分类不存在',
|
|
|
+// data: null,
|
|
|
+// });
|
|
|
+// }
|
|
|
+// }),
|
|
|
+
|
|
|
+// // 新增分类
|
|
|
+// http.post('*/category/add', async ({ request }) => {
|
|
|
+// const body = await request.json();
|
|
|
+// const { title, sort = 0 } = body;
|
|
|
+
|
|
|
+// if (!title) {
|
|
|
+// return HttpResponse.json({
|
|
|
+// code: '500',
|
|
|
+// message: '分类名称不能为空',
|
|
|
+// data: null,
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// const newId = Math.max(...mockCategories.map((item) => item.id)) + 1;
|
|
|
+// const now = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
|
+
|
|
|
+// const newCategory = {
|
|
|
+// id: newId,
|
|
|
+// title,
|
|
|
+// sort: parseInt(sort),
|
|
|
+// status: 1,
|
|
|
+// create_time: now,
|
|
|
+// update_time: now,
|
|
|
+// };
|
|
|
+
|
|
|
+// mockCategories.unshift(newCategory);
|
|
|
+
|
|
|
+// return HttpResponse.json({
|
|
|
+// code: '200',
|
|
|
+// message: '添加成功',
|
|
|
+// data: newCategory,
|
|
|
+// });
|
|
|
+// }),
|
|
|
+
|
|
|
+// // 编辑分类
|
|
|
+// http.put(
|
|
|
+// 'https://shop.trust-will.com/shop/admin/category_tag/:id',
|
|
|
+// async ({ params, request }) => {
|
|
|
+// const { id } = params;
|
|
|
+// const body = await request.json();
|
|
|
+// const { title, sort } = body;
|
|
|
+
|
|
|
+// const index = mockCategories.findIndex((item) => item.id == id);
|
|
|
+
|
|
|
+// if (index === -1) {
|
|
|
+// return HttpResponse.json({
|
|
|
+// error: 1,
|
|
|
+// msg: '分类不存在',
|
|
|
+// data: null,
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// if (!title) {
|
|
|
+// return HttpResponse.json({
|
|
|
+// error: 1,
|
|
|
+// msg: '分类名称不能为空',
|
|
|
+// data: null,
|
|
|
+// });
|
|
|
+// }
|
|
|
+
|
|
|
+// const now = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
|
+
|
|
|
+// mockCategories[index] = {
|
|
|
+// ...mockCategories[index],
|
|
|
+// title,
|
|
|
+// sort: parseInt(sort || 0),
|
|
|
+// update_time: now,
|
|
|
+// };
|
|
|
+
|
|
|
+// return HttpResponse.json({
|
|
|
+// error: 0,
|
|
|
+// msg: '更新成功',
|
|
|
+// data: mockCategories[index],
|
|
|
+// });
|
|
|
+// },
|
|
|
+// ),
|
|
|
+
|
|
|
+// // 删除分类
|
|
|
+// http.delete('https://shop.trust-will.com/shop/admin/category_tag/:id', ({ params }) => {
|
|
|
+// const { id } = params;
|
|
|
+// const ids = id.split(',').map((item) => parseInt(item));
|
|
|
+
|
|
|
+// // 批量删除
|
|
|
+// mockCategories = mockCategories.filter((item) => !ids.includes(item.id));
|
|
|
+
|
|
|
+// return HttpResponse.json({
|
|
|
+// error: 0,
|
|
|
+// msg: '删除成功',
|
|
|
+// data: null,
|
|
|
+// });
|
|
|
+// }),
|
|
|
+
|
|
|
+// // 获取分类选择列表(用于其他模块选择分类)
|
|
|
+// http.get('https://shop.trust-will.com/shop/admin/category_tag/select', () => {
|
|
|
+// const selectData = mockCategories
|
|
|
+// .filter((item) => item.status === 1)
|
|
|
+// .map((item) => ({
|
|
|
+// value: item.id,
|
|
|
+// label: item.title,
|
|
|
+// sort: item.sort,
|
|
|
+// }))
|
|
|
+// .sort((a, b) => a.sort - b.sort);
|
|
|
+
|
|
|
+// return HttpResponse.json({
|
|
|
+// error: 0,
|
|
|
+// msg: 'success',
|
|
|
+// data: selectData,
|
|
|
+// });
|
|
|
+// }),
|
|
|
+// ];
|
|
|
+export const categoryHandlers = [];
|