crud.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import { request } from './index';
  2. import $storage from '@/sheep/utils/storage';
  3. import { ElMessage } from 'element-plus';
  4. // 查看列表
  5. export const LIST = (url, data, pageInParams = true) => {
  6. // 分离分页参数和其他参数
  7. const { page, size, ...otherParams } = data;
  8. const requestConfig = {
  9. url: url + `/list`,
  10. method: 'POST',
  11. };
  12. if (pageInParams) {
  13. // 分页参数放在params中(默认行为)
  14. requestConfig.params = { page, size };
  15. requestConfig.data = otherParams;
  16. } else {
  17. // 分页参数放在data中
  18. requestConfig.data = { page, size, ...otherParams };
  19. }
  20. return request(requestConfig);
  21. };
  22. // 查看详情
  23. export const DETAIL = (url, id) =>
  24. request({
  25. url: url + `/detail`,
  26. method: 'POST',
  27. params: { id },
  28. });
  29. // 新增
  30. export const ADD = (url, data) =>
  31. request({
  32. url: url + '/add',
  33. method: 'POST',
  34. data,
  35. options: {
  36. showSuccessMessage: false,
  37. },
  38. });
  39. // 编辑&更新
  40. export const EDIT = (url, data) =>
  41. request({
  42. url: url + `/update`,
  43. method: 'POST',
  44. data,
  45. options: {
  46. showSuccessMessage: false,
  47. },
  48. });
  49. // 删除(软删除/真实删除)
  50. export const DELETE = (url, data) =>
  51. request({
  52. url: url + `/delete`,
  53. method: 'POST',
  54. params: data,
  55. options: {
  56. showSuccessMessage: true,
  57. },
  58. });
  59. // 选择
  60. export const SELECT = (url, params) =>
  61. request({
  62. url: url + '/select',
  63. method: 'GET',
  64. params,
  65. });
  66. // 回收站列表
  67. export const RECYCLE_BIN = (url, params) =>
  68. request({
  69. url: url + '/recyclebin',
  70. method: 'GET',
  71. params,
  72. });
  73. // 销毁
  74. export const DESTROY = (url, id) =>
  75. request({
  76. url: url + '/destroy/' + id,
  77. method: 'DELETE',
  78. });
  79. // 还原
  80. export const RESTORE = (url, id) =>
  81. request({
  82. url: url + '/restore/' + id,
  83. method: 'PUT',
  84. });
  85. // 通用增删改查
  86. export const CRUD = (url, methods = ['list', 'detail', 'add', 'edit', 'delete', 'export']) => {
  87. const apis = {};
  88. if (methods.includes('list'))
  89. apis.list = (params, pageInParams = true) => LIST(url, params, pageInParams);
  90. if (methods.includes('detail')) apis.detail = (id) => DETAIL(url, id);
  91. if (methods.includes('add')) apis.add = (data) => ADD(url, data);
  92. if (methods.includes('edit')) apis.edit = (id, data) => EDIT(url, id, data);
  93. if (methods.includes('delete')) apis.delete = (id) => DELETE(url, id);
  94. if (methods.includes('report')) apis.report = (params, filename) => REPORT(url, params, filename);
  95. if (methods.includes('export'))
  96. apis.export = (params, filename) => REPORT(url, params, filename, 'export');
  97. return apis;
  98. };
  99. // 通用回收站
  100. export const RECYCLE = (url) => {
  101. return {
  102. recyclebin: (params) => RECYCLE_BIN(url, params),
  103. restore: (id) => RESTORE(url, id),
  104. destroy: (id) => DESTROY(url, id),
  105. };
  106. };
  107. // 导出报表 - 需要超级管理员权限
  108. export const REPORT = async (url, params, filename = '导出数据', typeName = 'report') => {
  109. // 获取用户信息进行权限验证
  110. const userInfo = $storage.get('userInfo');
  111. // 检查用户是否为超级管理员
  112. if (!userInfo || userInfo.roleName !== '超级管理员') {
  113. ElMessage.error('只有超级管理员可以导出');
  114. return Promise.reject(new Error('权限不足:只有超级管理员可以导出'));
  115. }
  116. let response = null;
  117. try {
  118. // 发送导出请求
  119. response = await request({
  120. url: url + `/${typeName}`,
  121. method: typeName == 'report' ? 'GET' : 'POST',
  122. ...(typeName == 'report' ? { params } : { data: params }),
  123. responseType: 'blob', // 用于文件下载
  124. options: {
  125. showSuccessMessage: false,
  126. },
  127. });
  128. // 检查响应状态和内容类型
  129. if (response.status === 200 && response.headers['content-type']?.includes('excel')) {
  130. // 成功响应,处理文件下载
  131. const blob = response.data; // 从响应对象中获取 Blob 数据
  132. const downloadUrl = window.URL.createObjectURL(blob);
  133. const link = document.createElement('a');
  134. link.href = downloadUrl;
  135. link.download = `${filename}_${new Date().toISOString().slice(0, 10)}.xlsx`;
  136. document.body.appendChild(link);
  137. link.click();
  138. document.body.removeChild(link);
  139. window.URL.revokeObjectURL(downloadUrl);
  140. ElMessage.success('导出成功');
  141. return Promise.resolve();
  142. } else {
  143. // 如果不是成功的文件响应,说明返回的是错误信息
  144. let errorData;
  145. try {
  146. // 尝试解析 Blob 中的 JSON 错误信息
  147. const text = await response.data.text();
  148. errorData = JSON.parse(text);
  149. } catch (parseError) {
  150. // 如果解析失败,使用默认错误信息
  151. errorData = { code: '500', message: '导出失败' };
  152. }
  153. // 检查返回的 code
  154. // if (errorData.code !== '200') {
  155. // const errorMessage = errorData.message || '导出失败';
  156. // ElMessage.error(errorMessage);
  157. // return Promise.reject(new Error(errorMessage));
  158. // }
  159. }
  160. } catch (error) {
  161. console.error('导出失败:', error);
  162. // 如果是网络错误或其他异常
  163. if (error.response) {
  164. // 有响应但状态码不是 2xx
  165. const errorMessage = error.response.data?.message || '服务器错误';
  166. ElMessage.error(errorMessage);
  167. } else if (error.message?.includes('权限不足')) {
  168. // 权限错误已经在上面处理了,不需要重复提示
  169. } else {
  170. // 其他错误
  171. ElMessage.error('导出失败,请稍后重试');
  172. }
  173. return Promise.reject(error);
  174. }
  175. };
  176. // add, list, delete, edit, detail, select, recyclebin, restore, destroy, report