diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index 7db25e7..21516d7 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -196,10 +196,11 @@ class ExportUserProfileSerializer(CustomModelSerializer): class UserProfileImportSerializer(CustomModelSerializer): + password = serializers.CharField(read_only=True, required=False) def save(self, **kwargs): data = super().save(**kwargs) password = hashlib.new( - "md5", str(self.initial_data.get("password", "")).encode(encoding="UTF-8") + "md5", str(self.initial_data.get("password", "admin123456")).encode(encoding="UTF-8") ).hexdigest() data.set_password(password) data.save() @@ -264,7 +265,6 @@ class UserViewSet(CustomModelViewSet): "data": {"启用": True, "禁用": False}, } }, - "password": "登录密码", "dept": {"title": "部门", "choices": {"queryset": Dept.objects.filter(status=True), "values_name": "name"}}, "role": {"title": "角色", "choices": {"queryset": Role.objects.filter(status=True), "values_name": "name"}}, } diff --git a/web/src/components/importExcel/index.vue b/web/src/components/importExcel/index.vue new file mode 100644 index 0000000..7ac6341 --- /dev/null +++ b/web/src/components/importExcel/index.vue @@ -0,0 +1,146 @@ + + + + 导入 + + + + + + + 将文件拖到此处,或 + 点击上传 + + + 提示:仅允许导入“xls”或“xlsx”格式文件! + + + + 下载导入模板 + 批量更新模板 + + + + + + + + + + + + diff --git a/web/src/utils/service.ts b/web/src/utils/service.ts index 023f268..5694dbc 100644 --- a/web/src/utils/service.ts +++ b/web/src/utils/service.ts @@ -90,6 +90,9 @@ function createService() { return dataAxios; } return dataAxios; + case 4000: + errorCreate(`${dataAxios.msg}: ${response.config.url}`); + return Promise.reject(dataAxios.msg); default: // 不是正确的 code errorCreate(`${dataAxios.msg}: ${response.config.url}`); @@ -187,3 +190,34 @@ export const request = createRequestFunction(service); // 用于模拟网络请求的实例和请求方法 export const serviceForMock = createService(); export const requestForMock = createRequestFunction(serviceForMock); + +/** + * 下载文件 + * @param url + * @param params + * @param method + * @param filename + */ +export const downloadFile = function ({url,params,method,filename = '文件导出'}:any) { + request({ + url: url, + method: method, + params: params, + responseType: 'blob' + // headers: {Accept: 'application/vnd.openxmlformats-officedocument'} + }).then((res:any) => { + const xlsxName = window.decodeURI(res.headers['content-disposition'].split('=')[1]) + const fileName = xlsxName || `${filename}.xlsx` + if (res) { + const blob = new Blob([res.data], { type: 'charset=utf-8' }) + const elink = document.createElement('a') + elink.download = fileName + elink.style.display = 'none' + elink.href = URL.createObjectURL(blob) + document.body.appendChild(elink) + elink.click() + URL.revokeObjectURL(elink.href) // 释放URL 对象0 + document.body.removeChild(elink) + } + }) +} diff --git a/web/src/views/system/user/api.ts b/web/src/views/system/user/api.ts index fb96384..84d4b68 100644 --- a/web/src/views/system/user/api.ts +++ b/web/src/views/system/user/api.ts @@ -1,4 +1,4 @@ -import { request } from '/@/utils/service'; +import { request,downloadFile } from '/@/utils/service'; import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; export const apiPrefix = '/api/system/user/'; @@ -48,3 +48,11 @@ export function DelObj(id: DelReq) { data: { id }, }); } + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/system/user/crud.tsx b/web/src/views/system/user/crud.tsx index 0887074..79de3ed 100644 --- a/web/src/views/system/user/crud.tsx +++ b/web/src/views/system/user/crud.tsx @@ -20,6 +20,10 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp return await api.AddObj(form); }; + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + } + //权限判定 const hasPermissions:any = inject('$hasPermissions'); @@ -41,6 +45,13 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp add: { show: hasPermissions('user:Create') // show:true + }, + export:{ + text:"导出",//按钮文字 + title:"导出",//鼠标停留显示的信息 + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } } } }, diff --git a/web/src/views/system/user/index.vue b/web/src/views/system/user/index.vue index 99e88e3..28c0fbf 100644 --- a/web/src/views/system/user/index.vue +++ b/web/src/views/system/user/index.vue @@ -30,10 +30,15 @@ - + + + 导入 + + + @@ -42,11 +47,9 @@ import { useExpose, useCrud } from '@fast-crud/fast-crud'; import { createCrudOptions } from './crud'; import * as api from './api'; import { ElTree } from 'element-plus'; -import { ref, onMounted, watch, toRaw, defineAsyncComponent } from 'vue'; +import { ref, onMounted, watch, toRaw } from 'vue'; import XEUtils from 'xe-utils'; -import { errorMessage, successMessage } from '../../../utils/message'; -import { GetDept } from './api'; -import { dictionary } from '/@/utils/dictionary'; +import importExcel from '/@/components/importExcel/index.vue' interface Tree { id: number;